2.6 DQL 连接查询

一、含义

当查询中涉及到了多个表的字段,需要使用多表连接

select 字段1,字段2

from 表1,表2,...;

笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
 
 
 
 

二、分类

 
按年代分类:
    sql92
  •                等值
  •                非等值
  •                自连接
 
         也支持一部分外连接(用于oracle、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 等值的连接条件
   【and 筛选条件】
   【group by 分组字段】
   【having 分组后的筛选】
   【order by 排序字段】
 
 

四、SQL99语法

1、内连接

语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
 
特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③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 别名;
 
特点:
类似于笛卡尔乘积
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/huabro/p/12624209.html