26-数据库多表链接
数据库多表链接¶
统计信息:字数 4603 阅读10分钟
问题¶
前端发出一个 API 请求,希望查询到多个信息,多个信息分别在不同的数据库表中保存,如果执行多条 SQL 语句性能不好,那么可以使用多表链接查询,实现一个 SQL 语句获取多个数据库表的信息。
实现原理¶
不同数据库表中有主键,外键等字段,那么两个数据库表中通常某个字段是相同的(例如用户 ID),然后可以查询这两个数据库表,然后把结果取交集,并集,左集,右集,就能返回对应的结果。
对应术语¶
交集——内连接(INNER JOIN)
并集——全外连接(FULL JOIN),全连接,联合查询(UNION)
左集(左侧集合全部+交集)—— 左外连接(LEFT JOIN)
右集(右侧集合全部+交集)—— 右外连接(RIGHT JOIN)
内连接¶
on 表示两个数据库表匹配的条件
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
左外连接¶
select column_name(s) from table1 left join table2 on table1.column = table2.column;
右外连接¶
select column_name(s) from table2 right join table1 on table2.column_name = table1.column_name;
联合查询¶
联合查询将两个或多个表中的数据合并成一个结果集,不包括重复的行。要求每个表中的列数和数据类型必须完全一致。联合查询的语法为
select column_names from table1 union select column_names from table2;
各个连接的区别¶
连接方式 | 含义 | 结果 | 左表 | 右表 | 参与条件 | 是否保留未匹配数据 |
---|---|---|---|---|---|---|
内连接(INNER JOIN) | 只返回两个表中存在匹配的行 | 匹配的行 | 表 A | 表 B | ON 条件 | 否 |
左外连接(LEFT JOIN) | 返回左表中所有行和右表中与左表匹配的行 | 匹配的行+左表未匹配行 | null 值 | 表 A | 表 B | ON 条件 |
右外连接(RIGHT JOIN) | 返回右表中所有行和左表中与右表匹配的行 | 匹配的行+右表未匹配行 | null 值 | 表 A | 表 B | ON 条件 |
全连接(FULL OUTER JOIN) | 返回左表和右表中所有的行,如果匹配,则返回匹配的行 | 匹配的行+左表未匹配行+右表未匹配行 | null 值 | 表 A | 表 B | ON 条件 |
交叉连接(CROSS JOIN) | 返回两个表中所有匹配的行 | 笛卡尔积 | 表 A | 表 B | 无(不需要条件) | 否 |
联合查询(UNION) | 把两个表中的结果集合并在一起并去重 | 合并且去重后的行 | 表 A | 表 B | 无(两个表结构和列数必须一致) | 否 |
代码案例¶
-- 创建表 A 并插入数据
CREATE TABLE A (
id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO A VALUES (1, 'Alice');
INSERT INTO A VALUES (2, 'Bob');
INSERT INTO A VALUES (3, 'Cathy');
INSERT INTO A VALUES (4, 'David');
INSERT INTO A VALUES (5, 'Edward');
-- 创建表 B 并插入数据
CREATE TABLE B (
id INT PRIMARY KEY,
age INT
);
INSERT INTO B VALUES (2, 25);
INSERT INTO B VALUES (3, 30);
INSERT INTO B VALUES (4, 35);
INSERT INTO B VALUES (6, 40);
-- 内连接查询
SELECT A.id, A.name, B.age
FROM A
INNER JOIN B
ON A.id = B.id;
-- 左连接查询
SELECT A.id, A.name, B.age
FROM A
LEFT JOIN B
ON A.id = B.id;
-- 右连接查询
SELECT A.id, A.name, B.age
FROM A
RIGHT JOIN B
ON A.id = B.id;
-- 全连接查询
SELECT A.id, A.name, B.age
FROM A
FULL OUTER JOIN B
ON A.id = B.id;
-- 交叉连接查询
SELECT A.id, A.name, B.age
FROM A
CROSS JOIN B;
-- 联合查询
SELECT id, name
FROM A
UNION
SELECT id, NULL AS name
FROM B;
参考¶
https://www.runoob.com/sql/sql-join.html
https://blog.csdn.net/aqiuisme/article/details/132500884
Last update:
November 9, 2024