第4篇 MySQL -排序查询

记得有一次,我在一个周末的下午,坐在咖啡馆里,手里拿着一杯焦糖玛奇朵,电脑屏幕上显示着数据库查询结果。
我正在对一个销售数据表进行查询,目的是找出哪些产品的销售额最高。

我输入了以下的SQL语句:
sql SELECT product_name, SUM(sales_amount) AS total_sales FROM sales GROUP BY product_name ORDER BY total_sales DESC;
时间回到下午四点,地点是那家咖啡馆,我看着屏幕上跳出的结果,发现“智能手机”这个产品以2 3 4 ,5 00的总销售额高居榜首。
等等,还有个事,我突然想到,如果我想知道销售额排在前三的产品,我可以在ORDER BY后面加上LIMIT子句。

sql SELECT product_name, SUM(sales_amount) AS total_sales FROM sales GROUP BY product_name ORDER BY total_sales DESC LIMIT 3 ;
这样,查询结果就只显示销售额最高的前三名产品了。
这个小小的场景让我意识到,数据库查询中的排序和筛选功能是多么的强大和灵活。

mysql默认按什么排序

嗯,对,MySQL啊,默认是升序。
没说升序。
2 02 2 年吧,我搞那个项目,一个查询,就是SELECT啥啥啥,没ORDER BY,结果乱七八糟。
在哪个城市不重要,可能就上海吧,反正数据量也不大,就几万条。
我看着就不对劲,数据不对啊。
后来才反应过来,得加ORDER BY。
指定哪个列升序,哪个列降序。
比如ORDER BY id ASC,或者ORDER BY name DESC。
多列呢,就ORDER BY id ASC, name DESC。
这样才靠谱。
你想想,万一第一个列一样呢,还得看第二个列。
我后来那个查询,加了ORDER BY,结果就对了。
钱的事儿?跟排序没关系的。
可能我偏激吧,就认为得用ORDER BY。

mysql如何按多列排序

上周有个客人问我,MySQL里怎么用ORDER BY来对多列进行排序?我就给他解释了一下。
首先,这个ORDER BY语法在SELECT语句里用,用来指定查询结果的排序方式。

举个例子,比如有个学生表students,你想先按班级升序排,然后班级一样的情况下再按分数降序排,你就可以这样写:
sql SELECT FROM students ORDER BY class ASC, score DESC;
这里,ASC代表升序,DESC代表降序。
如果不写,默认就是升序。

再比如,有个订单表orders,你想先按状态升序排,然后状态一样的情况下按优先级降序排,再然后优先级一样的情况下按创建时间降序排,可以这样写:
sql SELECT FROM orders ORDER BY status ASC, priority DESC, created_time DESC;
这样,状态好的订单会先显示,状态一样的话,优先级高的订单会排在前面,优先级一样的话,最新的订单会显示在最前面。

不过,要注意的是,排序的字段类型要支持比较操作,比如数值、字符串、日期等。
比如,TEXT类型的列排序可能会因为字符集或排序规则的问题出现意外结果。

另外,多列排序可能会增加计算开销,特别是对于大表或者没有索引的列。
所以,如果经常需要按某个字段排序,最好给那个字段加个索引。

最后,有个员工表employees,你想按部门升序、薪资降序、入职日期升序排列,可以这样写:
sql SELECT employee_id, name, department, salary, hire_date FROM employees ORDER BY department ASC, salary DESC, hire_date ASC;
这样,员工会先按部门名称从A到Z排列,然后是同一部门的员工按薪资从高到低排列,薪资相同的话再按入职日期从早到晚排列。

反正,多列排序是个挺实用的功能,但要注意性能优化和字段选择。

mysql ordery by 默认是如何进行排序的呢?

说白了,MySQL的ORDER BY语句在处理多字段排序时其实很简单。
先说最重要的,当你需要对多个字段进行排序时,只需在字段名后加上逗号即可。
比如,去年我们跑的那个项目,有一个student表,里面记录了学生的年龄和ID,如果我们只想按年龄从大到小排序,可以这样写:
sql SELECT FROM student ORDER BY age DESC;
另外一点,如果你还想在年龄相同的情况下按ID排序,只需要在ORDER BY后面加上ID字段,并用逗号隔开。
这样,先是年龄排序,同年龄的再按ID大小排列:
sql SELECT FROM student ORDER BY age DESC, id DESC;
还有个细节挺关键的,如果你在ORDER BY后面指定的字段相同,它会根据SELECT语句中对应列的默认排序来处理。
比如数值型会从0开始递增,字符型则可能是按字母顺序排列。

我一开始也以为只有第一个字段会起主要作用,后来发现不对,MySQL会先按第一个字段排序,如果遇到相同值,再按第二个字段排序,以此类推。
等等,还有个事,如果你在ORDER BY后面没有指定排序方式,MySQL默认按照升序排序,但如果你想要降序,只需在字段名后加上DESC即可。

所以,如果你需要从多个角度对数据进行排序,记得使用逗号分隔字段名,并根据需要指定排序方式。
这个点很多人没注意,但我觉得值得试试。