首页 > 数据库 > 数据库开发技术 > 五种主流数据库:集合运算

两个查询结果集中字段的数量必须相同。
两个查询结果集中对应字段的类型必须匹配或兼容。SQLite 使用动态数据类型,不要求字段类型匹配或兼容。
SELECT column1, column2, ...
FROM table1
INTERSECT [DISTINCT | ALL]
SELECT col1, col2, ...
FROM table2;
CREATE TABLE t_set1
(
id INTEGER,
name VARCHAR(10)
);
INSERT INTO t_set1 VALUES (1, 'apple');
INSERT INTO t_set1 VALUES (2, 'banana');
INSERT INTO t_set1 VALUES (3, 'orange');
CREATE TABLE t_set2
(
id INTEGER,
name VARCHAR(10)
);
INSERT INTO t_set2 VALUES (1, 'apple');
INSERT INTO t_set2 VALUES (2, 'banana');
INSERT INTO t_set2 VALUES (4, 'pear');
SELECT id, name
FROM t_set1
INTERSECT
SELECT id, name
FROM t_set2;
id|name
--|------
1|apple
2|banana
SELECT DISTINCT t1.id, t1.name
FROM t_set1 t1
JOIN t_set2 t2
ON (t2.id = t1.id AND t2.name = t1.name);
SELECT id
FROM t_set1
INTERSECT
SELECT id, name
FROM t_set2;
SELECT id, id
FROM t_set1
INTERSECT
SELECT id, name
FROM t_set2;
SELECT column1, column2, ...
FROM table1
UNION [DISTINCT | ALL]
SELECT col1, col2, ...
FROM table2;
SELECT id, name
FROM t_set1
UNION
SELECT id, name
FROM t_set2;
id|name
--|------
1|apple
2|banana
3|orange
4|pear
-- Oracle、Microsoft SQL Server、PostgreSQL 以及 SQLite
SELECT COALESCE(t1.id, t2.id), COALESCE(t1.name, t2.name)
FROM t_set1 t1
FULL JOIN t_set2 t2
ON (t2.id = t1.id AND t2.name = t1.name);
SELECT id, name
FROM t_set1
UNION ALL
SELECT id, name
FROM t_set2;
id|name
--|------
1|apple
2|banana
3|orange
1|apple
2|banana
4|pear
-- MySQL 和 SQLite
SELECT 1 AS id
UNION ALL
SELECT 'sql' AS name;
id
---
1
sql
SELECT column1, column2, ...
FROM table1
EXCEPT [DISTINCT | ALL]
SELECT col1, col2, ...
FROM table2;
SELECT id, name
FROM t_set1
EXCEPT
SELECT id, name
FROM t_set2;
-- Oracle
SELECT id, name
FROM t_set1
MINUS
SELECT id, name
FROM t_set2;
id|name
--|------
3|orange
SELECT t1.id, t1.name
FROM t_set1 t1
LEFT JOIN t_set2 t2
ON (t2.id = t1.id AND t2.name = t1.name)
WHERE t2.id IS NULL;
-- 集合运算中的错误排序子句
SELECT id, name
FROM t_set1
ORDER BY id
UNION ALL
SELECT id, name
FROM t_set2;
SELECT id, name
FROM t_set1
UNION ALL
SELECT id, name
FROM t_set2
ORDER BY id;
id|name
--|------
1|apple
1|apple
2|banana
2|banana
3|orange
4|pear
按照 SQL 标准,交集运算符(INTERSECT)的优先级高于并集运算符(UNION)和差集运算符(EXCEPT)。但是 Oracle 和 SQLite 中所有集合运算符的优先级相同。
相同的集合运算符按照从左至右的顺序执行。
使用括号调整多个集合运算符的执行顺序。
-- Microsoft SQL Server、PostgreSQL 以及 SQLite
SELECT 1 AS n
UNION ALL
SELECT 1
INTERSECT
SELECT 1;
n
-
1
1
n
-
1
SELECT 1 AS n
UNION ALL
SELECT 1
UNION
SELECT 1;
n
-
1
SELECT 1 AS n
UNION
SELECT 1
UNION ALL
SELECT 1;
n
-
1
1
-- MySQL、Oracle、Microsoft SQL Server 和 PostgreSQL
SELECT 1 AS n
UNION ALL
(SELECT 1
INTERSECT
SELECT 1);
n
-
1
1
原文作者:SQL编程思想;如有侵权,请联系管理员删除。