一、连接查询
1.内连接(INNER JOIN)
按照匹配风湿范围以下三种:
自然连接:
SELECT * FROM table_a a, table_b b;
SELECT * FROM table_a a INNER JOIN table_b b;
等值连接:
SELECT * FROM table_a a, table_b b WHERE a.id = b.id;
SELECT * FROM table_a a INNER JOIN table_b b ON a.id = b.id;
不等连接:
SELECT * FROM table_a a, table_b b WHERE a.id <> b.id;
SELECT * FROM table_a a INNER JOIN table_b b WHERE a.id <> b.id;
2.外连接(OUTER JOIN)
按照保留不匹配条件数据记录来源可以分为以下三种:
左外连接(LEFT OUTER JOIN):
SELECT * FROM table_a a LEFT JOIN table_b b WHERE ON a.id = b.id;
右外连接(RIGHT OUTER JOIN)
SELECT * FROM table_b b RIGHT JOIN table_a a WHERE ON a.id = b.id;
全外连接(FULL OUTER JOIN)
SELECT * FROM table_b b FULL JOIN table_a a WHERE ON a.id = b.id;
二、合并查询
1. UNION
将查询的数据合并在一起,并去除重复数据。
SELECT * FROM table_a a
UNION
SELECT * FROM table_b b;
2. UNION ALL
将查询数据合并在一起,不去除重复数据。
SELECT * FROM table_a a
UNION ALL
SELECT * FROM table_b b;
三、子查询
连接查询会若导致笛卡尔积过大,则需使用子查询来提升查询效率。
1.单行单列的子查询
SELECT * FROM table_a a
WHERE a.age > (
SELECT b.age FROM table_b b
WHERE b.name = 'sixgod');
2.单行多列子查询
SELECT * FROM table_a a
WHERE (a.name, a.age) = (
SELECT b.name, b.age FROM table_b b
WHERE b.id = 1);
3.多行单列子查询
-- 使用IN
SELECT * FROM table_a a
WHERE a.name IN (
SELECT b.name FROM table_b b
WHERE b.age = 1);
-- 使用ANY
-- =ANY与IN相同
-- >ANY 查询比子查询中返回数据中最小的值还要大的值
-- >=ANY 查询比子查询中返回数据中最大的值还要小的值
SELECT * FROM table_a a
WHERE a.name ANY(
SELECT b.name FROM table_b b
WHERE b.age = 1);
-- 使用ALL
-- >ALL 查询比子查询中返回数据中最大的还要大的数据
-- <ALL 查询比子查询中返回数据中最小的还要小的数据
SELECT * FROM table_a a
WHERE a.name > ALL(
SELECT b.name FROM table_b b
WHERE b.age = 1);
-- 使用EXISTS
-- EXISTS是一个布尔类型,当返回结果时为true,不返回结果时为false。查询时EXISTS对外表采用遍历的方式逐条查询,
-- 每次查询都会比较EXISTS的条件语句,当EXISTS里的条件语句返回记录行时则为真,此时返回当前遍历到记录。
-- 反之EXISTS里的条件语句不能返回记录行,则丢弃当前遍历到的记录。
SELECT * FROM table_a a
WHERE EXISTS(
SELECT * FROM table_b b
WHERE b.id = a.id);
4.多行多列子查询
-- 将子查询当做一个临时表进行连接查询
SELECT * FROM table_a a
INNER JOIN (
SELECT * FROM table_b b
WHERE b.age = 1) c
ON a.name = c.name;