電子書網(wǎng)站模板今日熱點新聞事件及評論
學習目標
- 使用DISTINCT消除重復,僅提取唯一記錄
- 使用子查詢返回數(shù)據(jù),作為進一步限制要檢索的條件
DISTINCT
DISTINCT
關(guān)鍵字與SELECT語句一起使用,用來消除重復,并僅提取唯一記錄。
當記錄集中有多個重復記錄時,更有意義的是僅提取唯一記錄,而不是看到重復數(shù)據(jù),此時可以使用DISTINCT
進行處理。
語法
以下是DISTINCT
關(guān)鍵字的基本語法,用于刪除重復記錄。
SELECT DISTINCT 列1, 列2,.....
FROM 表名
WHERE 條件
例如,查詢學生表中一共出現(xiàn)了哪些民族的同學,對應(yīng)T-SQL如下:
SELECT DISTINCT nation
FROM students
查詢結(jié)果
注意:DISTINCT不會過濾掉NULL值,返回結(jié)果包含NULL值
子查詢
子查詢是一個嵌套在 SELECT
、INSERT
、UPDATE
或 DELETE
語句或其他子查詢中的查詢。即如果需要在一個查詢結(jié)果集基礎(chǔ)上進行增刪改,或者進一步的查詢就需要用到子查詢。
子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的語句也稱為外部查詢或外部選擇。
- 外部查詢:查詢結(jié)果集返回給調(diào)用者
- 內(nèi)部查詢:查詢結(jié)果集返回給外部查詢。
獨立子查詢
獨立子查詢(不相關(guān)子查詢)是指獨立于其外部查詢的子查詢,可以單獨運行子查詢。
執(zhí)行順序
獨立子查詢在執(zhí)行外部查詢之前先執(zhí)行一次,接著外部查詢再使用子查詢的結(jié)果繼續(xù)進行查詢。
獨立標量子查詢
獨立標量子查詢是返回單個值的子查詢。標量子查詢可以出現(xiàn)在外部查詢中期望使用單個值的任何地方。例如,查詢教師最多的院系。
查詢過程可以分為兩步:
- 從teachers表中返回教師人數(shù)最多的院系編號
SELECT TOP 1 deptno
FROM teachers
GROUP BY deptno
ORDER BY COUNT(*) DESC
返回結(jié)果
- 從departments表示返回該編號的院系名稱
SELECT deptno, dname
FROM departments
WHERE deptno = 'J'
返回結(jié)果
更簡單的方法是嵌套子查詢,只需要一條查詢語句就可以查詢出教師最多的院系。
SELECT deptno, dname
FROM departments
WHERE deptno = (SELECT TOP 1 deptnoFROM teachersGROUP BY deptno
)
返回結(jié)果
注意
- 對于有效的標量子查詢,它的返回值不能超過一個,如果標量子查詢返回了多個值,在運行時則可能會失敗。
- 如果標量子查詢沒有返回任何值,其結(jié)果就轉(zhuǎn)換為NULL,和NULL行進行比較得到的是UNKNOWN,查詢過濾器不會返回任何讓過濾表達式計算結(jié)果為UNKNOWN的行。
獨立多值子查詢
獨立多值子查詢是在子查詢中返回多個值。例如,查詢所有男生(或女生)的平均分。
SELECT sno, AVG(grade) AS 平均分
FROM score
WHERE sno in (SELECT snoFROM studentsWHERE gender='男'
)
GROUP BY sno
返回結(jié)果
相關(guān)子查詢
相關(guān)子查詢(關(guān)聯(lián)子查詢)是指子查詢中引用了外部查詢中出現(xiàn)的表的列,依賴于外部查詢,不能獨立地運行子查詢。在邏輯上,子查詢會為每個外部行單獨計算一次。
練習1
在students表中添加一列point,記錄每個同學的學分,學分等于該生各科的平均分。實現(xiàn)過程可以分為兩步:
- 給學生表添加point列
ALTER TABLE students
ADD points INT
- 更新students表的point列,將其設(shè)置為該同學各科的平均分。
UPDATE students SET points = (SELECT AVG(grade)FROM score AS SCWHERE SC.sno = students.sno
)
練習2
修改score表中的成績,然后查詢students表中哪些同學的學分points發(fā)生了變化。
SELECT sno, sname
FROM students AS S
WHERE S.points <> (SELECT AVG(grade)FROM score AS SCWHERE SC.sno = S.sno
)
注意,在查詢過程中要先外后內(nèi),外層查詢決定最終要顯示的表和字段,然后由內(nèi)層查詢確定查詢條件。
EXISTS和NOT EXISTS
EXISTS
(或NOT EXISTS
)可以指定一個子查詢,用于檢查子查詢是否至少會返回一行數(shù)據(jù)。該子查詢通過EXISTS
(或NOT EXISTS
)并不返回任何數(shù)據(jù),而是返回True
或False
。
語法
EXISTS ( 子查詢)
練習
使用EXISTS查詢不及格的學生信息,包含學生編號,學生姓名。
SELECT sno, snameFROM students AS S WHERE EXISTS (SELECT DISTINCT snoFROM score AS SCWHERE SC.sno = S.sno AND SC.grade < 60)
執(zhí)行順序
- 首先執(zhí)行一次外部查詢
- 對于外部查詢中的每一行分別執(zhí)行一次子查詢,而且每次執(zhí)行子查詢時都會引用外部查詢中的列
查詢結(jié)果
注意:
- 如果子查詢查詢結(jié)果有多條數(shù)據(jù)只要查詢出一條記錄后,就會立即返回,這種處理方式叫做短路處理。
NOT EXISTS
子查詢的返回結(jié)果剛好相反。
總結(jié)
DISTINCT
關(guān)鍵字與SELECT語句一起使用,用來消除重復,并僅提取唯一記錄。- 子查詢分為不相關(guān)子查詢和相關(guān)子查詢
- 不相關(guān)子查詢是指子查詢獨立于其外部查詢,可以單獨運行子查詢。
- 相關(guān)子查詢是指子查詢中引用了外部查詢中出現(xiàn)的表的列,依賴于外部查詢,不能獨立地運行子查詢。
- EXITS可以指定一個子查詢,用于檢查子查詢是否至少會返回一行數(shù)據(jù)。