【數據庫】作業6——SQL練習3 - SELECT(單表查詢)

 


SELECT:【例3.29】~【例3.48】

REF:教材3.4“數據查詢”的部分例題

1. 在SQLserver上運行,觀察運行效果,並把代碼寫到作業中。

2. 寫出自己的理解/收穫/心得體會(部分比較複雜的例題,建議增加測試方法和測試數據,舉一反三)。

REF:建表&插入數據

作業原地址:作業

書接上回:【數據庫】作業5——SQL練習2 - INDEX / INSERT / SELECT

注:因爲這個和前一個作業是一起寫的,所以也和上個作業情況一樣,數據出現了丟失,掃了一下這次作業,沒有特別的情況,也沒有什麼大的問題出現,所以這次作業只交了代碼,沒有實驗截圖了。(已經做完了所有例題的前提!!!)


 

④字符匹配

 

謂詞LIKE可以用來進行字符串的匹配

 

 [NOT] LIKE  ‘<匹配串>’  [ESCAPE ‘ <換碼字符>’]
 

其含義是查找指定的屬性列值與<匹配串>相匹配的元組。

<匹配串>可以是一個完整的字符串,也可以含有通配符% _

%:任意長度(長度可以爲0)的字符串。
_ :代表任意單個字符。

 

【例3.29】查詢學號爲201215121的學生的詳細情況。

 

SELECT *
FROM Student
WHERE Sno LIKE '201215121';

等價於

SELECT *
FROM Student
WHERE Sno = '201215121';

 

【例3.30】 查詢所有姓劉學生的姓名、學號和性別。

 

SELECT Sname, Sno, Ssex
FROM Student
WHERE  Sname LIKE '劉%';

 

【例3.31】查詢姓"歐陽"且全名爲三個漢字的學生的姓名。

 

 SELECT Sname
 FROM Student
 WHERE Sname LIKE '歐陽_';

 

注:數據庫字符集爲ASCII時一個漢字需要兩個_;當字符集爲GBK時需要一個_。

 

【例3.32】查詢名字中第二個字爲"陽"的學生的姓名和學號。

 

SELECT Sname,Sno
FROM Student
WHERE  Sname LIKE '_陽%';

 

【例3.33】查詢所有不姓劉的學生姓名、學號和性別。

 

 SELECT Sname,Sno,Ssex
 FROM Student
 WHERE Sname NOT LIKE '劉%';

 

注:如果要查詢的字符串本身含有通配符%或_,這時候要使用ESCAPE '<換碼字符>'短語對通配符進行轉義了。

 

【例3.34】查詢DB_Design課程的課程號和學分。

 

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'ESCAPE '\'; 

 

注:ESCAPE'\'表示“\”爲換碼字符。

 

【例3.35】查詢以"DB_"開頭,且倒數第三個字符爲 i的課程的詳細情況。

 

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE '\';

 

 

⑤涉及空值的查詢

 

【例3.36】某些學生選修課程後沒有參加考試,所以有選課記錄,但沒 有考試成績。查詢缺少成績的學生的學號和相應的課程號。

 

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

 

注:這裏的“IS”不能用(=)代替。

 

【例3.37】查所有有成績的學生學號和課程號。

 

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

 

⑥多重條件查詢

 

邏輯運算符ANDOR可以用來連接多個查詢條件,AND的優先級高於OR,但用戶可以用括號改變優先級。

 

【例3.38】查詢計算機系年齡在20歲以下的學生姓名。

 

SELECT Sname
FROM Student
WHERE Sdept='CS'AND Sage<20;

 

3.ORDER BY 子句

 

可以用OREDR BY 子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,默認值爲升序。

對於空值,排序時顯示的次序有具體系統實現來決定。

 

【例3.39】查詢選修了3號課程的學生的學號及其成績,查詢結果按分數降序排列。

 

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

 

【例3.40】查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。

 

SELECT *
FROM Student
ORDER BY Sdept ASC,Sage DESC;  

 

4.聚集函數

COUNT(*)                                                  統計元組個數 
COUNT([DISTINCT|ALL] <列名>)             統計一列中值的個數 
SUM([DISTINCT|ALL] <列名>)                  計算一列值的總和(此列必須是數值型)
AVG([DISTINCT|ALL] <列名>)                   計算一列值的平均值(此列必須是數值型)
MAX([DISTINCT|ALL] <列名>)                  求一列中的最大值

 

【例3.41】 查詢學生總人數。

 

SELECT COUNT(*)
FROM  Student; 

 

【例3.42】查詢選修了課程的學生人數。

 

SELECT COUNT(DISTINCT Sno)
FROM SC;

 

【例3.43】計算選修1號課程的學生平均成績。

 

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

 

【例3.44】查詢選修1號課程的學生最高分數。

 

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

 

【例3.45】 查詢學生201215012選修課程的總學分數。

 

SELECT SUM(Ccredit)
FROM  SC,Course
WHERE Sno='201215122' AND SC.Cno=Course.Cno; 

 

注:當聚集函數遇到空值時,除了COUNT(*)外,都跳過空值而只處理非空值。

 

5.GROUP BY 子句

 

GROUP BY 子句將查詢結果按某一列或多列的值分組,值相等的爲一組。

分組後聚集函數將作用與每一個組,即每一組都有一個函數值。

 

【例3.46】求各個課程號及相應的選課人數。

 

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno; 

 

【例3.47】查詢選修了三門以上課程的學生學號。

 

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3; 

 

注:先用GROUP BY 子句按照Sno分組,再用聚集函數COUNT對每一組計數,HAVING短語給出了選組的條件。

 

WHERE子句HAVING短語的區別:作用的對象不同。

WHERE子句:作用域基本表或視圖,從中選擇滿足條件的元組。

HAVING短語:作用於組,從中選擇滿足條件的組。

 

【例3.48】查詢平均成績大於等於90分的學生學號和平均成績。

 

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

 

總結:emm和上個作業小情況一樣,寫作業的時候數據不小心都弄丟了,所以這次沒有截圖...不過每個例題都做了,代碼也是一鍵一鍵敲的,這次也還好,沒什麼特別難的語句,也沒碰見什麼大問題。

 


 

上期傳送陣:【數據庫】作業5——SQL練習2 - INDEX / INSERT / SELECT

下期傳送陣:————

 


完成時間:55min(僅爲寫博客時間,用SQL的時間緊接上期作業,未計時)

          以上

                                         ————(2020.3.15)

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