当前位置: 首页 > article >正文

SQL 表连接操作

SQL 表连接操作是数据库查询中一个非常重要的概念,它允许从多个表中检索相关数据。表连接的主要类型包括 INNER JOINLEFT JOIN(或 LEFT OUTER JOIN)、RIGHT JOIN(或 RIGHT OUTER JOIN)、FULL JOIN(或 FULL OUTER JOIN)以及 CROSS JOIN。下面是详细解释每种连接操作及其使用场景:

1. INNER JOIN(内连接)

功能

  • 返回两个表中都有匹配记录的行。

SQL 语法

SELECT columns
FROM table1
INNER JOIN table2
ON table1.common_column = table2.common_column;

示例

SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments
ON Employees.department_id = Departments.id;

结果

  • 仅返回 EmployeesDepartments 表中 department_idid 匹配的记录。
  • 如果 Employees 中的记录在 Departments 中没有匹配的记录,则该员工不会出现在结果中。
2. LEFT JOIN(左外连接)

功能

  • 返回左表的所有记录,以及右表中匹配的记录。如果右表中没有匹配记录,则结果中的右表字段为 NULL

SQL 语法

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;

示例

SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments
ON Employees.department_id = Departments.id;

结果

  • 返回所有 Employees 表中的记录,即使在 Departments 表中没有匹配的记录。
  • 如果 Employees 表中的记录在 Departments 表中没有对应的部门,则 department_name 字段为 NULL
3. RIGHT JOIN(右外连接)

功能

  • 返回右表的所有记录,以及左表中匹配的记录。如果左表中没有匹配记录,则结果中的左表字段为 NULL

SQL 语法

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;

示例

SELECT Employees.name, Departments.department_name
FROM Employees
RIGHT JOIN Departments
ON Employees.department_id = Departments.id;

结果

  • 返回所有 Departments 表中的记录,即使在 Employees 表中没有匹配的记录。
  • 如果 Departments 表中的记录在 Employees 表中没有对应的员工,则 name 字段为 NULL
4. FULL JOIN(全外连接)

功能

  • 返回两个表中的所有记录,左表和右表中没有匹配记录的部分将以 NULL 进行填充。

SQL 语法

SELECT columns
FROM table1
FULL JOIN table2
ON table1.common_column = table2.common_column;

示例

SELECT Employees.name, Departments.department_name
FROM Employees
FULL JOIN Departments
ON Employees.department_id = Departments.id;

结果

  • 返回 Employees 表和 Departments 表中的所有记录。
  • 如果某些记录在一个表中存在但在另一个表中没有对应记录,结果中的缺失部分将用 NULL 填充。
5. CROSS JOIN(交叉连接)

功能

  • 返回两个表的笛卡尔积,即左表的每一行与右表的每一行组合在一起。

SQL 语法

SELECT columns
FROM table1
CROSS JOIN table2;

示例

SELECT Employees.name, Projects.project_name
FROM Employees
CROSS JOIN Projects;

结果

  • 返回 Employees 表的每一行与 Projects 表的每一行的组合。
  • 这种连接方式生成的结果集可能非常大,通常用于特定的分析场景。
连接操作对性能的影响
  • INNER JOIN: 高效,通常在表上有索引的情况下执行快速,但可能丢失主表中的记录。
  • LEFT JOINRIGHT JOIN: 返回所有主表记录,可能会引入大量 NULL 值。性能受影响较大,尤其是当主表非常大时。
  • FULL JOIN: 性能较差,因为它需要返回两个表的所有记录,结果集可能非常大。
  • CROSS JOIN: 性能可能非常差,因为结果集的大小是两个表记录数量的乘积。
选择合适的连接类型
  • INNER JOIN: 当你只关心两个表中都存在的记录时使用。
  • LEFT JOIN: 当你需要保留左表的所有记录并查看右表的匹配情况时使用。
  • RIGHT JOIN: 当你需要保留右表的所有记录并查看左表的匹配情况时使用(较少用)。
  • FULL JOIN: 当你需要保留两个表的所有记录,无论是否有匹配时使用。
  • CROSS JOIN: 通常用于生成所有可能的组合,分析时使用。

http://www.kler.cn/a/455913.html

相关文章:

  • springboot maven 构建 建议使用 --release 21 而不是 -source 21 -target 21,因为它会自动设置系统模块的位置
  • Streamlining QA with Automated Testing for 3D Models
  • 简单发布一个npm包
  • ADC(三):注入组的使用
  • python编译为可执行文件
  • AMD | GPU | 深度学习 | 如何使用
  • 0055. shell命令--useradd
  • 【知识】cuda检测GPU是否支持P2P通信及一些注意事项
  • day20-yum精讲
  • Unity3D如何优化物理模拟?
  • Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N]……解决
  • springboot+mybatis的整合
  • 力扣矩阵-算法模版总结
  • LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中
  • 源码分析之Openlayers中GeometryCollection类
  • S5700 V600R024C00 配置指南-工业网络 PROFINET
  • docker项目部署流程(Vue+Spingboot)
  • this的指向问题
  • JVM 及内存管理:掌握 Java 8 的内存模型与垃圾回收机制
  • 【Spring】基于XML的Spring容器配置——FactoryBean的使用
  • 【MySQL】SQL 优化经验
  • Java高级工程师1380道面试题(附答案)分享
  • 一个简单的深度学习模型例程,使用Keras(基于TensorFlow)构建一个卷积神经网络(CNN)来分类MNIST手写数字数据集。
  • iOS Masonry对包体积的影响
  • 深入了解 Java 字符串:基础、操作与性能优化
  • 【Java数据结构】LinkedList与链表