第九章:第18节 MySQL基础篇——数据查询语言DQL(基本查询四)

更新于:2017-07-28 15:19:41

having子句

having子句其实概念跟where子句完全一样,用来做“条件判断”。


having只针对group by之后的“组”数据进行条件判断,所以只有在group by子句后面才可以用。换句话说,如果使用having,就必须紧跟在group by后面使用。


注意:

having是对分组子句进行的条件判断,则其判断的条件都应该是“组”级别的数据,即要么对group by中的字段进行判断,要么对使用了聚合函数的字段进行判断。比如这样:


1.png

1.png


按照“age >31”做条件筛选,获取的结果无任何意义的。


每个组的“age”它只是每个组中其中一条记录的“age”,和整个组无任何关系,所以用它做筛选无意义。


1.png


上面的两个select语句having条件过滤是有意义的。


用别名做下改进:


1.png


order by子句

形式:

order  by  排序字段1  [排序方式],  排序字段2  [排序方式], .....

说明:

对前面取得的数据(含from子句,where子句,group子句,having子句的所有结果)来指定按某个字段的大小进行排列(排序),排序只有2种方式:

正序: ASC(默认值),可以省略

倒序: DESC

如果指定多个字段排序(虽然不常见),则其含义是,在前一个字段排序中相同的那些数据里,再按后一字段的大小进行指定的排序。


1.png


排序一般最好按照主键ID排序,可以很好用到主键索引。


可实际应用中,一个表可能有很多时间字段,也会按照各种时间做排序。所以一定要合理地建好组合索引(order by 对组合索引用到的多),避免排序带来性能上的问题。


limit子句

形式:

limit   [起始行号start], 要取出的行数num

说明:

表示将前面select取得的数据做截断获取(只获取所有数据的一部分)。比如:


13条数据,我们暂时只获取一部分,这就需要用到limit子句。


起始行号start:第一行的行号为0, 可以省略,则为默认行号(0)。

要取得的行数:如果结果集中从指定的行号开始到最后没有这么多行,则就只取到最后。


从第1行(行号为0,可省略)开始取5行记录:

1.png


从第4行(行号为3)开始取5行记录:

1.png


从第10行(行号为9)开始获取5行记录:

1.png

后面没有那么多行了,只获取了4行。


此子句非常有用——主要用于网页上最常见的一个需求(现象):分页。

分页原理:

分页的前提:人为指定每页显示的条数,$pageSize = 3;

显示(取得)第1页数据:select * from 表名 limit  0,  $pageSize;

显示(取得)第2页数据:select * from 表名 limit  3,  $pageSize;

显示(取得)第3页数据:select * from 表名 limit  6,  $pageSize;


本节学习代码》》》