首先,新建两个表格并插入一些数据创建测试数据集:
-- 创建tableA测试数据集
CREATE TABLE tableA(
id INTEGER,
name varchar(16)
);
INSERT INTO tableA VALUES (1, 'Pirate');
INSERT INTO tableA VALUES (2, 'Monkey');
INSERT INTO tableA VALUES (3, 'Ninja');
INSERT INTO tableA VALUES (4, 'Spaghetti');
-- 创建tableB测试数据集
CREATE TABLE tableB(
id INTEGER,
name varchar(16)
);
INSERT INTO tableB VALUES (1, 'Rutabaga');
INSERT INTO tableB VALUES (2, 'Pirate');
INSERT INTO tableB VALUES (3, 'Darth Vade');
INSERT INTO tableB VALUES (4, 'Ninja');
-- 创建tableC测试数据集
CREATE TABLE tableC(
id INTEGER,
name varchar(16)
);
INSERT INTO tableC VALUES (1, 'Rutabaga');
INSERT INTO tableC VALUES (2, 'Pirate');
INSERT INTO tableC VALUES (3, 'Jack');
INSERT INTO tableC VALUES (4, 'Nike');
-- 取并集且去重
SELECT name FROM tableA
UNION
SELECT name FROM tableB;
-- 取并集且不去重
SELECT name FROM tableA
UNION ALL
SELECT name FROM tableB;
-- 取交集
SELECT name FROM tableA
INTERSECT
SELECT name FROM tableB;
-- 取差集
SELECT name FROM tableA
EXCEPT
SELECT name FROM tableB;
返回两个表中符合条件的交集。
SELECT * FROM tableA
INNER JOIN tableB ON tableA.name = tableB.name;
生成两个表的并集,对于没有匹配到的记录填充null
。
SELECT * FROM tableA
FULL OUTER JOIN tableB ON tableA.name = tableB.name;
生成左侧表得全集,对于右侧表没有匹配到的记录填充null
。
SELECT * FROM tableA
LEFT OUTER JOIN tableB ON tableA.name = tableB.name;
生成右侧表得全集,对于左侧表没有匹配到的记录填充null
。
SELECT * FROM tableA
RIGHT OUTER JOIN tableB ON tableA.name = tableB.name;
对两张表中的全部记录进行交叉组合,因此结果中的记录数通常是两张表中行数的乘积。
SELECT * FROM tableA
CROSS JOIN tableB;
假设查找tableC中name,既不存在与tableA又不存在于tableB。
SELECT name FROM tableC
WHERE name NOT IN(
SELECT name FROM tableA
UNION
SELECT name FROM tableB);
领取专属 10元无门槛券
私享最新 技术干货