mysql 如何獲取兩個(gè)集合的交集/差集/并集
mysql的常見(jiàn)場(chǎng)景,獲取兩個(gè)數(shù)據(jù)集的交集和差集
步驟
1、兩個(gè)集合的結(jié)構(gòu)要一致,對(duì)應(yīng)的字段數(shù),字段類(lèi)型
2、將兩個(gè)集合用 UNION ALL 關(guān)鍵字合并,這里的結(jié)果是有重復(fù)的所有集
3、將上面的所有集 GROUP BY id
4、最后 HAVING COUNT(id)=1,等于1的意思是只出現(xiàn)了一次,所以這個(gè)是差集,如果等于2,那么就是交集
代碼演示
差集
下面的sql有明顯的問(wèn)題,不過(guò)這個(gè)只是一個(gè)示意,
從一個(gè)表中查詢(xún)不需要用到交集和差集,條件可以合并在一起直接查詢(xún)出來(lái)的.能明白意思就好
下面的sql的意思是找到所有非技術(shù)部的員工的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的意思是找到所有技術(shù)部年齡大于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的意思是找到所有技術(shù)部的員工和年齡大于30的員工
union可以自動(dòng)去除重復(fù)的內(nèi)容,得到不重復(fù)的結(jié)果集
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中交集,并集,差集,左連接,右連接
學(xué)習(xí)mysql也有一個(gè)月啦,在這個(gè)月中,都是按照需求對(duì)數(shù)據(jù)表進(jìn)行一些基本操作,在這個(gè)過(guò)程當(dāng)中,經(jīng)常使用到左連接,右連接,交集,取差集等,現(xiàn)在對(duì)其基本操作進(jìn)行歸納總結(jié)。
數(shù)據(jù)源:
表一:
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 北京大學(xué)
2 清華大學(xué)
3 哈佛大學(xué)
7 MIT
左連接:
根據(jù)某個(gè)等值條件,對(duì)表進(jìn)行連接。本實(shí)驗(yàn)是在id相同的情況下進(jìn)行左連接
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
結(jié)果如下:以表1為根基,對(duì)表2進(jìn)行連接,匹配相同的id號(hào)
右連接:
以表2為根基,通過(guò)id相同的字段對(duì)其進(jìn)行右連接。
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
結(jié)果:
你們覺(jué)得結(jié)果是有問(wèn)題還是沒(méi)有問(wèn)題呢?
交集:
通過(guò)id號(hào)相同,對(duì)表1和表2進(jìn)行內(nèi)連接,取相同的部分,不相同的部分省略掉。
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
結(jié)果:
差集:
差集用的還是比較多的,類(lèi)似于我們數(shù)學(xué)中學(xué)的,交、合、并等集合的操作。
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
結(jié)果:
code2:取表1中的id在表2中的id的差值,最后列出數(shù)據(jù)。
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
結(jié)果:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL學(xué)習(xí)筆記之創(chuàng)建、刪除、修改表的方法
這篇文章主要介紹了MySQL學(xué)習(xí)筆記之創(chuàng)建、刪除、修改表的方法,結(jié)合實(shí)例分析了mysql創(chuàng)建表、增加,修改及刪除列、查看表結(jié)構(gòu)、刪除表等基本語(yǔ)法與使用技巧,需要的朋友可以參考下2016-09-09MySQL 數(shù)據(jù)庫(kù) binLog 日志的使用操作
binlog是MySQL數(shù)據(jù)庫(kù)中的一種日志類(lèi)型,它記錄了數(shù)據(jù)庫(kù)中的所有更改操作,例如插入、更新、刪除操作,本文給大家介紹MySQL 數(shù)據(jù)庫(kù) binLog 日志的使用,感興趣的朋友一起看看吧2023-08-08防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案
這篇文章主要介紹了防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案,結(jié)合實(shí)踐介紹了Replication和Monitor以及Failover這三個(gè)項(xiàng)目的應(yīng)用,需要的朋友可以參考下2015-06-06mysql誤刪數(shù)據(jù)后快速恢復(fù)的辦法推薦
手抖不小心把表里的數(shù)據(jù)刪除或修改錯(cuò)誤怎么辦?該如何快速恢復(fù)呢?遇到這樣的問(wèn)題怎么辦?下面這篇文章主要給大家介紹了關(guān)于mysql誤刪數(shù)據(jù)后快速恢復(fù)的相關(guān)資料,需要的朋友可以參考下2023-02-02MySql數(shù)據(jù)庫(kù)查詢(xún)中的特殊命令
本文給大家介紹了MySql數(shù)據(jù)庫(kù)查詢(xún)中的特殊命令,包括mysql的安裝,特殊查詢(xún)語(yǔ)句,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11MySQL專(zhuān)用服務(wù)器自動(dòng)配置參數(shù)的實(shí)現(xiàn)
本文主要介紹了MySQL專(zhuān)用服務(wù)器自動(dòng)配置參數(shù)的實(shí)現(xiàn),MySQL8.0推出了專(zhuān)用數(shù)據(jù)庫(kù)服務(wù)器自動(dòng)配置參數(shù),通過(guò)打開(kāi)innodb_dedicated_server,下面就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09mysql 5.7.17 winx64.zip安裝配置方法圖文教程
這篇文章主要為大家分享了mysql 5.7.17 winx64.zip安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2017-02-02