问:SQL中join语法的差异?

在SQL中,JOIN语法用于结合来自两个或多个表的数据。不同类型的JOIN会基于不同的条件来合并表中的数据。以下是几种常见的JOIN及其差异:

假设我们有两个表:employeesdepartments

employees:

employee_id name department_id
1 Alice 10
2 Bob 20
3 Charlie NULL
4 David 10

departments:

department_id department_name
10 HR
20 Engineering
30 Sales

1. INNER JOIN

INNER JOIN 只返回两个表中匹配的行。

sql 复制代码
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

结果:

name department_name
Alice HR
David HR
Bob Engineering

2. LEFT JOIN (或 LEFT OUTER JOIN)

LEFT JOIN 返回左表中的所有行以及右表中匹配的行。如果没有匹配,右表中的字段将为 NULL

sql 复制代码
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:

name department_name
Alice HR
Bob Engineering
Charlie NULL
David HR

3. RIGHT JOIN (或 RIGHT OUTER JOIN)

RIGHT JOIN 返回右表中的所有行以及左表中匹配的行。如果没有匹配,左表中的字段将为 NULL

sql 复制代码
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;

结果:

name department_name
Alice HR
David HR
Bob Engineering
NULL Sales

4. FULL JOIN (或 FULL OUTER JOIN)

FULL JOIN 返回两个表中的所有行,并在没有匹配时显示 NULL

sql 复制代码
SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;

结果:

name department_name
Alice HR
Bob Engineering
Charlie NULL
David HR
NULL Sales

5. CROSS JOIN

CROSS JOIN 返回两个表的笛卡尔积,即每个来自第一张表的行都会和第二张表中的每一行进行组合。

sql 复制代码
SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;

结果:

name department_name
Alice HR
Alice Engineering
Alice Sales
Bob HR
Bob Engineering
Bob Sales
Charlie HR
Charlie Engineering
Charlie Sales
David HR
David Engineering
David Sales

6. SELF JOIN

SELF JOIN 是表与自身的连接。假设我们要找到具有相同部门的员工。

sql 复制代码
SELECT e1.name AS employee1, e2.name AS employee2, e1.department_id
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.employee_id <> e2.employee_id;

结果:

employee1 employee2 department_id
Alice David 10
David Alice 10

每种JOIN都有其特定的用途,选择哪种JOIN取决于你希望如何合并表中的数据。

总结

Join 类型 语法 使用场景
INNER JOIN SELECT ... FROM table1 INNER JOIN table2 ON table1.column = table2.column; 当需要从两个表中获取匹配的行时。只返回两个表中都有匹配记录的行。
LEFT JOIN (或 LEFT OUTER JOIN) SELECT ... FROM table1 LEFT JOIN table2 ON table1.column = table2.column; 当需要从左表中获取所有行,并获取与右表匹配的行时。如果右表中没有匹配记录,则结果中右表的字段为NULL。
RIGHT JOIN (或 RIGHT OUTER JOIN) SELECT ... FROM table1 RIGHT JOIN table2 ON table1.column = table2.column; 当需要从右表中获取所有行,并获取与左表匹配的行时。如果左表中没有匹配记录,则结果中左表的字段为NULL。
FULL JOIN (或 FULL OUTER JOIN) SELECT ... FROM table1 FULL JOIN table2 ON table1.column = table2.column; 当需要从两个表中获取所有行,并获取它们之间匹配的行时。如果没有匹配记录,则结果中相应表的字段为NULL。
CROSS JOIN SELECT ... FROM table1 CROSS JOIN table2; 当需要生成两个表的笛卡尔积时,即每个来自第一张表的行都会和第二张表中的每一行进行组合。通常用于生成测试数据或进行某些特殊计算。
SELF JOIN SELECT ... FROM table1 AS alias1 JOIN table1 AS alias2 ON alias1.column = alias2.column; 当需要对同一个表进行连接操作时,通常用于查找表内的相关记录。例如,查找具有相同部门或相同兴趣的员工。

上述总结仅提供了基本的Join类型和语法示例。在实际使用中,可能还需要根据具体需求添加其他条件、过滤或排序等操作。此外,不同的数据库管理系统(DBMS)可能对Join操作有一些特殊的实现或优化,具体使用时,建议参考相应文档。

相关推荐
guslegend12 分钟前
SpringSecurity源码剖析
java
ohoy14 分钟前
mysql 30天自动补0
数据库·mysql
roman_日积跬步-终至千里1 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
大学生资源网1 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
JasmineWr1 小时前
JVM栈空间的使用和优化
java·开发语言
Hello.Reader1 小时前
Flink SQL DELETE 语句批模式行级删除、连接器能力要求与实战避坑(含 Java 示例)
java·sql·flink
爱笑的眼睛111 小时前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
Spring AI学习1 小时前
Spring AI深度解析(10/50):多模态应用开发实战
java·spring·ai
摇滚侠2 小时前
Redis 零基础到进阶,Redis 哨兵监控,笔记63-73
数据库·redis·笔记
利剑 -~3 小时前
mysql面试题整理
android·数据库·mysql