mysql_多表
-
多表定义:从2个表或者更多的表中查询需要的数据
-
多表连接的关系
- 内连接:
inner join【交集,两边都匹配才出数据】- 语句:
select * from 表1 inner join 表2 on 表1.关联字段=表2.关联字段 - 隐藏内连接:
select * from 表1,表2 where 表1.关联字段=表2.关联字段
- 语句:
- 左连接:
left join【左表全部,右表匹配不到为null】- 语句:
select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段
- 语句:
- 右连接:
right join【右表全部,左表匹配不到null】- 语句:
select * from 表1 right join 表2 on 表1.关联字段=表2.关联字段
❗️注意:
on写关联条件;where写过滤条件。left join 过滤右表数据放 on,不要放 where,否则会变成内连接。 - 语句:
- 左独有数据:
left join【只取左表有,右表没有的数据】- 语句:
select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段 where 表2.字段 is null
- 语句:
- 右独有数据:
riht join【只取右表有,左表没有的数据】- 语句:
select * from 表1 right join 表2 on 表1.关联字段=表2.关联字段 where 表1.字段 is null
- 语句:
- 全外连接【返回左表全部+右表全部】
- 包含3部分
- 两表交集|内连接【inner join】
- 左独有
- 右独有
- 内连接+左独有+右独有:
select * from 表1 inner join 表2 on 表1.关联字段=表2.关联字段 union select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段 where 表2.字段 is null union select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段 where 表1.字段 is null - 左连接+右独有:
select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段 union select * from 表1 right join 表2 on 表1.关联字段=表2.关联字段 where 表1.字段 is null - 右连接+左独有
select * from 表1 right join 表2 on 表1.关联字段=表2.关联字段 union select * from 表1 left join 表2 on 表1.关联字段=表2.关联字段 where 表2.字段 is nullunion:自动去除重复的交集行
UNION ALL不去重;右连接部分只拿右独有数据,避免交集重复出现
✅ 生产优先用UNION ALL,不需要全局去重,速度快。
-
子查询:select 里面嵌套另一个 select,嵌套的
select叫子查询(内查询),外面叫父查询(外查询)。子查询可以出现在:
WHERE、FROM、SELECT后面。 -
子查询分类
- 标量子查询:返回单个值(一行一列),用
=【通常放在where及select后】子查询只返回 1 个结果,用
=;如果返回多条,会报错。 - 列子查询:返回一列多行,用
in【通常放在where后】in:匹配集合中任意一个值。 - 行子查询:返回一行多字段【通常放在
where后】 - 表子查询【派生表|衍生表】:返回多行多列,把子查询当成一张虚拟表使用,放在
from后面⚠️必须写别名,不写报错!
应用场景:先分组统计,再对外层统计结果过滤。 - 相关子查询:子查询用到外层表的字段,子查询会循环执行。【exists /not exists】
select 1不需要查真实字段,只判断有没有数据,性能更好。
-
any | some | all 详解
运算符 含义 > any 大于子查询结果里任意一个 → 大于最小值就满足 >= any 大于等于最小值 < any 小于任意一个 → 小于最大值 <= any 小于等于最大值 = any 等于里面任意一个 → 等价 in > all 大于全部,必须大于最大值 < all 小于全部,必须小于最小值 != all / <>all 不等于全部,等价 not in
-
in等价=any -
not in等价!=any或》 -
any:满足集合中任意一个就可以 -
all:全部都要满足 -
some=any,两者完全一样。

浙公网安备 33010602011771号