含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果m*n行
发生原因:没有有效的连接条件
如何避免:没有有效的连接条件
分类:
按年代分类:
sql92标准【仅仅支持内连接】
sql99标准【推荐】:支持内连接+外连接(左外+右外)+交叉连接 可读性高
按功能分类:
1.内连接:等值连接 非等值连接 自连接
2.外连接:左外连接 右外连接 全外连接
3.交叉连接
为表起别名:1.提高语句的简洁度2.区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
两个表的顺序可以交换
可以实现三表连接
一、sql92标准
1.等值连接
多表等值连接的结果为多表的交集部分
n表连接,至少需要n-1个连接条件
多表的顺序没有要求
一般需要为表起别名
可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:1.一般为表起别名2.多表的顺序可以调换3.n表连接至少需要n-1个连接条件4.等值连接的结果是多表的交集部分
2.非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
3.自连接
语法:
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
二、sql99语法
语法:
select 查询列表
from 表1 别名
【连接类型】join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
limit 子句
分类:
内连接:inner
【特点:1.添加排序、分组、筛选2.inner可以省略3.筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读4.inner join 连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
表的顺序可以调换
内连接的结果=多表的交集
n表连接至少需要n-1个连接条件】
外连接
【应用场景:用于查询一个表中有,另一个表没有的记录
特点:
1.外连接的查询结果为主表中的所有记录,
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2.左外连接,left join左边的是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的发展
4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
全外连接,两边都是主表
5.一般用于查询除了交集部分的剩余的不匹配的行】
左外:left[outer]
右外:right[outer]
全外:full[outer]
交叉连接:cross
特点:类似于笛卡尔乘积



