group By
将数据根据指定字段进行分组,之后进行统计
用法:group by 字段名,这个不会显示所有,只保留每组第一条记录
利用统计函数来(聚合函数)做:
count()统计每组中数量,如果目标为null不统计,如果为*表示统计记录
avg(),max(),min()
eg:求每班人数,最大南陵,最矮身高,平均年龄
select class_id,count(*),max(stu_age),min(stu_height),acg(stu_age)from my_student group by class_id;
group by多分组
group by 字段1,字段2 ……,将数据按照字段一分组之后,再根据字段2来分组
分组默认是有排序的,是升序【可以用desc来改为降序】
回溯统计
基本语法:group by 字段[asc|desc] with rollup
如:select class_id,count(*)from my_student group by class_id with rollup;将每班人数得出,然后回溯一次,统计总人数
多分组回溯类似、
having
having 本质和while一样,
多使用在group by之后,可以针对分组数据进行统计筛选,可以使用聚合函数或者字段别名,但是where不行
select class_id,count(*) as number from my_student group by class_id having number>2
--查找班级人数大于2的班级和人数
having在group by之后,group by 在where之后,where之后所有操作都是内存操作
order by
语法:order by 字段 [asc|desc]
也可以多字段排序:order by 字段一 [asc|desc],字段二 [asc|desc]
limit
限制数量
limit n:获得前n条数据
limit m,n : 从m条开始n条
二.联合查询
select 语句 union [distinct|all] select 语句将两个语句合起来
永远只保留第一个句子所对应的语句
如果要使用order by ,每个语句必须用括号括起来,必须配合limit来使用
交叉连接
语法:语句一 cross join 语句二
两个语句进行笛卡尔积,所有字段都拼接起来、
内连接
从第一张表中,取出记录,再从另一张表中匹配。
语法:表1 [inner] join 表2 on 条件
内连接必须保证两边都可以匹配到,才可以取到
外连接outer join(左连接或者右连接)
按照某一张表作为主表,然后根据条件连接到另一张表来取到数据
左连接:坐标为主表,右连接同理
语法:表1 left/right join 表2 on 条件
using 关键字,在连接中,代替on
using对应的两张表中查询的字段是同名的,对于同名字段,在结果中只能保留一个
表1 left/right join 表2 using(名字)
三.子查询
in:主查询 where in(列子查询)
any:与in类似
<>any:表示不存在
some:与any一样
all:等于里面所有,<>all:不等于里面所有
例子:
行子查询:语法:基本语句 where (数据一,数据二)=(语句,可以使用函数)
eg:
exit :
语法:基本语句 where exists(条件)#exists返回0或者1