資料庫 - 資料查詢

Simon.Wang發表於2015-05-05

資料查詢

語句格式
       SELECT [ALL|DISTINCT] <目標列表示式>
                                                [,<目標列表示式>] …
FROM <表名或檢視名>[, <表名或檢視名> ] …
[ WHERE <條件表示式> ]
[ GROUP BY <列名1> [ HAVING <條件表示式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];

選擇表中的若干列

查詢指定列
    [例1]  查詢全體學生的學號與姓名。
        SELECT Sno,Sname
        FROM Student; 

    [例2]  查詢全體學生的姓名、學號、所在系。
        SELECT Sname,Sno,Sdept
        FROM Student;

全部查詢列

選出所有屬性列:
在SELECT關鍵字後面列出所有列名 
將<目標列表示式>指定為 *

[例3]  查詢全體學生的詳細記錄。
SELECT  Sno,Sname,Ssex,Sage,Sdept 
FROM Student; 
   或
SELECT  *
FROM Student; 

查詢經過計算的值

[例4]  查全體學生的姓名及其出生年份。
SELECT Sname,2004-Sage    /*假定當年的年份為2004年*/
FROM Student;
使用列別名改變查詢結果的列標題:

     SELECT Sname NAME,'Year of Birth: ’  BIRTH,
       2000-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
    FROM Student;

比較大小

例7]  查詢電腦科學系全體學生的名單。
    SELECT Sname
    FROM Student
    WHERE Sdept=‘CS’; 
[例8]  查詢所有年齡在20歲以下的學生姓名及其年齡。
     SELECT Sname,Sage 
FROM    Student    
WHERE Sage < 20;
[例9]  查詢考試成績有不及格的學生的學號。
    SELECT DISTINCT Sno
    FROM  SC
    WHERE Grade<60

確定範圍

謂詞:   BETWEEN …  ANDNOT BETWEEN  …  AND  …
[例10] 查詢年齡在20~23歲(包括20歲和23歲)之間的學生的
             姓名、系別和年齡
      SELECT Sname,Sdept,Sage
FROM     Student
WHERE   Sage BETWEEN 20 AND 23; 
[例11]  查詢年齡不在20~23歲之間的學生姓名、系別和年齡
           SELECT Sname,Sdept,Sage
           FROM    Student
           WHERE Sage NOT BETWEEN 20 AND 23

確定集合

謂詞:IN <值表>,  NOT IN <值表>          
[例12]查詢資訊系(IS)、數學系(MA)和電腦科學系(CS)學生的姓名和性別。
    SELECT Sname,Ssex
    FROM  Student
    WHERE Sdept IN ( 'IS''MA''CS' );
[例13]查詢既不是資訊系、數學系,也不是電腦科學系的學生的姓名和性別。
SELECT Sname,Ssex
FROM Student
     WHERE Sdept NOT IN ( 'IS''MA''CS' );

字元匹配

謂詞: [NOT] LIKE  ‘<匹配串>’  [ESCAPE ‘ <換碼字元>’]
匹配串為固定字串
[例14]  查詢學號為200215121的學生的詳細情況。
     SELECT *    
     FROM  Student  
     WHERE  Sno LIKE200215121';
等價於: 
      SELECT  * 
      FROM  Student 
      WHERE Sno = ' 200215121 ';
 2) 匹配串為含萬用字元的字串
[例15]  查詢所有姓劉學生的姓名、學號和性別。
      SELECT Sname,Sno,Ssex
      FROM Student
      WHERE  Sname LIKE ‘劉%’;

[例16]  查詢姓"歐陽"且全名為三個漢字的學生的姓名。
      SELECT Sname
      FROM   Student
      WHERE  Sname LIKE '歐陽__';
[例17]  查詢名字中第2個字為"陽"字的學生的姓名和學號。
      SELECT Sname,Sno
      FROM Student
      WHERE Sname LIKE ‘__陽%’;

[例18]  查詢所有不姓劉的學生姓名。
      SELECT Sname,Sno,Ssex
      FROM Student
      WHERE Sname NOT LIKE '劉%';
