在MySQL 官网彩蛋中学习intersect和except语法

2023年 8月 15日 35.1k 0

##

在MySQL 官网彩蛋中学习intersect和except语法

在最新的 MySQL 版本(8.0.31)中,MySQL 添加了对 SQL 标准INTERSECT和EXCEPT表运算符的支持,让我们案例出发并寻找MySQL官网的彩蛋.

1、环境准备
1.1、创建表

CREATE TABLE `new` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`tacos` int DEFAULT NULL,
`sushis` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

1.2、插入数据

root@localhost [db01] (16:56:42) > insert into new values(1,'Kenny',NULL,10);
Query OK, 1 row affected (0.01 sec)

root@localhost [db01] (16:56:49) > insert into new values(2,'Miguel',5,0);
Query OK, 1 row affected (0.01 sec)

root@localhost [db01] (16:57:13) > insert into new values(3,'lefred',4,5);
Query OK, 1 row affected (0.00 sec)

root@localhost [db01] (16:57:30) > insert into new values(4,'Kajiyamasan',null,10);
Query OK, 1 row affected (0.01 sec)

root@localhost [db01] (16:57:51) > insert into new values(5,'Scott',10,null);
Query OK, 1 row affected (0.01 sec)

root@localhost [db01] (16:58:07) > insert into new values(6,'Lenka',null,null);
Query OK, 1 row affected (0.01 sec)

root@localhost [db01] (16:58:21) > commit;
Query OK, 0 rows affected (0.00 sec)

root@localhost [db01] (16:58:23) > select * from new;
+----+-------------+-------+--------+
| id | name | tacos | sushis |
+----+-------------+-------+--------+
| 1 | Kenny | NULL | 10 |
| 2 | Miguel | 5 | 0 |
| 3 | lefred | 4 | 5 |
| 4 | Kajiyamasan | NULL | 10 |
| 5 | Scott | 10 | NULL |
| 6 | Lenka | NULL | NULL |
+----+-------------+-------+--------+
6 rows in set (0.00 sec)

1.3、查询语句

(query 1) select * from new where tacos>0;
(query 2) select * from new where sushis>0;

2、INTERSECT
2.1、INTERSECT语法

query_expression_body INTERSECT [ALL | DISTINCT] query_expression_body
[INTERSECT [ALL | DISTINCT] query_expression_body]
[...]

query_expression_body:
See Section 13.2.14, “Set Operations with UNION, INTERSECT, and EXCEPT”

INTERSECT与UNION一样,如果既没有 指定DISTINCT也没有ALL指定,则默认为DISTINCT。

2.2、INTERSECT案例

root@localhost [db01] (16:58:32) > select * from new where tacos>0 intersect select * from new where sushis>0;
+----+--------+-------+--------+
| id | name | tacos | sushis |
+----+--------+-------+--------+
| 3 | lefred | 4 | 5 |
+----+--------+-------+--------+
1 row in set (0.00 sec)

在以前版本的 MySQL 上,此类查询的结果将是:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near 'intersect select * from new where sushis > 0' at line 1

3、except
3.1、except语法

query_expression_body EXCEPT [ALL | DISTINCT] query_expression_body
[EXCEPT [ALL | DISTINCT] query_expression_body]
[...]

query_expression_body:
See Section 13.2.14, “Set Operations with UNION, INTERSECT, and EXCEPT”

except与UNION一样,如果既没有 指定DISTINCT也没有ALL指定,则默认为DISTINCT。

3.2、except案例

root@localhost [db01] (16:59:11) > select * from new where tacos > 0 except select * from new where sushis > 0;
+----+--------+-------+--------+
| id | name | tacos | sushis |
+----+--------+-------+--------+
| 2 | Miguel | 5 | 0 |
| 5 | Scott | 10 | NULL |
+----+--------+-------+--------+
2 rows in set (0.00 sec)

4、官网彩蛋

https://dev.mysql.com/doc/refman/8.0/en/except.html
As with UNION and INTERSECT, if neither DISTINCT nor ALL is specified, the default is DISTINCT.

https://dev.mysql.com/doc/refman/8.0/en/intersect.html
As with UNION and EXCEPT, if neither DISTINCT nor ALL is specified, the default is DISTINCT.

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论