數據查詢是數據庫的核心操做。SQL提供了SELECT語句進行數據查詢,其通常格式爲:數據庫
SELECT [ALL | DISTINCT]<目標列表達式>[,<目標列表達式>]··· FROM<表名或視圖名>[,<表名或視圖名>···] | (SELECT語句>)[AS]<別名> [WHERE<條件表達式>] [GROUP BY<列名1>[HAVING<條件表達式>]] [ORDER BY<列名2>[ASC | DESC]];
整個SELECT語句的含義是,根據WHERE子句的條件表達式從FROM子句指定的基本表、視圖或派生表中找出知足條件的元組,再按SELECT子句中的目標列表達式選出元組中的屬性值造成結果表。函數
若是有GROUP BY子句,則將結果按<列名1>的值進行分組,該屬性列值相等的元組爲一個組。一般會在每組中做用匯集函數。若是GROUP BY子句帶HAVING短語,則只有知足指定條件的組才予以輸出。spa
若是有ORDER BY子句,則結果還要按<列名2>的值的升序或降序排序。code
SELECT語句既能夠完成簡單的單表查詢,也能夠完成複雜的鏈接查詢和嵌套查詢。blog
(1)查詢指定列排序
查詢全體學生的學號與姓名字符串
SELECT Sno,Sname FROM Student;
查詢全體學生的姓名、學號、所在系數學
SELECT Sname,Sno,Sdept FROM Student;
(2)查詢所有列it
查詢全體學生的詳細記錄table
SELECT * FROM Students; 等價於 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;
(3)查詢通過計算的值
查詢全體學生的姓名及其出生年份
SELECT Sname,2014-Sage //查詢結果的第2列是一個 算術表達式 FROM Student;
注意:用當時的年份(假設爲2014年)減去學生的年齡,這樣所得的便是學生的出生年份。
查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名
SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept) FROM Student;
(1)消除取值重複的行
查詢選修了課程的學生學號
SELECT DISTINCT Sno FROM SC;
(2)查詢知足條件的元組
查詢知足指定條件的元組能夠經過WHERE子句實現。WHERE子句經常使用的查詢條件以下表所示
查詢條件 |
謂詞 |
比較 |
=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比較運算符 |
肯定範圍 |
BETWEEN AND,NOT BETWEEN AND |
肯定集合 |
IN,NOT IN |
字符匹配 |
LIKE,NOT LIKE |
空值 |
IS NULL,IS NOT NULL |
多重條件(邏輯運算) |
AND,OR,NOT |
查詢計算機科學系全體學生的名單
SELECT Sname FROM Student WHERE Sdept='CS'
查詢全部年齡在20歲如下的學生姓名及其年齡
SELECT Sname,Sage FROM Student WHERE Sage<20;
查詢考試成績不合格的學生的學號
SELECT DISTINCT Sno FROM SC WHERE Grade<60;
查詢年齡在20~23歲之間的學生的姓名、系別和年齡
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23
查詢年齡在20~23歲之間的學生的姓名、系別和年齡
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23
查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名、系別和年齡
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS');
查詢學號爲201215121的學生的詳細狀況
SELECT * FROM Student WHERE Sno LIKE '201215121' 等價於 SELECT * FROM Student WHERE Sno='201215121'
此處介紹下字符匹配
謂詞LIKE能夠用來進行字符串的匹配。其通常語法格式以下:
[NOT] LIKE'<匹配串>' [ESCAPE '<換碼字符>']
其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>能夠是一個完整的字符串,也能夠含有通配符 % 和 _ 。其中:
查詢全部姓劉的學生的姓名、學號和性別
SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '劉%';
查詢姓「歐陽」且全名爲三個漢字的學生的姓名
SELECT Sname FROM Student WHERE Sname LIKE '歐陽_'
注意:數據庫字集爲ASCII時一個漢字須要兩個_;當字符集爲GBK時只須要一個。
查詢名字中第二個字爲「陽」的學生的姓名和學號
SELECT Sname,Sno, FROM Student WHERE Sname LIKE '_陽%';
查詢全部不姓劉的學生的姓名、學號和性別
SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE '劉%';
若是用戶要查詢的字符串自己就含有通配符%或_,這時就要使用 ESCAPE '<換碼字符>' 短語對通配符進行轉義了。
查詢DB_Design 課程的課程號和學分
SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB \ _Design' ESCAPE '\';
ESCAPE '\' 表示 「\」 爲換碼字符。這樣匹配串中緊跟在 「\」 後面的字符「_」再也不具備通配符的含義,轉義爲普通的「_」字符。
查詢以「DB_」開頭,且倒數第三個字符爲i的課程的詳細狀況
SELECT * FROM Course WHERE Cname LIKE 'DB \_%i__'ESCAPE '\';
某些學生選修課程後沒有參加考試,因此有選課記錄,但沒有考試成績。查詢缺乏成績的學生的學號和相應的課程號
SELECT Sno,Cno FROM SC WHERE Grade IS NULL; /*分數Grade是空值*/
注意:這裏的「IS」不能用等號(=)代替。
查全部有成績的學生學號和課程號
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;
查詢計算機科學系年齡在20歲如下的學生姓名
SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20;
用戶能夠用ORDER BY子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,默認值爲升序。
查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列
SELECT Sno,Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;
查詢全體學生狀況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
4. 彙集函數
爲了進一步方便用戶,加強檢索功能,SQL提供了許多彙集函數,主要有:
COUNT(*) |
統計元組個數 |
COUNT([DISTINCT|ALL]<列名>) |
統計一列中值的個數 |
SUM([DISTINCT|ALL]<列名>) |
計算一列值的總和(此列必須是數值型) |
AVG([DISTINCT|ALL]<列名>) |
計算一列值的平均值(此列必須是數值型) |
MAX([DISTINCT|ALL]<列名>) |
求一列值中的最大值 |
MIN([DISTINCT|ALL]<列名>) |
求一列值中的最小值 |
若是指定 DISTINCT 短語,則表示在計算時要取消指定列中的重複值。
若是不指定 DISTINCT 短語或指定 ALL 短語(ALL爲默認值),則表示不取消重複值。
查詢學生總人數
SELECT COUNT(*) FROM Student;
查詢選修了課程的學生人數
SELECT COUNT(DISTINCT Sno) FROM SC;
計算選修1號課程的學平生均成績
SELECT AVG(Grade) FROM SC WHERE Cno='1';
查詢選修1號課程的學生最高分數
SELECT MAX(Grade) FROM SC WHERE Cno='1';
查詢學生201215012選修課程的總學分數
SELECT SUM(Ccredit) FROM SC,Course WHERE Sno='201215012' AND SC.Cno=Course.Cno;
注意:WHERE 子句中是不能用匯集函數做爲條件表達式的。彙集函數只能用於SELECT子句和GROUP BY中的HAVING子句。
將查詢結果按某一列或多列的值分組,值相等的爲一組。
求各個課程號及相應的選課人數
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
查詢選修了三門以上課程的學生學號
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3;
查詢平均成績大於等於90分的學生學號和平均成績
SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)>=90 (錯誤!) GROUP BY Sno; 由於WHERE子句中是不能用匯集函數做爲條件表達式的,正確的查詢語句應該是: SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno; HAVING AVG(Grade)>=90;
這次整理了SQL數據查詢中有關單表查詢的程序,其中應格外注意