mysql 如何獲取兩個集合的交集/差集/並集
mysql的常見場景,獲取兩個數據集的交集和差集
步驟
1、兩個集合的結構要一致,對應的字段數,字段類型
2、將兩個集合用 UNION ALL 關鍵字合並,這裡的結果是有重復的所有集
3、將上面的所有集 GROUP BY id
4、最後 HAVING COUNT(id)=1,等於1的意思是隻出現瞭一次,所以這個是差集,如果等於2,那麼就是交集
代碼演示
差集
下面的sql有明顯的問題,不過這個隻是一個示意,
從一個表中查詢不需要用到交集和差集,條件可以合並在一起直接查詢出來的.能明白意思就好
下面的sql的意思是找到所有非技術部的員工的id,code和name
SELECT a.* FROM( SELECT id,code,name FROM test_emp UNION ALL SELECT id,code,name FROM test_emp WHERE dept='JSB' )a GROUP BY a.id HAVING COUNT(a.id)=1
交集
下面的sql的意思是找到所有技術部年齡大於25的員工
SELECT a.* FROM( SELECT id,code,name FROM test_emp WHERE age>25 UNION ALL SELECT id,code,name FROM test_emp WHERE dept='JSB' )a GROUP BY a.id HAVING COUNT(a.id)=2
並集
下面的sql的意思是找到所有技術部的員工和年齡大於30的員工
union可以自動去除重復的內容,得到不重復的結果集
SELECT a.* FROM( SELECT id,code,name FROM test_emp WHERE age>25 UNION SELECT id,code,name FROM test_emp WHERE dept='JSB' )a
mysql中交集,並集,差集,左連接,右連接
學習mysql也有一個月啦,在這個月中,都是按照需求對數據表進行一些基本操作,在這個過程當中,經常使用到左連接,右連接,交集,取差集等,現在對其基本操作進行歸納總結。
數據源:
表一:
id name sex age
1 mike1男 34
1 mike2 男 23
1 mike3 女 24
2 mike1 男 46
2 mike2 男 35
2 mike3 男 42
2 mike4 男 62
3 mike1 女 45
4 mike5 男 72
5 mike4 女 23
表二:
id school
1 北京大學
2 清華大學
3 哈佛大學
7 MIT
左連接:
根據某個等值條件,對表進行連接。本實驗是在id相同的情況下進行左連接
code:
select a.*,b.school FROM (SELECT * FROM mike1.test001) a LEFT JOIN (SELECT id,school FROM mike1.test003 ) b ON a.id=b.id
結果如下:以表1為根基,對表2進行連接,匹配相同的id號
右連接:
以表2為根基,通過id相同的字段對其進行右連接。
code:
select a.*,b.school FROM (SELECT * FROM mike1.test001) a right JOIN (SELECT id,school FROM mike1.test003 ) b ON a.id=b.id
結果:
你們覺得結果是有問題還是沒有問題呢?
交集:
通過id號相同,對表1和表2進行內連接,取相同的部分,不相同的部分省略掉。
code:
select a.*,b.school FROM (SELECT * FROM mike1.test001) a inner JOIN (SELECT id,school FROM mike1.test003 ) b ON a.id=b.id
結果:
差集:
差集用的還是比較多的,類似於我們數學中學的,交、合、並等集合的操作。
code1:取表2與表1相同的部分,是我們上面取交集的第二種方法。
select a.id,a.name,a.sex,a.age,b.school FROM (SELECT * FROM mike1.test001) a LEFT OUTER join (SELECT id,school FROM mike1.test003 ) b ON a.id=b.id WHERE b.id IS NOT null
結果:
code2:取表1中的id在表2中的id的差值,最後列出數據。
select a.id,a.name,a.sex,a.age,b.school FROM (SELECT * FROM mike1.test001) a LEFT OUTER join (SELECT id,school FROM mike1.test003 ) b ON a.id=b.id WHERE b.id IS null
結果:
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。