官术网_书友最值得收藏!

4.5 簡單的SQL查詢語言

SQL查詢語句的格式如下:

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

查詢語句可以分為SELECT子句、FROM子句、WHERE子句、GROUP BY子句和ORDER BY子句。

SELECT子句指明需要查詢的項目,一般是列名,也可以是表達式。利用表達式,可以查詢表中并未存儲但可以導出的結果。FROM子句指明被查詢的表或視圖名。如果需要,也可以為表和視圖取一別名,這種別名只在本句中有效。SELECT子句和FROM子句是每個SQL查詢語句所必需的,其他子句是任選的。WHERE子句說明查詢的條件。GROUP BY子句用來將結果分組。ORDER BY子句將結果排序。

查詢語句可以完成簡單的單表查詢,也可以完成復雜的多表查詢和嵌套查詢。本節(jié)主要介紹在最常用的查詢中各個子句如何使用。在下一節(jié)會介紹比較復雜的聯(lián)合查詢。

為了便于舉例,在這里先給出后面例子中用到的表。假設數據庫中有三個表:STUDENTS表、COURSE表和SC(學生選課)表,分別如表4-3、表4-4、表4-5所示。

表4-3 STUDENTS表

表4-4 COURSE表

表4-5 SC表(學生選課表)

★ 注意 ★

“ ?”表示該元組的該字段為空。

4.5.1 SELECT子句和FROM子句

SELECT子句指明需要查詢的項目,FROM子句指明被查詢的表或視圖名。SELECT子句和FROM子句可以構成最基本的查詢語句。例如,需要查詢全體學生的學號和系別,SQL查詢語句如下:

    SELECT SNO,SDEPT FROM STUDENTS;

若要查詢表的全部列,則可以將<目標列表達式>指定為*。例如要查詢課程的詳細記錄,SQL查詢語句如下:

    SELECT * FROM COURSE;

前面提到過,SELECT子句后面的<目標列表達式>可以是列名,也可以是表達式,例如查詢學生的姓名和出生年份。假設今天是2005年,那么由SAGE字段值就可以得到出生年份。SQL語句如下:

    SELECT SNAME,2005-SAGE FROM STUDENTS;

可以看到第二個<目標列表達式>就是一個計算表達式。

在SELECT子句中有DISTINCT選項,在使用查詢語句時,滿足條件的結果可能不止一個,如果加了DISTINCT選項,則要求消除查詢結果中的重復項。例如,查詢選課表中的課程號,不要重復字段,SQL語句如下:

    SELECT DISTINCT CNO FROM SC;

結果如下表4-6所示。

表4-6 查詢結果表

如果沒有指定DISTINCT選型,則默認為ALL選項,就會保留所有結果。

4.5.2 WHERE子句定義查詢條件

前面的例子都是查詢表中所有行的數據,只是對列進行了查詢,也就是投影操作,而更普遍的應用是使用WHERE子句定義查詢條件,在投影操作的同時也進行元組的選擇。

WHERE子句后面加條件表達式。常用的查詢條件如表4-7所示。

表4-7 常用的查詢條件

下面分別介紹各類查詢符號的用法。

1.比較

SQL語言中的比較符號和數學中的比較符號是統(tǒng)一的,這也是SQL語言易懂易學的原因。表4-7的第一行給出了所有比較符號,其中NOT加上比較運算符表示對條件求非。

例如需要查詢STUDENTS表中,年齡大于20歲的學生的姓名和系別,SQL語句如下:

    SELECT SNAME,SDEPT FROM STUDENTS WHERE SAGE>20;

2.確定范圍

BETWEEN條件可表示為E [NOT] BETWEEN E1 AND E2,其語義可以用比較符號表示為[NOT](E>=E1 AND E<=E2)。其中AND是多重條件符號。

例如查詢學生選課表(SC)中,成績在80分到90分之間(包括80和90分)的學生的學號和成績。SQL語句如下:

    SELECT SNO,GRADE FROM SC WHERE GRADE BETWEEN 80 AND 90;

3.確定集合

IN條件可以表示為E [NOT] IN(V1,V2,…,Vn),其語義相當于[NOT] (E=V1 OR E=V2 OR…OR E=Vn),也就是說查找屬性值屬于指定集合(V1,V2,…,Vn)的元組。

