本文將繼續介紹上一篇單表查詢的剩餘部分,歡迎閱讀~
一、選擇表中的若干元組(續)
⑤ 涉及空值的查詢
謂詞如下:
IS NULL 或 IS NOT NULL
!!此處需注意: IS
不能用 =
來代替
🌟來看例子: 某些學生選修課程後沒有參加考試,所以有選課記錄,但沒有考試成績。查詢缺少成績的學生的學號和相應的課程號:
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
誒 等會,129和131好像是夏雨和夏冰雹(劉星)?!啊哈哈,看來回家又得捱罵了hhhhh😆
對了,剛剛說IS
不能用 =
來代替,那我現在來演示給你康康,如果把上面的語句中IS
改爲 =
:
(啥子都沒得)
🌟Another one: 查所有有成績的學生學號和課程號:(我把全部人都打印了粗來參照)
SELECT Sno, Cno
FROM SC
WHERE Grade IS NOT NULL;
SELECT *
FROM SC
⑥ 多重條件查詢
邏輯運算符:AND 和 OR 來連接多個查詢條件
· AND的優先級高於OR
· 可以用括號改變優先級
(所以記不住的優先級的小夥伴彆着急,用括號不就行了嘛)
🌟來看例子: 查詢計算機系年齡在20歲以下的學生姓名:(我同樣把所有的學生打印粗來參照)
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage < 20;
SELECT *
FROM Student
🌟Another one: 查詢計算機科學系(CS)、數學系(MA)和信息系(IS)學生的姓名和性別:
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS ','MA ','IS');
這是上一篇的一個例子,可改寫爲:
SELECT Sname, Ssex
FROM Student
WHERE Sdept = 'CS' OR Sdept = 'MA' OR Sdept = 'IS';
SELECT *
FROM Student /*老規矩,參照一下*/
二、ORDER BY子句
ORDER BY子句(排序):可以按一個或多個屬性列排序
升序:ASC,降序:DESC,缺省值爲ASC
(這裏的排序關鍵字同 INDEX 的升序和降序排序的關鍵字,且缺省值(默認)都爲升序ASC,不過爲了增強可讀性,建議升序時還是把ASC關鍵字寫上)
對於空值,排序時顯示的次序由具體系統實現來決定(對於ORDER BY來說 空值超綱了,不是咱能管的)
🌟來看例子: 查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列:
SELECT Sno, Grade
FROM SC
WHERE Cno = '3'
ORDER BY Grade DESC;
👀此處值得一提的是:不寫ORDER BY的話,它打印出來是按錄入的順序
🌟Another one: 查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列:(因爲缺省時默認爲升序,這裏就不寫ASC了)
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
即先按系別升序排,系別相同時再按年齡降序排,NULL放在前面還是後面取決於你所用的DBMS
三、聚集函數
統計元組個數(即求總的有多少行): COUNT(*)
統計一列中值的個數: COUNT( [DISTINCT|ALL] <列名>)
計算一列值的總和 : SUM( [DISTINCT|ALL] <列名>)
計算一列值的平均值: AVG( [DISTINCT|ALL] <列名>)
求一列中的最大值和最小值:
· MAX( [DISTINCT|ALL] <列名>)
· MIN( [DISTINCT|ALL] <列名>)
🌟來看例子: 查詢學生總人數:
SELECT COUNT(*)
FROM Student;
SELECT *
FROM Student; /*老規矩,打印出來參考一下*/
🌟Another one: 查詢選修了課程的學生人數:(即去掉重複的)
SELECT COUNT(DISTINCT Sno)
FROM SC;
SELECT *
FROM Student; /*老規矩,打印出來參考一下*/
🌟Another one: 計算1號課程的學生平均成績:
SELECT AVG(Grade)
FROM SC
WHERE Cno= '1';
SELECT *
FROM Student; /*老規矩,打印出來參考一下*/
🌟Another one: 查詢選修1號課程的學生最高分數:
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
SELECT *
FROM SC; /*老規矩,打印出來康康*/
🌟Another one: 查詢學生201215122選修課程的總學分數:(這實際是一個多表查詢啦,在這裏用於介紹SUM提前運用一下)
SELECT SUM(Ccredit)
FROM SC, Course
WHERE Sno = '201215122' AND SC.Cno = Course.Cno;
SELECT *
FROM SC, Course
WHERE Sno = '201215122' AND SC.Cno = Course.Cno; /*老規矩,打印出來康康*/
SELECT *
FROM SC, Course
WHERE SC.Cno = Course.Cno; /*這裏把等值連接後的表也打印出來參考*/
四、GROUP BY子句
GROUP BY子句分組:細化聚集函數的作用對象
· 如果未對查詢結果分組,聚集函數將作用於整個查詢結果
· 對查詢結果分組後,聚集函數將分別作用於每個組
· 按指定的一列或多列值分組,值相等的爲一組
🌟來看例子: 求各個課程號及相應的選課人數:
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
SELECT *
FROM SC /*同樣 咱還是整個表打印出來康康*/
🌟Another one: 查詢選修了1門以上課程的學生學號:
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 1;
SELECT *
FROM SC
(ps:HAVING 短語是跟着GROUP BY用的,不能單獨拿出來使用,它只能作用於組,其功能相當於在表或視圖中的WHERE子句)
🌟Another one: 查詢平均成績大於等於80分的學生學號和平均成績:
下面這樣寫是不對的:
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade) >= 80
GROUP BY Sno;
SELECT *
FROM SC
👀如圖中的警告所說,即WHERE子句中不能用聚集函數作爲條件表達式! 同時注意這裏 因爲第一句語句出現了錯誤,所以後面的查看整張表的語句SELECT * FROM SC
未能正常執行。
正確的寫法應該是:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade) >= 80;
SELECT *
FROM SC
🔥 HAVING 短語與 WHERE 子句的區別:
- 作用對象不同
WHERE子句作用於基表或視圖,從中選擇滿足條件的元組
HAVING短語作用於組,從中選擇滿足條件的組
嘿嘿,那 本文單表查詢的介紹到這裏也就結束啦,感謝你耐心地閱讀~😊
這裏是一個想把學習過程記錄成博客分享給大家的undergraduate,請多關照🙏
咱們下期 見~