兩個集合根據屬性取差集 SQL高階知識 集合

2021-10-18 04:34:29 字數 2107 閱讀 2736

集合是由乙個和多個元素構成的整體,在sql server中的表就代表著事實集合,而其中的查詢就是在集合的基礎上生成的結果集。sql server的集合包括交集(intersect),並集(union),差集(except)。

可以對兩個或多個結果集進行連線,形成「交集」。返回左邊結果集和右邊結果集中都有的記錄,且結果不重複(這也是集合的主要特性)

交集限制條件

我們用以下兩個表中的資料作為示例

取以上兩個表的交集,我們可以這樣寫sql

select * from  city1 

intersect

select * from city2

結果如下:

其中北京和上海是上面兩個表共有的結果集。

這和我們的內連線(inner join)有點類似,以上sql也可以這樣寫

select c1.* from city1 c1

inner join city2 c2

on c1.cno=c2.cno and c1.name=c2.name

結果與上面結果相同。

可以對兩個或多個結果集進行連線,形成「並集」。子結果集所有的記錄組合在一起形成新的結果集。其中使用union可以得到不重複(去重)的結果集,使用union all可能會得到重複(不去重)的結果集。

並集限制條件

還是以上面的city1和city2為例,取兩個表的並集,我們可以這樣寫sql:

select * from  city1 

union

select * from city2

結果如下:

我們看到,北京和上海去掉了重複的記錄,只保留了一次

我們再看看使用union all會怎麼樣?

select * from  city1 

union all

select * from city2

結果如下:

與上面的union相比,union all僅僅是對兩個表作了拼接而已,北京和上海依然在下面重複出現了,而且細心的讀著應該發現了,union還會對結果進行排序,而union all不會。

可以對兩個或多個結果集進行連線,形成「差集」。返回左邊結果集合中已經有的記錄,而右邊結果集中沒有的記錄。

差集限制條件

以city1和city2為例,我們想取city1(左表)和city2(右表)的差集,可以這樣寫sql:

select * from  city1 

except

select * from city2

結果如下:

我們看到,因為北京和上海在兩個表都存在,差集為了只顯示左表中有的,而右表中沒有的,就把這兩個給過濾掉了。

此外我們常說的關聯條件其實也是集合的一種,是通過子表的笛卡爾積按不同的關聯條件過濾之後得到的結果集。有興趣的同學可以閱讀一下《microsoft sql server 2008技術內幕 t-sql查詢》,這本書中有關於集合論的具體闡述。

集合是我們資料處理過程中的理論基礎,可以通過集合的觀點去很好的理解不同的查詢語句。每乙個物理表就是乙個集合,當我們要對錶進行操作的時候,將它們看成對集合的操作就很好理解了。

兩個List取差集

兩個物件list,直接比較是不行的,因為他們存的位址不一樣 需要重寫gethashcode 與equals object obj 方法告訴電腦 public class model public string name public override intgethashcode public ov...

求兩個集合的差集

在c 語言的程式設計開發中,針對list集合的運算有時候需要計算兩個list集合的差集資料,集合的差集是取在該集合中而不在另一集合中的所有的項。a集合針對b集合的差集資料指的是所有在a集合但不在b集合的元素。在c 語言中可以使用except方法來計算兩個list集合的差集資料,簡單快捷只需要一條語句...

兩個集合求對稱差集

對稱差集,兩個集合的並集,減去交集。比如,集合1,2,3和集合3,3,4,5的對稱差是集合1,2,4,5。想到的解法,將兩個排序,兩個集合分別用兩個工作指標i,j。比較兩個指標指向的元素,相同就都後移,不相同,更小的指標後移。以下 給出了求對稱差集數量的 public static int dist...