mysql 两个查询结果合并去重_《MySQL 入门教程》第 21 篇 集合操作符
文章來源:https://blog.csdn.net/horses/article/details/108174837
來源平臺:CSDN
原文作者:不剪發的Tony老師
數據表與集合理論中的集合非常類似,表是由行組成的集合。SQL 標準定義了基于行的各種集合操作:并集運算(UNION)、交集運算(INTERSECT)和差集運算(EXCEPT)。
這些操作符都可以將兩個查詢的結果集合并成一個結果集,但是合并的規則各不相同,如下圖所示:
對于集合操作符,參與運算的兩個查詢結果需要滿足以下條件:
- 結果集中字段的數量和順序必須相同;
- 結果集中對應字段的類型必須匹配或兼容。
也就是說,兩個查詢結果的字段結構必須相同。如果一個查詢返回 2 個字段,另一個查詢返回 3 個字段,肯定無法合并。如果一個查詢返回數字類型的字段,另一個查詢返回字符類型的字段,通常也無法合并;不過 MySQL 可能會執行隱式的類型轉換。
21.1 并集(UNION)
UNION 操作符用于將兩個查詢結果合并成一個結果集,返回第一個查詢或者第二個查詢中的數據:
SELECT column1, column2, ... FROM table1 UNION [DISTINCT | ALL]SELECT col1, col2, ... FROM table2;其中,DISTINCT 表示將合并后的結果集進行去重;ALL 表示保留結果集中的重復記錄;如果省略,默認為 DISTINCT。例如:
CREATE TABLE t1(id int);INSERT INTO t1 VALUES (1), (2);CREATE TABLE t2(id int);INSERT INTO t2 VALUES (1), (3);SELECT id AS n FROM t1 UNION SELECT id AS m FROM t2;n|-|1|2|3|SELECT id AS n FROM t1 UNION ALLSELECT id AS m FROM t2;n|-|1|2|1|3|第一個查詢結果中只返回了一個數字 1;第二個查詢結果中保留了重復的數字 1。另外,UNION 操作返回的字段名由第一個 SELECT 語句決定。
以下語句由于兩個 SELECT 返回的字段數量不同而產生錯誤:
SELECT 1 AS n, 'a' AS sUNION ALLSELECT 1 AS m;ERROR 1222 (21000): The used SELECT statements have a different number of columns以下語句通過隱式類型轉換返回了合并之后的結果:
SELECT 1 AS n, 'a' AS sUNION ALLSELECT 1, 2;n|s|-|-|1|a|1|2|返回結果中的第二個字段類型為字符串。
對于多個表的 UNION 操作,按照從前到后的自然順序執行。例如:
SELECT 1 AS nUNION ALLSELECT 1UNION SELECT 1;n|-|1|由于第二個 UNION 操作沒有 ALL 選項,最終返回了去重之后的結果,也就是一個 1。
21.1.1 ORDER BY 和 LIMIT
如果要對整個 UNION 操作的結果進行排序和數量限定,可以將 ORDER BY 和 LIMIT 子句加到語句的最后。例如:
SELECT id AS n FROM t1UNION ALLSELECT id AS m FROM t2ORDER BY n;n|-|1|1|2|3|如果要對參與 UNION 的 SELECT 語句進行排序和數量限定,需要使用括號包含。例如:
(SELECT id AS n FROM t1 ORDER BY id DESC LIMIT 1)UNION ALL(SELECT id AS m FROM t2 ORDER BY id LIMIT 1);n|-|2|1|這種排序操作不會影響到最終的結果順序,如果要對最終結果進行排序,還需要在查詢語句的最后再加上一個 ORDER BY 子句。
21.2 交集(INTERSECT)
MySQL 沒有實現 SQL 標準中的 INTERSECT 操作符。按照定義,它可以返回兩個查詢結果中的共同部分,即同時出現在第一個查詢結果和第二個查詢結果中的數據:
SELECT DISTINCT table1.column1, table1.column2, ... FROM table1 JOIN table2 ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...);雖然 MySQL 不支持以上語法,但是我們可以通過 JOIN 查詢實現相同的結果。
SELECT DISTINCT table1.column1, table1.column2, ... FROM table1 JOIN table2 ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...);其中,DISTINCT 用于去除查詢結果中的重復記錄,實現和 INTERSECT 相同的效果。例如:
SELECT DISTINCT t1.idFROM t1JOIN t2 ON (t1.id = t2.id);id|--| 1|以上查詢返回了 t1 和 t2 的交集。
還有一種方法也可以實現相同的結果,就是使用 IN 或者 EXISTS 子查詢語句。例如:
SELECT DISTINCT idFROM t1WHERE id IN (SELECT id FROM t2);id|--| 1|21.3 差集(EXCEPT)
MySQL 沒有實現 SQL 標準中的 EXCEPT 操作符。按照定義,它可以返回出現在第一個查詢結果中,但不在第二個查詢結果中的數據:
SELECT column1, column2, ... FROM table1 EXCEPTSELECT col1, col2, ... FROM table2;雖然 MySQL 不支持以上語法,但是我們同樣可以通過 JOIN 查詢實現相同的結果。
SELECT column1, column2, ... FROM table1 LEFT JOIN table2 ON (table1.column1 = table2.col1 AND table1.column2 = table2.col2 ...) WHERE table2.col1 IS NULL;左外連接返回了 table1 中的所有數據,WHERE 條件排除了其中屬于 table2 的數據,從而實現了 EXCEPT 操作符的效果。例如:
SELECT t1.idFROM t1 LEFT JOIN t2 ON (t2.id = t1.id)WHERE t2.id IS NULL;id|--| 2|還有一種方法也可以實現相同的結果,就是使用 NOT IN 或者 NOT EXISTS 子查詢語句。例如:
SELECT DISTINCT idFROM t1WHERE id NOT IN (SELECT id FROM t2);id|--| 2|對了,在這里說一下,我目前是在職Java開發,如果你現在正在學習Java,了解Java,渴望成為一名合格的Java開發工程師,在入門學習Java的過程當中缺乏基礎入門的視頻教程,可以關注并私信我:01。獲取。我這里有最新的Java基礎全套視頻教程。
總結
以上是生活随笔為你收集整理的mysql 两个查询结果合并去重_《MySQL 入门教程》第 21 篇 集合操作符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql两者之间_Django和MyS
- 下一篇: mysql锁与性能_MySQL性能优化-