用sql取a與b的交集 SQL高階知識 集合

2021-10-11 14:06:04 字數 2149 閱讀 9964

集合的定義

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

交集intersect

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

交集限制條件

交集示例

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

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

select * from city1 intersectselect * from city2
結果如下:

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

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

select c1.* from city1 c1inner join city2 c2 on c1.cno=c2.cno and c1.name=c2.name
結果與上面結果相同。

並集union

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

並集限制條件

union示例

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

select * from city1 union select * from city2
結果如下:

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

union all示例

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

select * from city1 union allselect * from city2
結果如下:

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

差集except

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

差集限制條件

差集示例

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

select * from city1 exceptselect * from city2
結果如下:

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

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

批註

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

INTERSECT 兩個單獨的sql取交集

union指令類似,intersect也是對兩個 sql 語句所產生的結果做處理的。不同的地方是,union基本上是乙個or 如果這個值存在於第一句或是第二句,它就會被選出 而intersect則比較像and 這個值要存在於第一句和第二句才會被選出 union是聯集,而intersect是交集。in...

兩個sql交集 SQL語句的多表查詢

1.練習如何合併連個表,注意使用union all語句表示保留重複項 2.內聯結 在from子句中同時使用了兩張表,並對每張表起了別名a和b,student as a 在列名中用 a.列名 表示某一句 from子句中用inner join表達內聯結,選取出同時存在於兩張表中的資料 on子句中表達兩個...

sql語句交集情況的查詢技巧

開發過程中涉及到了查詢字串交集的情況,不會寫這樣的sql,上網一搜,還真有例子。現在分享給大家。也許某一天你就會用到,交集表的字段就是 name no a 2,9 b 8,10 字串是str 0,1,2,3,4 接下來就是查 no欄位裡跟str裡有交集的記錄 查詢的結果就是name a的,no 2,...