排序
ORDER BY
SELECT <*, column [alias], ...>
FROM table [WHERE conditions(s)]
[ORDER BY column [ASC|DESC]];
必须出现在SELECT中的最后一个子句
ASC、DESC
ASC用来指定升序排序(默认选项),DESC用来指定降序排序。
NULL值视作最大。
不写ASC或DESC ,默认是ASC,升序排列。
多个列排序
当以多列作为排序标准时,首先按照第一列进行排序,如果第一列数据相同,再以第二列排序,以此类推。多列排序时,不管正序还是倒序,每个列需要单独设置排序方式
聚合函数
MAX、MIN
用来取得列或表达式的最大、最小值。
可以用来统计任何数据类型,包括数字、字符和日期;
AVG、SUM
用来统计列或表达式的平均值与和值。只能操作数字类型。忽略NULL值
在SELECT中出现了聚合函数以后,不可以出现其他字段,如果想出现其他字段,则该字段必须出现在GROUP BY语句中
COUNT
用来计算表中的记录条数;
忽略NULL值;
通过聚合函数统计某一字段值的时候,如果不希望忽略null,则使用NVL(IFNULL)语句
GROUP BY
将某些字段相同的划分为一组。
SELECT <*, column [alias],...">
FROM table [WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column [ASC | DESC]];
GROUP BY应该出现在WHERE后面,ORDER BY前面。
WHERE中不允许使用分组函数
HAVING
HAVING子句用来对分组统计后的结果再次进行过滤。比如按部门分组后,得到每个部门的最高薪水,可以继续限制输出结果。
必须跟在GROUP BY后面,不能单独存在。
WHERE是在第一次查询时用来过滤的,WHERE不能用组函数,HAVING可以
査询语句的执行顺序
- from子句:执行顺序为从后往前、从右到左;所以数据量较少的表尽量放在后面
- where子句:执行顺序为自下而上、从右到左;将能过滤掉最大数量记录的条件,写在Where子句的最右
右 - group by:执行顺序从左往右分组;最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉。列内容都不重复用GROUP by意义就不大了。
- having子句:消耗资源,尽置避免使用,HAVING会搜索出所有记录之后才对结果集进行过滤,需要排序等操作
- select子句:少用★号,尽量取字段名称;ORACLE在解析的过程中,通过査询数据字典将*号依次转换成所有的列名,消耗时间
- order by子句:执行顺序为从左到右排序,消耗资源