分组查询

一、语法

select 分组函数,分组后的字段

from 表

【where 筛选条件】

group by 分组的字段

【having 分组后的筛选】

【order by 排序列表】

 

 

二、特点

 

               使用关键字         筛选的表     位置

分组前筛选      where             原始表       group by的前面

分组后筛选      having            分组后的结果  group by 的后面

 

 

连接查询

一、含义

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

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 别名;

 

特点:

类似于笛卡尔乘积