MySQL?8.0新特性之集合操作符INTERSECT和EXCEPT
前言
最近幾年,MySQL 不斷致力于兼容 SQL 標(biāo)準(zhǔn)。例如 MySQL 8.0 中的窗口函數(shù)、通用表表達(dá)式、檢查約束等等。
最新發(fā)布的 MySQL 8.0.31 繼續(xù)對 SQL 語句進(jìn)行了增強(qiáng),提供了缺失已久的兩個集合操作符:INTERSECT 和 EXCEPT。
交集操作符(INTERSECT)
INTERSECT 操作符用于返回兩個查詢結(jié)果中的共同部分,即同時出現(xiàn)在第一個查詢結(jié)果和第二個查詢結(jié)果中的數(shù)據(jù),并且對最終結(jié)果進(jìn)行了去重操作。交集運(yùn)算的示意圖如下:

其中,1 和 2 是兩個查詢中都存在的數(shù)據(jù);因此交集運(yùn)算的結(jié)果只包含 1 和 2。
我們創(chuàng)建一個年度優(yōu)秀員工表(excellent_emp),用于演示集合操作:
CREATE TABLE excellent_emp(
year INT NOT NULL,
emp_id INTEGER NOT NULL,
CONSTRAINT pk_excellent_emp PRIMARY KEY (YEAR, emp_id)
);
INSERT INTO excellent_emp VALUES (2018, 9);
INSERT INTO excellent_emp VALUES (2018, 11);
INSERT INTO excellent_emp VALUES (2019, 9);
INSERT INTO excellent_emp VALUES (2019, 20);
以下示例用于查找 2018 年和 2019 年都是優(yōu)秀員工的員工編號:
SELECT emp_id
FROM excellent_emp
WHERE year = 2018
INTERSECT
SELECT emp_id
FROM excellent_emp
WHERE year = 2019;
emp_id|
------|
9|
其中,INTERSECT 表示交集運(yùn)算。第一個查詢語句返回了 9 和 11,第二個查詢語句返回了 9 和 20,最終結(jié)果返回共同的 9。集合操作返回的字段名由第一個語句決定,此處兩個語句擁有相同的字段名(emp_id)。
對于 MySQL 5.7 以及之前的版本,以上示例可以改寫為等價的連接查詢:
SELECT t1.emp_id
FROM excellent_emp t1
JOIN excellent_emp t2
ON (t1.emp_id = t2.emp_id
AND t1.year = 2018
AND t2.year = 2019);
emp_id|
------|
9|
交集運(yùn)算都可以改寫為等價的等值內(nèi)連接查詢。
INTERSECT 操作符的完整語法如下:
SELECT ... INTERSECT [ALL | DISTINCT] SELECT ... [INTERSECT [ALL | DISTINCT] SELECT ...]
ALL 選項表示保留查詢結(jié)果集中的重復(fù)記錄,DISTINCT 選項表示去除查詢結(jié)果集中的重復(fù)記錄,默認(rèn)選項為 DISTINCT。
另外,INTERSECT 操作符的優(yōu)先級比 UNION 和 EXCEPT 更高,因此以下兩種寫法等價:
TABLE r EXCEPT TABLE s INTERSECT TABLE t; TABLE r EXCEPT (TABLE s INTERSECT TABLE t);
關(guān)于 INTERSECT 操作符的更多信息,可以參考官方文檔。
差集操作符(EXCEPT)
EXCEPT 操作符用于返回出現(xiàn)在第一個查詢結(jié)果中,但不在第二個查詢結(jié)果中的記錄,并且對最終結(jié)果進(jìn)行了去重操作。差集運(yùn)算的示意圖如下:

第一個查詢的結(jié)果中只有 3 沒有出現(xiàn)在第二個查詢的結(jié)果中,因此差集運(yùn)算的結(jié)果只保留了 3。
以下語句查找 2019 年被評為優(yōu)秀,但是 2018 年不是優(yōu)秀的員工:
SELECT emp_id
FROM excellent_emp
WHERE year = 2019
EXCEPT
SELECT emp_id
FROM excellent_emp
WHERE year = 2018;
emp_id|
------|
20|
查詢結(jié)果顯示,只有 20 號員工是 2019 年新晉的優(yōu)秀員工。
對于 MySQL 5.7 以及之前的版本,以上示例可以改寫為等價左外連接查詢:
SELECT t1.emp_id
FROM excellent_emp t1
LEFT JOIN excellent_emp t2 ON (t1.emp_id = t2.emp_id AND t2.year = 2018)
WHERE t1.year = 2019
AND t2.emp_id IS NULL;
emp_id|
------|
20|
其中,左外連接返回了所有的優(yōu)秀員工;然后利用 WHERE 條件找出其中 2019 年是優(yōu)秀但 2018 年不是優(yōu)秀的員工。
EXCEPT 操作符的完整語法如下:
SELECT ... EXCEPT [ALL | DISTINCT] SELECT ... [EXCEPT [ALL | DISTINCT] SELECT ...]
ALL 選項表示保留查詢結(jié)果集中的重復(fù)記錄,DISTINCT 選項表示去除查詢結(jié)果集中的重復(fù)記錄,默認(rèn)選項為 DISTINCT。
關(guān)于 INTERSECT 操作符的更多信息,可以參考官方文檔。
總結(jié)
到此這篇關(guān)于MySQL 8.0新特性之集合操作符INTERSECT和EXCEPT的文章就介紹到這了,更多相關(guān)MySQL8.0 INTERSECT和EXCEPT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
超詳細(xì)mysql left join,right join,inner join用法分析
比較詳細(xì)的mysql的幾種連接功能分析,只要你看完就能學(xué)會的好東西2008-08-08
MySQL gh-ost DDL 變更工具的實(shí)現(xiàn)
本文主要介紹了MySQL gh-ost DDL變更工具的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
mysql 5.7.5 m15 winx64.zip安裝教程
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.5 m15 winx64.zip安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
gearman + mysql方式實(shí)現(xiàn)持久化操作示例
這篇文章主要介紹了gearman + mysql方式實(shí)現(xiàn)持久化操作,簡單描述了持久化的概念、原理,并結(jié)合實(shí)例形式分析了gearman + mysql持久化操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-02-02
CentOS Linux更改MySQL數(shù)據(jù)庫目錄位置具體操作
由于MySQL的數(shù)據(jù)庫太大,默認(rèn)安裝的/var盤已經(jīng)再也無法容納新增加的數(shù)據(jù),沒有辦法,只能想辦法轉(zhuǎn)移數(shù)據(jù)的目錄,本文整理了一些MySQL從/var/lib/mysql目錄下面轉(zhuǎn)移到/home/mysql_data/mysql目錄的具體操作,感興趣的你可不要走開啊2013-01-01
安裝mysql出錯”A Windows service with the name MySQL already exis
這篇文章主要介紹了安裝mysql出錯”A Windows service with the name MySQL already exists.“如何解決的相關(guān)資料,在日常項目中此問題比較多見,特此把解決辦法分享給大家,供大家參考2016-05-05
MySQL中crash safe數(shù)據(jù)完整性機(jī)制面試精講
這篇文章主要為大家介紹了MySQL數(shù)據(jù)完整性crash safe特性面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
MySQL慢查詢?nèi)罩?Slow Query Log)的實(shí)現(xiàn)
慢查詢?nèi)罩居脕碛涗浽?nbsp;MySQL 中執(zhí)行時間超過指定時間的查詢語句,本文就來介紹一下MySQL慢查詢?nèi)罩?nbsp;的使用,感興趣的可以了解一下2024-08-08

