[2025.1.25 MySQL学习] 多表查询
多表查询
多表关系
多表关系分为三种:
- 一对多/多对一
- 部门和员工,一个部门对应多个员工
- 在多的一方建立外键,指向一方的主键
- 多对多
- 学生和课程,一个学生可以选多个课程,一个课程也可以被多个学生选
- 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一
- 用户与用户中间的关系
- 用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
- 在任意一方加入外键,关联另外一方主键,并且设置外键为唯一的(UNIQUE)
多表查询概述
即从多表中查询数据(笛卡尔积),多表查询时,需要消除无效的笛卡尔积
多表查询分类
- 连接查询
- 内连接:相当于查询A、B交集部分数据
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
- 子查询
1、内连接(交集)
- 隐式内连接
- 显式内连接
- ps:一旦给表起了别名,不能再通过表名索取字段
2、外连接
- 左外连接
- 右外连接
3、自连接
4、联合查询
5、子查询
- 概念:SQL中嵌套SELECT语句,称为嵌套查询,又称为子查询
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT中的任何一个
-
根据子查询结果,可以分为:
- 标量子查询(查询结果为单个值)
- 列子查询(查询结果为一列)
- 行子查询(查询结果为一行)
- 表子查询(查询结果为多行多列)
-
根据子查询网位置,可以分为
- WHERE之后
- FROM之后
- SELECT之后
6、标量子查询
- 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,例如:
-- select id from dept where name = '销售部'
-- 此时子查询只返回一个id : 4
select * from emp where dept_id = 4;
- 上述语句可以用(子查询)代替4,就是标量子查询
7、列子查询
- 子查询返回结果为一列(可以是多行)
select id from dept where name = '销售不' or name = '市场部';
select * from emp where dept_id in (2, 4);
- 上述(2,4),可以用(列子查询)代替,子查询结果(2、4)为一列
8、行子查询
- 子查询返回的结果是一行(可以是多列)
select salary, manageid from emp where name = '员工a';
-- 拿到员工a的薪资和id,为一行多列信息
select * from emp where (salary, manageid) = (12500, 1);
上述(12500,1),可以用(行子查询)代替,子查询结果(12500、1)为一行
9、表子查询
- 子查询结果为多行多列
select job, salary from emp where name = '员工a' or name = '员工b';
-- 此处子查询结果不止一行一列
select * from emp where (job, salary) in (select job, salary from emp where name = '员工a' or name = '员工b');