sql中连接方式
在sql中,主要有五种连接类型,每种连接在处理表之间的关系时有不同的行为。一下是详细的解释和比较。
1. INNER JOIN(内连接) 直接join默认也是内连接
描述:返回两个表中匹配的行
结果:只返回两个表中共用的记录
图示:两个集合的交集部分
语法:
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager dm ON e.emp_no = dm.emp_no
WHERE dm.emp_no IS NULL;
2. LEFT JOIN (左连接)
描述:返回左表的所有行+右表的匹配行
结果:左表所有记录+匹配的右表记录(无匹配则为NULL)
图示:左表全集+右表交集部分
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
3. RIGHT JOIN(右连接)
描述:返回右表的所有行+左表的匹配行
结果:右表所有记录+匹配的左表记录(无匹配则为NULL)
图示:右表全集+左表交集部分
语法:
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
4. FULL OUTER JOIN (全外连接)
描述:返回两个表的所有行
结果:左表所有记录+右表所有记录(无匹配则为NULL)
图示:两个集合的并集
语法:
SELECT columns
FROM table1
FULL OUTER JOIN table2 ON table1.column = table2.column;
5. CORSS JOIN (交叉连接)
描述:返回两个表的笛卡尔积
结果:左表每行与右表每行组合
图示:两个集合的所有可能组合
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
连接类型对比表
连接类型 | 别名 | 返回结果 | 使用场景 |
---|---|---|---|
INNER JOIN | JOIN | 仅匹配的行 | 查找相关数据 |
LEFT JOIN | LEFT OUTER JOIN | 左表所有行 + 匹配的右表行 | 包含所有左表记录 |
RIGHT JOIN | RIGHT OUTER JOIN | 右表所有行 + 匹配的左表行 | 包含所有右表记录 |
FULL OUTER JOIN | FULL JOIN | 两个表的所有行 | 合并两个数据集 |
CROSS JOIN | 所有可能的行组合(笛卡尔积) | 生成所有组合 |
特殊连接方式:
1. SELF JOIN(自连接)
表与自身连接
常用于层级数据(如员工-经理关系)
SELECT A.name, B.name AS manager
FROM employees A
JOIN employees B ON A.manager_id = B.emp_id;
2. NATURAL JOIN (自然连接)
自动匹配相同名称的列
不推荐使用(隐式连接条件可能导致意外结果)
SELECT columns
FROM table1
NATURAL JOIN table2;
连接条件类型
1 等值连接:使用等号(=)的连接方式
2 非等值连接:使用其他的运算符(>,<,BETWEEN等)
3 Thete连接:任意条件的连接
实际应用示例
-- 查找所有非部门经理的员工
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager dm ON e.emp_no = dm.emp_no
WHERE dm.emp_no IS NULL;-- 查找所有员工及其部门(包括无部门的员工)
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;