排序又分为两种,由低到高与由高到底排序。而ORDER BY 便可以实现这个功能
ORDER BY
比如:
查找orders(订单表)中的所有数据,并将查找结果按照total_price(订单价格)升序排列。
升序 ASC
降序 DESC
SELECT *
FROM orders
ORDER BY total_price; (若无明显命令 默认由低到高(ASC))如果是 ORDER BY total_price DESC;则是由高到低
这是ORDER BY total_price DESC;的结果--降序排列
上面操作是针对单列进行排序操作,那如果是多列呢?
SELECT *
FROM orders
ORDER BY total_price,order_time DESC;----这样可以吗??? 不可以!!其输出结果是对order_time进行的降序,并没有涉及到total_price
正确的写法应该是
ORDER BY total_price DESC,order_time DESC;
LIMIT--一个关键字,表明对要取的数据的数量进行限制。
比如LIMIT 10 意思就是我只要10条数据就欧克了
又比如LIMIT 10,3就是表示跳过前 10 个记录从第11个开始向后取 3 条数据。
SELECT *
FROM orders
ORDER BY total_price DESC
LIMIT 10;--只取total_price 的前10条数据;
DISTINCT
(distinct adj --截然不同的)所以他是用来去重的哈哈哈。
SELECT DISTINCT district 去重account_2c表中的district列
FROM account_2c;
简洁版
SQL排序与限制操作详解
一、单列排序规则
- 升序排列:
ORDER BY 列名 ASC
或省略排序方式(默认ASC)
SELECT * FROM orders
ORDER BY total_price; -- 等价于ORDER BY total_price ASC
- 降序排列:必须显式声明
DESC
SELECT * FROM orders
ORDER BY total_price DESC;
二、多列组合排序
-
错误示例:
ORDER BY total_price,order_time DESC
该写法仅对最后一个字段生效,等价于:ORDER BY total_price ASC, order_time DESC
-
正确写法:
SELECT * FROM orders ORDER BY total_price DESC, order_time DESC; -- 双字段均降序
多字段排序时,每个字段需单独指定排序方式,字段优先级按从左到右顺序执行
三、结果集限制
-
基础限制:
LIMIT 数字
SELECT * FROM orders ORDER BY total_price DESC LIMIT 10; -- 取价格最高的前10条
-
分页限制:
LIMIT 偏移量,数量
SELECT * FROM orders LIMIT 10,3; -- 跳过前10条,取第11-13条(共3条)
四、数据去重
-
单列去重:
SELECT DISTINCT district FROM account_2c; -- 返回唯一行政区划值
-
多列组合去重:
SELECT DISTINCT province, district FROM account_2c; -- 返回省份+行政区的唯一组合
五、综合应用示例
SELECT DISTINCT province, district
FROM account_2c
WHERE create_time > '2023-01-01'
ORDER BY province ASC, district DESC
LIMIT 5;
该语句实现:
- 筛选2023年后创建的账户
- 去除省份+行政区的重复组合
- 按省份升序优先排序,同省份按行政区降序排列
- 最终取前5条记录
特殊说明:LIMIT 10,3
在不同数据库中的实现可能略有差异,MySQL等数据库支持该语法,部分数据库要求使用LIMIT 3 OFFSET 10
格式。
Everything that kills me makes me feel alive ——《Counting Stars》