select語句的查詢結果是元組的集合,所以多個select語句的結果可進行集合操作。
集合操作主要包括並操作union、交操作intersect、差操作except。
注意,參加集合操作的各查詢結果的列數必須相同;對應的資料型別也必須相同。
本示例中的資料表有student,sc,course三個,資料表的具體內容請看:
union示例:
例子1.1
題目:查詢電腦科學系的學生及年齡不大於19歲的學生。
sql語句:
select * from student where sdept='cs' union
select * from student where sage<=19
查詢結果:
本查詢實際上是求計算機系的所有學生與年齡不大於19歲的學生的並集。
與它等效的sql語句是:
select * from student where sdept='cs' or sage<=19
注意:雖然這個兩個sql語句是等效的,但是本質上是不一樣的,第乙個sql語句是分別進行兩次select然後將結果取並集;第二個sql語句是直接進行了一次select語句查詢。
intersect示例:
mysql語句並不至此intersect,所以只能使用其替代語句
例子2.1
題目:查詢電腦科學系中年齡不大於19歲的學生。
對應的sql語句應該是:
select * from student
where sdept='cs'
intersect
select * from student
where sage<=19;
替代的sql語句:
select *
from student
where sdept = 'cs'
and sage <=19
查詢結果:
例子2.2
題目:查詢即選修了課程1又選修了課程2的學生。(就是查詢選修課程1的學生集合與選修課程2的學生集合的交集)
對應的sql語句應該是:
select sno from sc
where cno='1'
intersect
select sno from sc
where cno='2';
替代的sql語句為:
(使用in)
select sno
from sc
where cno = '1'
and sno
in (
select sno
from sc
where cno = '2'
或者為:
(使用exists)
select sno
from sc scx
where cno = '1'
and exists (
select sno
from sc scy
where cno = '2'
and scx.sno = scy.sno
查詢結果為:
或者為:
(使用join on)
except操作:
很不幸,mysql也不支援except操作,只能使用替代的語句。
例子3.1
查詢電腦科學系的學生與年齡不大於19歲的學生的差集。
對應的sql語句為:
select * from student where sdept='cs'
except
select * from student where sage<=19;
也就是查詢電腦科學系中年齡大於19歲的學生。
替換語句為:
(直接使用where,不得不說這麼做很簡單,但是意思上不是很好理解)
select *
from student
where sdept = 'cs'
and sage >19
查詢結果為:
或者替換語句為:
(使用not in)
select *
from student
where sdept = 'cs'
and sno not
in (
select sno
from student
where sage <=19
查詢結果為:
或者使用替換語句為:
(使用not exists)
select *
from student sx
where sdept = 'cs'
and not
exists (
select *
from student sy
where sy.sage <=19
and sx.sno = sy.sno
查詢結果為:
對集合操作結果的排序
order by子句只能用於對最終查詢結果排序,不能對中間結果排序。
任何情況下,order by子句只能出現在最後;對集合操作結果排序時,order by子句中用數字指定排序屬性。
下面是一種錯誤的寫法:
select * from student
where sdept='cs'
order by sno
union
select * from student
where sage<=19
order by sno;
正確的應該是:
select * from student
where sdept='cs'
union
select * from student
where sage<=19
order by 2;
輸出結果:
如果寫成:
select * from student
where sdept='cs'
union
select * from student
where sage<=19
order by 1;
輸出結果為:
mysql集合屬性 MySql集合查詢
select語句的查詢結果是元組的集合,所以多個select語句的結果可進行集合操作。集合操作主要包括並操作union 交操作intersect 差操作except。注意,參加集合操作的各查詢結果的列數必須相同 對應的資料型別也必須相同。本示例中的資料表有student,sc select語句的查詢...
mysql 集合 思想 mysql 面向集合查詢
面向集合的思想 sql是為查詢和管理關係型資料庫中的資料而專門設計的一種標準語言。我們通常認為的關係型是說的資料庫中表與表的關係,這個理解是有問題的,這裡的關係其實是數學術語上的關係。為什麼這麼說?因為關係型資料庫是以關係模型為基礎,而關係模型是以集合論和謂詞邏輯兩大數學理論為依據的。集合論中,關係...
mysql確定集合查詢 mysql 面向集合查詢
l 面向集合的思想 sql是為查詢和管理關係型資料庫中的資料而專門設計的一種標準語言。我們通常認為的關係型是說的資料庫中表與表的關係,這個理解是有問題的,這裡的關係其實是數學術語上的關係。為什麼這麼說?因為關係型資料庫是以關係模型為基礎,而關係模型是以集合論和謂詞邏輯兩大數學理論為依據的。集合論中,...