SQL Server 數據庫基本操作入門篇【4】

本文將繼續介紹上一篇單表查詢的剩餘部分,歡迎閱讀~


一、選擇表中的若干元組(續)

⑤ 涉及空值的查詢

謂詞如下:

IS NULLIS 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

在這裏插入圖片描述

⑥ 多重條件查詢

邏輯運算符:ANDOR 來連接多個查詢條件
· 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,請多關照🙏
咱們下期 ~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章