问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MySQL多表查询详解:从基础概念到实战应用

创作时间:
作者:
@小白创作中心

MySQL多表查询详解:从基础概念到实战应用

引用
1
来源
1.
https://cloud.tencent.com/developer/article/2406989?policyId=1004

多表查询是数据库操作中的一项重要技能,特别是在处理复杂的业务逻辑和关联数据时。本文将深入探讨多表查询的相关概念、语法和实际案例,帮助读者掌握如何灵活运用多表查询来满足各种业务需求。

多表关系

在项目开发中,数据库表结构设计会根据业务需求及业务模块之间的关系进行分析和设计。由于业务之间相互关联,各个表结构之间也存在着各种联系。基本可分为以下三种:

  • 一对多(多对一):例如部门与员工的关系,一个部门对应多个员工,一个员工对应一个部门。实现方式是在多的一方建立外键,指向一的一方的主键。

  • 多对多:例如学生与课程的关系,一个学生可以选修多门课程,一门课程也可以供多个学生选择。实现方式是建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。

  • 一对一:例如用户与用户详情的关系,一对一关系多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。实现方式是在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。

多表查询概述

概述

多表查询就是指从多张表中查询数据。例如,查询单表数据的SQL形式为:

select * from emp;

那么要执行多表查询,就只需要使用逗号分隔多张表即可,如:

select * from emp, dept;

此时,查询结果中包含了大量的结果集,总共102条记录,而这其实就是员工表emp所有的记录(17条)与部门表dept所有记录(6条)的所有组合情况,这种现象称之为笛卡尔积。

笛卡尔积是指在数学中,两个集合A集合和B集合的所有组合情况。

而在多表查询中,我们需要消除无效的笛卡尔积,只保留两张表关联部分的数据。

在SQL语句中,可以通过给多表查询加上连接查询的条件来去除无效的笛卡尔积:

select * from emp, dept where emp.dept_id = dept.id;

分类

  • 连接查询

  • 内连接:相当于查询A、B交集部分数据

  • 外连接:

  • 左外连接:查询左表所有数据,以及两张表交集部分数据

  • 右外连接:查询右表所有数据,以及两张表交集部分数据

  • 自连接:当前表与自身的连接查询,自连接必须使用表别名

  • 子查询

内外连接

内连接

内连接查询的是两张表交集部分的数据。内连接的语法分为两种:隐式内连接、显式内连接。

隐式内连接

SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

显式内连接

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;

案例

A. 查询每一个员工的姓名及关联的部门的名称(隐式内连接实现)

select emp.name, dept.name from emp, dept where emp.dept_id = dept.id;
-- 为每一张表起别名,简化SQL编写
select e.name, d.name from emp e, dept d where e.dept_id = d.id;

B. 查询每一个员工的姓名及关联的部门的名称(显式内连接实现)

select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
-- 为每一张表起别名,简化SQL编写
select e.name, d.name from emp e join dept d on e.dept_id = d.id;

表的别名
①. tablea as 别名1, tableb as 别名2
②. tablea 别名1, tableb 别名2

注意事项:一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。

外连接

外连接分为两种,分别是:左外连接和右外连接。

左外连接

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;

左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。

右外连接

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;

右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

案例

A. 查询emp表的所有数据和对应的部门信息

select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;
select e.*, d.name from emp e left join dept d on e.dept_id = d.id;

B. 查询dept表的所有数据和对应的员工信息(右外连接)

select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;
select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;

注意事项:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。

全篇总结

本文详细介绍了多表查询中的一对多、多对多和一对一关系,以及内连接和外连接的概念和语法结构,并通过具体案例演示了多表查询的实际应用。通过学习本文,读者可以掌握如何使用多表查询来获取关联数据,并了解如何消除无效的笛卡尔积,从而提高数据库查询的效率和准确性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号