數據庫系統概論(十一)SQL 集合查詢 超詳細講解(附帶例題表格對比帶你一步步掌握)
- 前言
- 一、什么是集合查詢?
- 二、集合操作的三種類型
- 1. 并操作
- 2. 交操作
- 3. 差操作
- 三、使用集合查詢的前提條件
- 四、常見問題與注意事項
- 五、總結
前言
- 在前幾期博客中,我們探討了 SQL 連接查詢,單表查詢,嵌套查詢技術等知識點。
- 從本節開始,我們將深入講解 SQL 中SQL 集合查詢的知識點。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的數據庫系統概論專欄
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
一、什么是集合查詢?
集合查詢就是把多個查詢結果像“拼積木”一樣組合起來,就像班級里不同小組的同學合并、找交集或找差異。
比如:
- 想找“計算機專業學生”和“年齡≤19歲學生”的合并名單 → 用并操作。
- 想找“同時選修了課程A和課程B的學生” → 用交操作。
- 想找“計算機專業但年齡>19歲的學生” → 用差操作。
二、集合操作的三種類型
1. 并操作
作用:合并兩個查詢結果,自動去重(類似“+”號)。
語法:
SELECT 列1, 列2 FROM 表 WHERE 條件1
UNION
SELECT 列1, 列2 FROM 表 WHERE 條件2;
例子:
查詢“計算機科學與技術專業學生”或“年齡≤19歲學生”的所有記錄:
SELECT * FROM Student WHERE Smajor='計算機科學與技術'
UNION
SELECT * FROM Student WHERE Sage<=19;
注意:
- 若想保留重復記錄,用 UNION ALL(不去重)。
- 兩張表的列數必須相同,對應列的數據類型必須一致(比如都是數字或文本)。
2. 交操作
作用:找出兩個查詢結果中共同的部分(類似“∩”)。
語法:
SELECT 列1, 列2 FROM 表 WHERE 條件1
INTERSECT
SELECT 列1, 列2 FROM 表 WHERE 條件2;
例子:
查詢“既是計算機專業,又年齡≤19歲的學生”:
SELECT * FROM Student WHERE Smajor='計算機科學與技術'
INTERSECT
SELECT * FROM Student WHERE timestampdiff(year, Sbirthday, curdate())<=19;
替代方法:用子查詢實現交操作(適用于不支持INTERSECT的數據庫):
SELECT * FROM Student
WHERE Smajor='計算機科學與技術'
AND Sno IN (SELECT Sno FROM Student WHERE Sage<=19);
3. 差操作
作用:從第一個查詢結果中排除第二個查詢的結果(類似“-”)。
語法:
SELECT 列1, 列2 FROM 表 WHERE 條件1
EXCEPT
SELECT 列1, 列2 FROM 表 WHERE 條件2;
例子:
查詢“計算機專業,但年齡>19歲的學生”:
SELECT * FROM Student WHERE Smajor='計算機科學與技術'
EXCEPT
SELECT * FROM Student WHERE Sage<=19;
替代方法:用條件篩選實現差操作:
SELECT * FROM Student
WHERE Smajor='計算機科學與技術' AND Sage>19;
三、使用集合查詢的前提條件
- 列數必須相同:
比如第一個查詢選2列(姓名、年齡),第二個查詢也必須選2列,不能一個選2列、一個選3列。 - 對應列的數據類型必須一致:
比如第一個查詢的第一列是“姓名(文本)”,第二個查詢的第一列也必須是文本類型,不能是數字。
四、常見問題與注意事項
- 數據庫兼容性:
- INTERSECT和EXCEPT在MySQL中不直接支持,需用子查詢或JOIN替代(如上文中的替代方法)。
- 在SQL Server、Oracle等數據庫中可直接使用。
- 性能考慮:
- 簡單場景下,子查詢(如IN)可能比集合操作更易理解和優化。
- 復雜場景下,集合操作可能更高效(需根據具體數據庫優化)。
五、總結
- UNION(并):把兩組人“合在一起”,去重(或保留重復)。
- INTERSECT(交):找兩組人里“同時存在的人”。
- EXCEPT(差):從第一組人里“去掉”第二組的人。
以上就是這篇博客的全部內容,下一篇我們將繼續探索更多精彩內容。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的數據庫系統概論專欄
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
非常感謝您的閱讀,喜歡的話記得三連哦 |