資料查詢--單表查詢(SQL)
SQL為使用者提供SELECT語句進行資料查詢,語句一般格式為:
SELECT [ALL|DISTINCT]<目標列表達式1>,<目標列表達式2>,...
FROM <表名或檢視名>
WHERE <條件表示式>
GROUP BY <列名1>
[HAVING <條件表示式>]
ORDER BY <列名> [ASC|DESC];
語句的含義為:根據WHERE子句的條件表示式從FROM子句指定的表中找出滿足條件的元組,然後再按SELECT子句中的目標表達式選出元組中對應的屬性值形成目標表。
如果有GROUP BY 子句,則將結果按<列名>的值進行分組,該屬性值相等的元組為一個組。如果GROUP BY 子句後帶有HAVING語句,則只有滿足HAVING 語句的條件方可輸出。
如果有ORDER BY 子句,結果還要按<列表2>的值進行升(降)序排序操作後輸出。
單表查詢
單表查詢是指只涉及一個表的查詢。
下面我們用一個學生的資訊表為例講解。
表名:Student
Sno | Sname | Ssex | Sage | Sdept |
學號 | 姓名 | 性別 | 年齡 | 專業 |
選擇表中的若干列查詢指定列
- 查詢指定列
很多情況下,不同使用者對於表中的一部分屬性感興趣,這是就可以運用SELECT語句查詢使用者指定列資訊。
例:查詢全體學生的姓名,學號,所在系。
SELECT Sname,Sno,Sdept
FROM Student;
當然也有一些使用者需要對全部資訊進行瀏覽統計:
SELECT *
FROM Student;
等價於
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
- 查詢計算後的值
SELECT 子句後的<目標列表達式>不僅可以是列名,也可以是表示式(計算表示式、函式表示式、字串等)
SELECT Sname,2018-Sage,LOWER(Sdept)
FROM Student;
- 該語句輸出的是全體學生的姓名及出生年份,LOWER()函式將其所在專業名轉化為小寫然後輸出。
選擇表中的若干元組
- 消除表中的重複行
兩個本來並不完全相同的元組投影到指定的某些列上時,可能會變成相同的行,這時可以用DISTINCT消除他們:
SELECT DISTINCT Sno
FROM Student;
使用者不指定DISTINCT關鍵詞時,預設為ALL。
SELECT Sno
FROM Student;
等價於
SELECT ALL Sno
FROM Student;
- 查詢滿足條件的元組
查詢條件 | 謂詞 |
比較 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算子 |
確定範圍 | BETWEEN AND,NOT BETWEEN AND |
確定集合 | IN,NOT IN |
字元匹配 | LIKE,NOT LIKE |
多重條件 | AND,OR,NOT |
例:查詢計算機專業全體學生名單。
SELECT Sname
FROM Student
WHERE Sdept='CS';
查詢20歲以下的學生姓名及其年齡。
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
確定範圍在20~24歲之間的學生姓名、專業和年齡。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 24;
查詢計算機(CS)、數學(MA)、和資訊(IS)專業的學生姓名和性別。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
ORDER BY 子句
使用者可以用ORDER BY 子句對查詢結果進行屬性值的升序(ASC)或降序(DESC)進行排序。預設值為升序。
例:查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列。
SELECT Sno,Grade
FROM Student
WHERE Cno='3'
ORDER BY Grade DESC;
對於空值,排序時現實的次序由具體系統實現來決定。各個系統的實現可以不同,只要保持一致就行。
聚集函式
COUNT(*) | 統計元組個數 |
COUNT( [DISTINCT|ALL] <列名> ) | 統計一列中值的個數 |
SUM( [DISTINCT|ALL] <列名> ) | 計算一列值的總和(此列必須是數值型) |
AVG( [DISTINCT|ALL] <列名> ) | 計算一列值的平均值(此列必須是數值型) |
MAX( [DISTINCT|ALL] <列名> ) | 求一列值的最大值 |
MIN( [DISTINCT|ALL] <列名> ) | 求一列值的最小值 |
GROUP BY 子句
GROUP BY 子句將查詢結果按一列或多列的值分組,值相等的為一組。分組後聚集函式將作用於每一個組,即每一個組都有一個函式值。
如果分組後還要求按一定的條件對這些組進行篩選,最終只輸出滿足條件的組,則可以使用HAVING短語指定篩選條件。
例:查詢選修了三門以上課程的學生學號。
SELECT Sno
FROM Student
GROUP BY Sno
HAVING COUNT(*)>3;
WHERE 子句作用於表,從中選出滿足條件的組;(WHERE 子句不能用聚集函式作為條件表示式)
HAVING語句作用於組,從中選擇滿足條件的組。