眾所周知的幾個結果集集合操作命令,今天詳細地測試了一下,發現一些問題,記錄備考。
假設我們有乙個表student,包括以下欄位與資料:
drop table student;
create table student
id int primary key,
name nvarchar2(50) not null,
score number not null
insert into student values(1,'aaron',78);
insert into student values(2,'bill',76);
insert into student values(3,'cindy',89);
insert into student values(4,'damon',90);
insert into student values(5,'ella',73);
insert into student values(6,'frado',61);
insert into student values(7,'gill',99);
insert into student values(8,'hellen',56);
insert into student values(9,'ivan',93);
insert into student values(10,'jay',90);
commit;
union和union all的區別。select
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
結果將是
1 aaron 78
2 bill 76
3 cindy 89
4 damon 90
5 ella 73
如果換成union all連線兩個結果集,則返回結果是:
1 aaron 78
2 bill 76
3 cindy 89
3 cindy 89
4 damon 90
5 ella 73
可以看到,union和union all的區別之一在於對重複結果的處理。
接下來我們將兩個子查詢的順序調整一下,改為
--union
select *
from student
where id > 2 and id < 6
union
select *
from student
where id < 4
看看執行結果是否和你期望的一致?
--union all
select *
from student
where id > 2 and id < 6
union all
select *
from student
where id < 4
那麼這個呢?
據此我們可知,區別之二在於對排序的處理。union
all將按照關聯的次序組織資料,而union將進行依據一定規則進行排序。那麼這個規則是?我們換個查詢方式看看:
select score,id,name
from student
where id > 2 and id < 6
union
select score,id,name
from student
where id < 4
結果如下:
73 5 ella
76 2 bill
78 1 aaron
89 3 cindy
90 4 damon
和我們預料的一致:將會按照欄位的順序進行排序。之前我們的查詢是基於id,name,score的字段順序,那麼結果集將按照id優先進行排序;而現在新的字段順序也改變了查詢結果的排序。並且,是按照給定欄位a,b,c...的順序進行的order
select score,id,name
from student
where id > 2
union
select score,id,name
from student
where id < 4
結果如下:
56 8 hellen
61 6 frado
73 5 ella
76 2 bill
78 1 aaron
89 3 cindy
90 4 damon
90 10 jay
93 9 ivan
99 7 gill
可以看到,對於score相同的記錄,將按照下乙個欄位id進行排序。如果我們想自行控制排序,是不是用order
by指定就可以了呢?答案是肯定的,不過在寫法上有需要注意的地方:
select score,id,name
from student
where id > 2 and id < 7
union
select score,id,name
from student
where id < 4
union
select score,id,name
from student
where id > 8
order by id desc
order
by子句必須寫在最後乙個結果集裡,排序時,必須使用第乙個查詢語句中的欄位名、字段序號,並且其排序規則將改變操作後的排序結果.
(1)union中的所有選擇列表必須具有相同列數、相似資料型別和相同的順序 出現。
(2) 列名來自第乙個select語句。
(3) 若union中包含order by子句,則將對整個結果集排序。
(4)在合併結果時,將從結果集中刪除重複行。若使用all,結果集中包含所有 的行。
對於union、union all、intersect、minus都有效。
intersect和minus的操作和union基本一致,這裡一起總結一下:
union,對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序;
union all,對兩個結果集進行並集操作,包括重複行,不進行排序;
intersect,對兩個結果集進行交集操作,不包括重複行,同時進行預設規則的排序;
minus,對兩個結果集進行差操作,不包括重複行,同時進行預設規則的排序。
可以在最後乙個結果集中指定order by子句改變排序方式。
intersect運算:返回查詢結果中相同的部分exp:各個部門中有哪些相同的工種
select job from 部門1
intersect
select job from 部門2
intersectselect
job from 部門3;
oracle:minus運算: 返回在第乙個查詢結果中與第二個查詢結果不相同的那部分行記錄。在部門1中有,而在部門2中沒有的工種
exp:select job from 部門1
minusselect
job from 部門2;
mysq集合差操作 MySQL差集MINUS運算子
在本教程中,您將了解sql minus運算子以及如何使用join來模擬mysql minus運算子來求差集。sql minus操作員介紹 minus是包括,和minus在內的sql標準中的三個操作符之一。minus比較兩個查詢的結果,返回在第乙個查詢結果集中,但不是第二個查詢結果集中的行記錄,也就是...
mysq集合差操作 Python 基礎(集合)
st set hello world 建立乙個唯一字元的集合 st type st set st set 關注 點讚 點讚 點讚 在看 st 集合物件的一些方法 方法說明set.add elmnt 增加乙個新元素到集合裡,elmnt要新增的元素。set.updata set 把set中元素更新到原集...
順序表集合的交並差操作
1.用順序表表示集合,設計乙個演算法實現集合的求交集運算 void intersection sqlist a,sqlist b,sqlist c int i,j,k k記錄c中的元素個數 for i 0 i2.用順序表表示集合,設計乙個演算法實現集合的求並集運算 void union sqlist...