第十一章 连接查询和分组查询

连接查询和分组查询 分组查询

select 列

from <表名>

where ......

group by 列

注意: 跟order by 一样 group by后面可以写多个列 写多个列则按照多列分组 having:对分组之后的结果进行筛选

having 必须卸载group by后面,没有group by having也不能写

对查询的列,要么出现在聚合函数,要么出现在分组,否则会出错

一条SQL语句同时出现where group by having order by 则排序顺序为:

select...from 表名 ...where...group by...having...order by

在使用select查询的时候,有时需要对数据进行分组汇总(即:将现有的数据技照某列来汇总统计),这时就需要用到group by语句。select语句中可以使用arouoby语行动开动行不的日。然后,使用聚组函数返回每个组的汇总信息。11分组一般都和聚合函数连用,

select.........from <表名>

where.......

group by.........

1.------请从学生表中查询出每个班的班级Id和班级人数:

select

tsClassID as 班级id,

班级人数 = count(*)

from TSudent

group by tsClassID;

------请统计出,所有学生中男同学与女同学的人数分别是多少:

select

性别=tsgender,

人数=count(*)

from TblStudent

group by tsgender

2.------请从学生表中查询出每个班的班级ID和班级中男同学的人数:

select

班级id = tsclassid,

男同学人数=count(*)

from TblStudent

where tsgender = ‘男’

group by tsclassid


select

sum(tsage),

性别 = tsgender,

人数 = count(*)

from TblStudent

group by tsgender

------当使用了分组语句(group by)或者是聚合函数的时候,

在select的查询列表中不能在包含其他列名,

除非该列同时也出现在了group by子句中,或者该列也包含在了某个聚合函数中

GROUP BY子句必须放到WHERE语句的之后,Group By与Order By都是对筛选后的数据进行处理,而Where是用来筛选数据的。

没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的(聚合函数除外)

 

 where和having的区别:

(1)位置:

where可以用于select、update、delete和insert into values(select * from table where ..)语句中。
having只能用于select语句中
(2)执行顺序:
where的搜索条件是在执行语句进行分组之前应用
having的搜索条件是在分组条件后执行的
即如果where和having一起用时,where会先执行,having后执行
(3)子句的区别:
where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;
having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以

总结:
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行

连接查询

多表联接查询实际上是通过各个表之间共同列的关联性来查询数据的

A.内连接:

在where子句中指定连接条件

select 列名1,列名2… from 表1,表2

where 表1.列 = 表2.列

-如有多表,from中多个表名用逗号隔开,where中多个关系中用 and 连接

在from子句中使用inner join…on

select 列名1,列名2… from 表1 inner join 表2

on 表1.列 = 表2.列

!!!注意:如果两个表中的列名相同,在语句中如果查询这一列,需要写表名.列名

内连接查询语句:

select   ......                                           select        .......

from     表1                         等               from    表1,表2

inner join     表2                  价               where       ......

on  ......                           

表连接  :

select   表2.列名1,表2.列名2,表1.列名3

from 表1 as 别名,表2 as别名

where 表1.主键列= 表2.外键列

B.外连接:

左外连接:left join…on 或者left outer join…on

查询出左表所有的行,不仅仅是匹配的行。若左表某些数据在右表中没有对应的项,则以null填充

select 列名1,列名2… from 表1 left join 表2

on 表1.列 = 表2.列

右外连接:right join…on 或者right outer join…on

查询右表所有行,不仅仅是匹配的行。若右表的某些数据在左表中没有对应的项,则以null填充

select 列名1,列名2… from 表1 right join 表2

on 表1.列 = 表2.列

 

 

内外链接的主要区别就是 主要体现在返回数据上 内连接返回的是符合连接条件的数据和查询记录 内连接是等值链接 外连接是返回不符合链接的内容

多表联接查询实际上是通过各个表之间共同列的关联性来查询数据的