3) 使用換碼字元將萬用字元轉義為普通字元

 [例19]  查詢DB_Design課程的課程號和學分。
      SELECT Cno,Ccredit
      FROM Course
      WHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;

[例20]  查詢以"DB_"開頭,且倒數第3個字元為 i的課程的詳細情況。
      SELECT  *
      FROM   Course
      WHERE  Cname LIKE  'DB\_%i_ _' ESCAPE ' \ ‘;

 ESCAPE '\' 表示“ \” 為換碼字元 

涉及空值的查詢

謂詞: IS NULL 或 IS NOT NULL
 “IS” 不能用 “=” 代替
      [例21]  某些學生選修課程後沒有參加考試,所以有選課記錄,但沒 
      有考試成績。查詢缺少成績的學生的學號和相應的課程號。
     SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NULL
[例22]  查所有有成績的學生學號和課程號。
      SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NOT NULL;

多重條件查詢

邏輯運算子:AND和 OR來聯結多個查詢條件
AND的優先順序高於OR
可以用括號改變優先順序
可用來實現多種其他謂詞
[NOT] IN
[NOT] BETWEEN … AND …

[例23]  查詢計算機系年齡在20歲以下的學生姓名。
     SELECT Sname
       FROM  Student
       WHERE Sdept= 'CS' AND Sage<20
改寫[例12]
[例12]  查詢資訊系(IS)、數學系(MA)和電腦科學系(CS)學生的姓名和性別。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS''MA''CS' )
可改寫為:
SELECT Sname,Ssex
FROM   Student
WHERE  Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS '

ORDER BY子句

ORDER BY子句
可以按一個或多個屬性列排序
升序:ASC;降序:DESC;預設值為升序
當排序列含空值時
ASC:排序列為空值的元組最後顯示
DESC:排序列為空值的元組最先顯示 
[例24]  查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。
        SELECT Sno,Grade
        FROM  SC
        WHERE  Cno= ' 3 '
        ORDER BY Grade DESC;
[例25]  查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
        SELECT  *
        FROM  Student
        ORDER BY Sdept,Sage DESC

聚集函式

聚集函式:
計數
COUNT[DISTINCT|ALL] *)
COUNT[DISTINCT|ALL] <列名>)
計算總和
SUM[DISTINCT|ALL] <列名>)    
 計算平均值
AVG[DISTINCT|ALL] <列名>)
最大最小值
     MAX[DISTINCT|ALL] <列名>)
     MIN[DISTINCT|ALL] <列名>)
 [例26]  查詢學生總人數。
    SELECT COUNT(*)
    FROM  Student; 
     [例27]  查詢選修了課程的學生人數。
     SELECT COUNT(DISTINCT Sno)
     FROM SC;
     [例28]  計算1號課程的學生平均成績。
          SELECT AVG(Grade)
          FROM SC
          WHERE Cno= ' 1 '
 [例29]  查詢選修1號課程的學生最高分數。
   SELECT MAX(Grade)
   FROM SC
   WHER Cno= ‘ 1 ’;

 [例30]查詢學生200215012選修課程的總學分數。
              SELECT SUM(Ccredit)
             FROM  SC, Course
             WHER Sno='200215012' AND SC.Cno=Course.Cno; 

GROUP BY

GROUP BY子句分組:
細化聚集函式的作用物件
未對查詢結果分組,聚集函式將作用於整個查詢結果
對查詢結果分組後,聚集函式將分別作用於每個組
作用物件是查詢的中間結果表
按指定的一列或多列值分組,值相等的為一組

[例31]  求各個課程號及相應的選課人數。
     SELECT Cno,COUNT(Sno)
     FROM    SC
     GROUP BY Cno; 
[例32]  查詢選修了3門以上課程的學生學號。
     SELECT Sno
     FROM  SC
     GROUP BY Sno
     HAVING  COUNT(*) >3

HAVING短語與WHERE子句的區別:
作用物件不同
WHERE子句作用於基表或檢視,從中選擇滿足條件的元組
HAVING短語作用於組,從中選擇滿足條件的組。

相關文章