DQL语句(六) -- 连接查询
一、含义
当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from 表1,表2
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
二、分类
按年代分类:
sql92
等值连接
非等值连接
自连接
也支持一部分外连接(用于 orcale、sqlserver,mysql 不支持)
sql99【推荐使用】
内连接
等值连接
非等值连接
自连接
外连接
左外连接
右外连接
全外连接(MySQL 不支持,也不报错)
交叉连接
三、SQL92 语法
1、等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key = 表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
①一般为表起别名
②多表的顺序可以调换
③n 表连接至少需要 n - 1个连接条件
④等值连接的结果是多表的交集部分
2、非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
3、自连接
语法:
select 查询列表
from 表 别名1,表 别名2
where 别名1.key = 别名2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
四、SQL99 语法
1、内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
inner 可以省略,写不写都代表是内连接
特点:
①表的顺序可以调换
②内连接的结果 = 多表的交集
③n 表连接至少需要 n - 1个连接条件
2、外连接(左外连接、右外连接、全外连接 )
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
①查询的结果 = 主表中所有的行,如果从表和它匹配的将显示匹配行,如果没有匹配的则显示 null
②left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行
3、交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:
类似于笛卡尔乘积