程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> sql的集合操作

sql的集合操作

編輯:MySQL綜合教程

集合操作主要包括並操作UNION、交操作INTERSECT、差操作EXCEPT。

注意,參加集合操作的各查詢結果的列數必須相同;對應的數據類型也必須相同。

本示例中的數據表有student,sc,course三個,數據表的具體內容請看:Mysql數據庫中的EXISTS和NOT EXISTS

UNION示例:

例子1.1

題目:查詢計算機科學系的學生及年齡不大於19歲的學生。

SQL語句:

 

[sql] view plaincopy  
  1. SELECT * FROM Student WHERE Sdept='CS' UNION   
  2. SELECT * FROM Student WHERE Sage<=19  

查詢結果:

 

本查詢實際上是求計算機系的所有學生與年齡不大於19歲的學生的並集。

與它等效的SQL語句是:

 

[sql] view plaincopy  
  1. SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19  

 

注意:雖然這個兩個SQL語句是等效的,但是本質上是不一樣的,第一個SQL語句是分別進行兩次SELECT然後將結果取並集;第二個SQL語句是直接進行了一次SELECT語句查詢。

INTERSECT示例:

MySql語句並不支持INTERSECT,所以只能使用其替代語句

例子2.1

題目:查詢計算機科學系中年齡不大於19歲的學生。

對應的SQL語句應該是:

[sql] view plaincopy  
  1. SELECT * FROM Student   
  2. WHERE Sdept='CS'  
  3. INTERSECT  
  4. SELECT * FROM Student  
  5. WHERE Sage<=19;  


替代的SQL語句:

 

[sql] view plaincopy  
  1. SELECT *  
  2. FROM student  
  3. WHERE Sdept = 'CS'  
  4. AND Sage <=19  

查詢結果:

例子2.2

題目:查詢即選修了課程1又選修了課程2的學生。(就是查詢選修課程1的學生集合與選修課程2的學生集合的交集)

對應的SQL語句應該是:

 

[sql] view plaincopy  
  1. SELECT Sno FROM SC  
  2. WHERE  Cno='1'  
  3. INTERSECT  
  4. SELECT Sno FROM SC  
  5. WHERE Cno='2';  


替代的SQL語句為:

 

(使用IN)

 

[sql] view plaincopy  
  1. SELECT Sno  
  2. FROM SC  
  3. WHERE Cno = '1'  
  4. AND Sno  
  5. IN (  
  6. SELECT Sno  
  7. FROM SC  
  8. WHERE Cno = '2'  
  9. )  


或者為:

 

(使用EXISTS)

 

[sql] view plaincopy  
  1. SELECT Sno  
  2. FROM SC SCX  
  3. WHERE Cno = '1'  
  4. AND EXISTS (  
  5. SELECT Sno  
  6. FROM SC SCY  
  7. WHERE Cno = '2'  
  8. AND SCX.Sno = SCY.Sno  
  9. )  

查詢結果為:

 

或者為:

(使用JOIN ON)

 

[sql] view plaincopy  
  1. SELECT *  
  2. FROM SC SCX  
  3. JOIN SC SCY ON ( SCX.Cno = '1'  
  4. AND SCY.Cno = '2'  
  5. AND SCX.Sno = SCY.Sno )  


 

EXCEPT操作:

很不幸,MySql也不支持EXCEPT操作,只能使用替代的語句。

例子3.1

查詢計算機科學系的學生與年齡不大於19歲的學生的差集。

對應的SQL語句為:

 

[sql] view plaincopy  
  1. SELECT * FROM Student WHERE Sdept='CS'  
  2. EXCEPT   
  3. SELECT * FROM Student WHERE Sage<=19;  


也就是查詢計算機科學系中年齡大於19歲的學生。

 

替換語句為:

(直接使用WHERE,不得不說這麼做很簡單,但是意思上不是很好理解)

 

[sql] view plaincopy  
  1. SELECT *  
  2. FROM Student  
  3. WHERE Sdept = 'CS'  
  4. AND Sage >19  


查詢結果為:

 

或者替換語句為:

(使用NOT IN)

 

[sql] view plaincopy  
  1. SELECT *  
  2. FROM Student  
  3. WHERE Sdept = 'CS'  
  4. AND Sno NOT  
  5. IN (  
  6. SELECT Sno  
  7. FROM Student  
  8. WHERE Sage <=19  
  9. )  

查詢結果為:

 

或者使用替換語句為:

(使用NOT EXISTS)

 

[sql] view plaincopy  
  1. SELECT *  
  2. FROM Student SX  
  3. WHERE Sdept = 'CS'  
  4. AND NOT  
  5. EXISTS (  
  6. SELECT *  
  7. FROM Student SY  
  8. WHERE SY.Sage <=19  
  9. AND SX.Sno = SY.Sno  
  10. )  

查詢結果為:

 

對集合操作結果的排序

ORDER BY子句只能用於對最終查詢結果排序,不能對中間結果排序。

任何情況下,ORDER BY子句只能出現在最後;對集合操作結果排序時,ORDER BY子句中用數字指定排序屬性。

下面是一種錯誤的寫法:

 

[sql] view plaincopy  
  1. SELECT * FROM Student  
  2. WHERE Sdept='CS'  
  3. ORDER BY Sno  
  4. UNION  
  5. SELECT * FROM Student  
  6. WHERE Sage<=19  
  7. ORDER BY Sno;  


正確的應該是:

 

 

[sql] view plaincopy  
  1. SELECT * FROM Student  
  2. WHERE Sdept='CS'  
  3. UNION  
  4. SELECT * FROM Student  
  5. WHERE Sage<=19  
  6. ORDER BY 2;  

輸出結果:

 

如果寫成:

 

[sql] view plaincopy  
  1. SELECT * FROM Student  
  2. WHERE Sdept='CS'  
  3. UNION  
  4. SELECT * FROM Student  
  5. WHERE Sage<=19  
  6. ORDER BY 1;  

輸出結果為:

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved