mysql基本總結?作者:楊濤濤資深數據庫專家,專研 mysql 十餘年擅長 MySQL、PostgreSQL、MongoDB 等開源數據庫相關的備份恢複、SQL 調優、監控運維、高可用架構設計等目前任職于愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支持、MySQL 相關課程培訓等工作,現在小編就來說說關于mysql基本總結?下面内容希望能幫助到你,我們來一起看看吧!
作者:楊濤濤
資深數據庫專家,專研 mysql 十餘年。擅長 MySQL、PostgreSQL、MongoDB 等開源數據庫相關的備份恢複、SQL 調優、監控運維、高可用架構設計等。目前任職于愛可生,為各大運營商及銀行金融企業提供 MySQL 相關技術支持、MySQL 相關課程培訓等工作。
本文來源:原創投稿
*愛可生開源社區出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。
MySQL 8.0 最新小版本(8.0.31)支持标準SQL 的intersect(交集)和except(差集)操作。
交集: 也就是返回兩個結果集的相交部分,也即左側和右側同時存在的記錄。
差集:也就是返回兩個結果集中左側存在同時右側不存在的記錄。
之前在做其他數據庫往MySQL遷移的時候,經常遇到這樣的操作。由于MySQL 一直以來不支持這兩類操作符,一般得想辦法避開或者是通過其他方法來實現。
比如在MySQL 5.7.x 中,想要實現如下兩個需求:
第一、求表t1和表t2的交集,并且結果要去重;
第二、求表t1和表t2的差集,并且結果也要去重。
簡單創建表t1、表t2,并且插入幾條樣例數據:
<mysql:5.7.34:(ytt)> create table t1(c1 int);
Query OK, 0 rows affected (0.02 sec)
<mysql:5.7.34:(ytt)> create table t2 like t1;
Query OK, 0 rows affected (0.02 sec)
<mysql:5.7.34:(ytt)> insert t1 values (10),(20),(20),(30),(40),(40),(50);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
<mysql:5.7.34:(ytt)> insert t2 values (10),(30),(30),(50),(50),(70),(90);
Query OK, 7 rows affected (0.02 sec)
Records: 7 Duplicates: 0 Warnings: 0
<mysql:5.7.34:(ytt)> select * from t1;
------
| c1 |
------
| 10 |
| 20 |
| 20 |
| 30 |
| 40 |
| 40 |
| 50 |
------
7 rows in set (0.00 sec)
<mysql:5.7.34:(ytt)> select * from t2;
------
| c1 |
------
| 10 |
| 30 |
| 30 |
| 50 |
| 50 |
| 70 |
| 90 |
------
7 rows in set (0.00 sec)
我們來實現這兩個需求:
<mysql:5.7.34:(ytt)> select distinct t1.c1 from t1 join t2 using(c1);
------
| c1 |
------
| 10 |
| 30 |
| 50 |
------
3 rows in set (0.00 sec)
<mysql:5.7.34:(ytt)> select distinct t1.c1 from t1 left join t2 using(c1) where t2.c1 is null;
------
| c1 |
------
| 20 |
| 40 |
------
2 rows in set (0.00 sec)
在最新版本MySQL 8.0.31中,直接用intersect 和except兩個新操作符即可,寫起來非常簡單。
創建好同樣的表結構和數據,用intersect來求交集:
<mysql:8.0.31:(ytt)>table t1 intersect table t2;
------
| c1 |
------
| 10 |
| 30 |
| 50 |
------
3 rows in set (0.00 sec)
用except來求差集:
<mysql:8.0.31:(ytt)>table t1 except table t2;
------
| c1 |
------
| 20 |
| 40 |
------
2 rows in set (0.00 sec)
intersect 和except操作符默認去重。比如需要保留原始結果,則可以帶上all 關鍵詞: 如下求兩表差集的結果會保留所有符合條件的記錄。
<mysql:8.0.31:(ytt)>table t1 except all table t2;
------
| c1 |
------
| 20 |
| 20 |
| 40 |
| 40 |
------
4 rows in set (0.00 sec)
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!