例如查詢學生表中數學系和英語系學生的姓名和系別,SQL語句可以如下表達:

    SELECT SNAME,SDEPT FROM STUDENTS WHERE SDEPT IN('English','Maths');

4.字符匹配

LIKE條件用于字符串的比較,在比較時,引用了兩個具有特殊意義的通配符:下畫線“_”和百分號“%”。

● 下畫線“_”表示任意單字符;

● 百分號“%”表示包括長為零的任意長的字符串。

LIKE條件可以表示為E [NOT] LIKE ‘<匹配串>’,其中匹配串中可以是一個完整的字符串,也可以是包含通配符的字符串。

★ 說明 ★

如果是完整的字符串,則可以使用比較符號的等號“=”取代LIKE。

例如查詢課程號為“C001”的詳細情況,SQL語句如下:

    SELECT * FROM COURSE WHERE CNO LIKE 'C001';

其實該語句就等價與

    SELECT * FROM COURSE WHERE CNO='C001';

例如查詢姓李的學生的詳細信息,SQL語句如下:

    SELECT * FROM STUDENTS WHERE SNAME LIKE '李%';

★ 注意 ★

在使用下畫線“_”代表字符時,一個漢字應該使用兩個下畫線,因為一個漢字占兩個字符的位置。

5.涉及NULL的查詢

例如,某些學生選修課程后沒有參加考試,所以有選課記錄,但沒有考試成績。查詢缺少成績的學生的學號和相應的課程號,SQL語句如下:

    SELECT SNO,CNO FROM SC WHERE GRADE IS NULL;

6.多重條件查詢

AND和OR可以用來聯(lián)結多個查詢條件。例如,查詢學生表中年齡大于20的男學生的詳細信息,SQL語句如下:

    SELECT * FROM STUDENTS WHERE SAGE>20 AND SSEX='男';

4.5.3 GROUP BY子句對查詢結果分組

GROUP BY子句將表按列的值分組,列的值相同的分為一組。如果GROUP BY后面有多個列名,則先按第一列名分組,再在每組中按第二列名分組。GROUP BY子句經常與聚集函數聯(lián)用,所以下面會先簡單介紹聚集函數。如果分組后還要求按一定的條件對組進行篩選,最終只輸出滿足條件的組,則可以使用HAVING子句。

SQL中的聚集函數有AVG、MAX、MIN、SUM、COUNT五種。聚集函數的變量為一集合。AVG表示取平均值。MAX/MIN表示取最大值或最小值。SUM表示求和。COUNT表示元組個數。

在使用聚集函數時,若不使用GROUP BY子句,則作用于整個查詢結果。例如,查詢選課學生的平均分,SQL語句如下;

    SELECT AVG(GRADE) FROM SC;

而如果在GROUP BY子句中使用聚集函數,則分組后,聚集函數會作用于每個組,每個組都得到一個函數值。

例如求各門選課的平均成績,SQL語句如下,結果如表4-8所示。

表4-8 查詢結果表

    SELECT CNO,AVG(GRADE) FROM SC GROUP BY CNO;

4.5.4 ORDER BY子句對查詢結果分組

ORDER BY子句可對查詢結果按子句中指定的列的值排序。列可以用列名表示,也可以用在SELECT子句中出現的序號表示。后者書寫起來比較簡便,特別當選擇的列是聚集函數或表達式時,由于沒有列名,只能用序號表示。ASC選項表示升序,DESC選項表示降序,默認時表示升序。

例如,查詢學生選課表,給出選了C001號課程的學生的學號和成績,結果以成績升序排列。SQL語句如下:

    SELECT SNO,GRADE FROM SC WHERE CNO='C001' ORDER BY GRADE ASC;
主站蜘蛛池模板: 金塔县| 福清市| 衢州市| 广安市| 武强县| 怀来县| 漳平市| 合水县| 临颍县| 尖扎县| 西丰县| 鄂尔多斯市| 会宁县| 松潘县| 西畴县| 乐东| 永善县| 驻马店市| 闽侯县| 嘉鱼县| 榕江县| 来宾市| 曲麻莱县| 资中县| 永和县| 奉贤区| 饶阳县| 临澧县| 福州市| 宝丰县| 西乌| 海盐县| 新野县| 西安市| 楚雄市| 阿拉善盟| 黄大仙区| 阜新| 格尔木市| 蒲江县| 邵武市|