group by 分组子句
形式:
group by 字段1 排序方式1,字段2 排序方式2, .....
通常都只进行一个字段的分组。
含义:
什么叫分组?就是将数据以某个字段的值为“依据”,分到不同的“组别”里。
分组的结果通常:
1,数据结果只能是“组”——没有数据本身的个体
2,数据结果就可能“丢失”很多特性,比如没有性别,身高,姓名,等等。
3,实际上,结果中通常只剩下“组”作为整体的信息:
首先是该组的本身依据值,
另外,这几个可能的值:组内成员的个数,组内某些字段的最大值,最小值,平均值,总和值。
其他字段,通常就不能用了。
4,如果是2个字段或以上分组,则其实是相当于对前一分组的组内,再进行后一依据的分组。
上述说明的结果,其实是反映在select语句中,就是select的“取出项”(输出项)就基本只剩下以上信息了
在分组查询中,基本都依赖于一下几个函数(聚合函数,统计函数):
count(*): 统计一组中的数量,通常用“*”做参数
max(字段名):获取该字段中在该组中的最大值。
min(字段名):获取该字段中在该组中的最小值。
sum(字段名):获取该字段中在该组中的总和。
avg(字段名):获取该字段中在该组中的平均值。
group_concat(字段名):获取该分组内的这个字段所有信息,每条逗号分隔
having子句
having子句其实概念跟where子句完全一样:
where是针对表的字段的值进行“条件判断”
having是只针对groupby之后的“组”数据进行条件判断,即
其不能使用:字段名>10
但可以使用:count(字段名)>10, 或 max(price) > 2000, 但如果字段是分组依据,也可以。
当然,通常也可以使用select中的有效的字段别名,比如:
select count(*) as f1 , max(f1) as f2 from tab1 group by f3 having f1 > 5 and f2 < 1000;
Order by子句
形式:
order by 排序字段1 [排序方式], 排序字段2 [排序方式], .....
说明:
对前面取得的数据(含from子句,where子句,group子句,having子句的所有结果)来指定按某个字段的大小进行排列(排序),排序只有2种方式:
正序: ASC(默认值),可以省略
倒序: DESC
如果指定多个字段排序(虽然不常见),则其含义是,在前一个字段排序中相同的那些数据里,再按后一字段的大小进行指定的排序。
limit子句
形式:
limit [起始行号start], 要取出的行数num
说明:
表示将前面取得的数据并前面排好之后(如果有),对之指定取得“局部连续的若干条”数据。
起始行号start:第一行的行号为0, 可以省略,则为默认行号(0)。
要取得的行数:如果结果集中从指定的行号开始到最后没有这么多行,则就只取到最后。
此子句非常有用——主要用于网页上最常见的一个需求(现象):分页。
分页原理:
分页的前提:人为指定每页显示的条数,$pageSize = 3;
显示(取得)第1页数据:select * from 表名 limit 0, $pageSize;
显示(取得)第2页数据:select * from 表名 limit 3, $pageSize;
显示(取得)第3页数据:select * from 表名 limit 6, $pageSize;
..................................................
显示(取得)第$n页数据:select * from 表名 limit ($n-1)*$pageSize, $pageSize;