对查询结果进行排序
学习重点
ORDER BY 子句对查询结果进行排序
在 ORDER BY 子句中列名的后面使用关键字 ASC 可以进行升序排列,使用 DESC 关键字可以降序排列
ORDER BY 子句中可以指定多个排序键
排序键中包含 NULL 时,会在开头或者末尾进行汇总
ORDER BY 子句中可以使用 SELECT 子句中定义的列的别名
ORDER BY 子句中可以使用 SELECT 子句中未出现的列或者聚合函数
ORDER BY 子句中不能使用列的编号
ORDER BY 子句
基本语法
SELECT <列名1>,<列名2>,<列名3>....
FROM <表名>
ORDER BY <排序基准列1>,<排序基准列2>
子句的书写顺序
SELECT 子句-> FROM 子句 -> WHERE 子句 -> GROUP BY 子句 -> HAVING 子句 -> ORDER BY 子句
ORDER BY 通常写在 SELECT 语句的末尾
指定升序或者降序
与上述示例相反 想要按照销售单价由高到低,也就是降序排列时,在列的名字后面使用 DESC 关键字
SELECT product_id,product_name,sale_price,purchase_price
FROM product
ORDER BY sale_price DESC;
- 未指定 ORDER BY 子句中排列顺序会默认以升序进行排列
指定多个排序键
- 当多个排序 他优先使用最左侧的键,如果该列存在相同的值 在参考右边的值
SELECT product_id,product_name,sale_price,purchase_price
FROM product
ORDER BY sale_price,product_id;
这样的话 它是先按照 sale_price 排序 如果相等的话他在按照 product_id 排序
NULL 的顺序
当排序的键存在 NULL 值的时候,Mysql 一般都会在结果的开头或者末尾汇总
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY purchase_price;
- 结果,NULL 结果不在头就在尾
product_id | product_name | sale_price | purchase_price |
---|---|---|---|
0002 | 打孔器 | 500 | 320 |
0001 | T 恤衫 | 1000 | 500 |
0007 | 擦菜板 | 880 | 790 |
0003 | 运动 T 恤 | 4000 | 2800 |
0004 | 菜刀 | 3000 | 2800 |
0005 | 高压锅 | 6800 | 5000 |
0006 | 叉子 | 500 | |
0008 | 圆珠笔 | 100 |
在排序中使用显示用的别名
- GROUP BY 不能使用别名 ORDER BY 可以使用别名
SELECT product_id AS id, product_name, sale_price AS sp, purchase
_price
FROM Product
ORDER BY sp, id;
- 结果
id | product_name | sp | purchase_price |
---|---|---|---|
0008 | 圆珠笔 | 100 | NULL |
0002 | 打孔器 | 500 | 320 |
0006 | 叉子 | 500 | NULL |
0007 | 擦菜板 | 880 | 790 |
0001 | T 恤衫 | 1000 | 500 |
0009 | 筷子 | 2800 | 2800 |
0004 | 菜刀 | 3000 | 2800 |
0003 | 运动 T 恤 | 4000 | 2800 |
0005 | 高压锅 | 6800 | 5000 |
ORDER BY 子句中可以使用不查询的列和聚合函数
Order BY 子句中也可以使用存在于表中,但并不包含在 select 子句中的列
SELECT product_name, sale_price, purchase_price
FROM Product
ORDER BY product_id;
- 也可以使用聚合函数
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type
ORDER BY COUNT(*);