- LAMP網站開發(fā)黃金組合Linux+Apache+MySQL+PHP
- 楊明華等編著
- 1998字
- 2018-12-29 19:23:39
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;
- 基于C語言的程序設計
- Instant Raspberry Pi Gaming
- Project 2007項目管理實用詳解
- 空間機器人遙操作系統(tǒng)及控制
- 精通Windows Vista必讀
- 工業(yè)機器人工程應用虛擬仿真教程:MotoSim EG-VRC
- Hands-On Cybersecurity with Blockchain
- Python Data Science Essentials
- 工業(yè)機器人入門實用教程(KUKA機器人)
- 最簡數據挖掘
- Embedded Programming with Modern C++ Cookbook
- 愛犯錯的智能體
- 大數據技術基礎:基于Hadoop與Spark
- 基于敏捷開發(fā)的數據結構研究
- Office 2010辦公應用