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

mysql学习教程,从入门到精通,SQL 联表查询(Join)(21)

1、SQL 联表查询(Join)

在编写SQL联表查询(Join)时,我们首先要明确查询的目的,即我们需要从哪些表中提取数据,以及这些表之间如何关联。以下是一个简单的示例,假设我们有两个表:employees(员工表)和departments(部门表)。我们的目标是查询出每个员工的姓名、部门ID以及他们所属的部门名称。

1.1、表结构

employees 表

  • employee_id INT:员工ID
  • name VARCHAR:员工姓名
  • department_id INT:部门ID
    departments 表
  • department_id INT:部门ID
  • department_name VARCHAR:部门名称

1.2、SQL 联表查询

为了实现我们的目标,我们可以使用 INNER JOIN(内连接),因为它会返回两个表中匹配的记录。如果员工所属的部门在 departments 表中存在,则该员工的信息及其部门名称将被返回。

SELECT  
    e.name AS employee_name,  
    e.department_id,  
    d.department_name  
FROM  
    employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

1.3、解释

  1. SELECT 语句:我们选择了 employees 表中的 name 列(重命名为 employee_name),department_id 列,以及 departments 表中的 department_name 列。
  2. FROM 语句:指定了查询的起始表为 employees,并且我们为这个表设置了一个别名 e,以便在后续的查询中简化引用。
  3. INNER JOIN 语句:通过 INNER JOIN 语句将 employees 表与 departments 表连接起来。连接条件是 e.department_id = d.department_id,即 employees 表中的 department_id 列的值必须等于 departments 表中的 department_id 列的值。同样,我们也为 departments 表设置了一个别名 d
  4. ON 子句:指定了 JOIN 的条件,即如何连接这两个表。在这个例子中,条件是员工所属的部门ID与部门表中的部门ID相匹配。
    通过这种方式,我们可以得到每个员工及其所属部门的名称,结果集将只包含那些在 departments 表中有对应部门ID的 employees 表中的记录。如果你想要包括那些在 departments 表中没有对应部门ID的 employees 表中的记录(例如,那些尚未分配部门的员工),你可以使用 LEFT JOIN 替代 INNER JOIN。
    当然可以,以下是一些具体的SQL联表查询(Join)案例,这些案例将展示不同类型的JOIN操作(如INNER JOIN、LEFT JOIN、RIGHT JOIN等)在实际应用中的使用。

1.4、案例一:INNER JOIN(内连接)

场景:查询所有已分配部门的员工及其部门名称。
表结构

  • employees 表:包含员工ID、员工姓名和部门ID。
  • departments 表:包含部门ID和部门名称。
    SQL查询
SELECT  
    e.employee_id,  
    e.name AS employee_name,  
    d.department_name  
FROM  
    employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

结果:返回所有在 departments 表中有对应部门ID的 employees 表中的记录,包括员工ID、员工姓名和部门名称。

1.5、案例二:LEFT JOIN(左连接)

场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工。

SQL查询

SELECT  
    e.employee_id,  
    e.name AS employee_name,  
    d.department_name  
FROM  
    employees e  
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:返回 employees 表中的所有记录,对于在 departments 表中没有对应部门ID的员工,其部门名称将显示为NULL。

1.6、案例三:RIGHT JOIN(右连接)

注意:在实际应用中,RIGHT JOIN 较少使用,因为可以通过交换表的位置和使用LEFT JOIN来达到相同的效果。但为了完整性,这里还是给出一个例子。
场景:查询所有部门及其对应的员工姓名(如果有的话)。
SQL查询

SELECT  
    d.department_id,  
    d.department_name,  
    e.name AS employee_name  
FROM  
    departments d  
RIGHT JOIN employees e ON d.department_id = e.department_id;

结果:返回 departments 表中的所有记录,对于在 employees 表中没有对应员工的部门,其员工姓名将显示为NULL。但请注意,这个查询在逻辑上与将 employeesdepartments 表的位置互换并使用LEFT JOIN是等效的。

1.7、案例四:FULL JOIN(全连接)

注意:并非所有数据库系统都支持FULL JOIN,但可以通过UNION操作结合LEFT JOIN和RIGHT JOIN来模拟。
场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工和那些没有员工的部门。
模拟FULL JOIN的SQL查询

SELECT  
    e.employee_id,  
    e.name AS employee_name,  
    d.department_name  
FROM  
    employees e  
LEFT JOIN departments d ON e.department_id = d.department_id  
UNION  
SELECT  
    e.employee_id,  
    e.name AS employee_name,  
    d.department_name  
FROM  
    employees e  
RIGHT JOIN departments d ON e.department_id = d.department_id  
WHERE e.employee_id IS NULL; -- 排除LEFT JOIN中已经包含的记录

但请注意,上面的查询实际上并不完全正确,因为它会尝试从RIGHT JOIN中选择NULL的 employee_id,这在大多数情况下并不是我们想要的。一个更准确的模拟FULL JOIN的方法是分别执行LEFT JOIN和RIGHT JOIN,并确保RIGHT JOIN部分只选择那些在LEFT JOIN中未出现的记录(这通常涉及到子查询或临时表)。然而,为了简洁起见,这里不展示完整的模拟过程。
在实际应用中,如果数据库支持FULL JOIN,可以直接使用它,如下所示:

SELECT  
    e.employee_id,  
    e.name AS employee_name,  
    d.department_name  
FROM  
    employees e  
FULL JOIN departments d ON e.department_id = d.department_id;

这将返回两个表中的所有记录,对于不匹配的记录,相应的字段将显示为NULL。


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

相关文章:

  • MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?
  • Web安全之SQL注入---基础
  • ReactPress技术揭秘
  • AI绘画经验(stable-diffusion)
  • Go开发指南-Gin与Web开发
  • arkUI:遍历数据数组动态渲染(forEach)
  • Apache ZooKeeper 及 Curator 使用总结
  • 谷歌云推出全新区块链RPC服务:简化Web3开发
  • 设置VsCode搜索时排除文件,文件列表中隐藏文件
  • 5 php7.4中开发一个websocket 聊天 好友例表展示
  • 兼职副业想挖漏洞该用什么工具?零基础入门到精通,收藏这一篇就够了
  • python 实现support vector machines支持向量机算法
  • node-red-L1-如何设置让局域网可以访问?
  • 人工智能有助于解决 IT/OT 集成安全挑战
  • 世优科技“1+2+N”,助力湖南旅发大会“火出圈”
  • provide 和 inject
  • Kafka技术详解[3]: 生产与消费数据
  • 液体泄漏泼溅检测系统源码分享
  • 接口测试学习随笔 .. ..哪些参数为必填,以及接口测试中参数的含义.. ..
  • HarmonyOS Next鸿蒙扫一扫功能实现
  • Kubernetes监控、日志记录和运行时安全:CKS考试核心知识点实践
  • 【车联网安全】车端网络攻击及检测的框架/模型
  • 9月24日笔记
  • 探索未来的IT发展方向:技术与创新的融合
  • AI绘画+副业:让您的手机壁纸、微信头像都充满了个性,姓氏头像,情侣壁纸等
  • Chat2DB:AI驱动SQL编辑器,开启智能数据库管理新时代