有时候使用 MySQL 查询记录的时候需要将一些指定字段值的数据排在最前面或者最后面。

本文介绍两种语法来实现这个功能。

将指定字段值的数据排在最后面

-- 要求:将 subject 值为 'Physics' 和 'Chemistry' 的数据排在最后
-- 方法一:使用 column in ('value1', 'vaule2', ..., 'valuen')
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY subject IN ('Physics','Chemistry'), subject, winner;


-- 方法二:使用 case 子句
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY 
    (case subject
        when 'Chemistry' then 1
        when 'Physics'   then 1
        else 0
     end), subject, winner;
-- 等价于:
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY 
    (case subject
        when 'Chemistry' then 0
        when 'Physics'   then 0
        else 1
     end) DESC, subject, winner;

将指定字段值的数据排在最前面

排在最前面其实就是和排在最后面取相反的条件即可。

也可以在排在最前面的写法后面加上 DESC 进行倒序排列即可。

-- 要求:将 subject 值为 'Physics' 和 'Chemistry' 的数据排在最前面
-- 方法一:使用 column in ('value1', 'vaule2', ..., 'valuen')
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY subject NOT IN ('Physics','Chemistry'), subject, winner;


-- 方法二:使用 case 子句
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY 
    (case subject
        when 'Chemistry' then 0
        when 'Physics'   then 0
        else 1
     end), subject, winner;
-- 等价于:
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY 
    (case subject
        when 'Chemistry' then 1
        when 'Physics'   then 1
        else 0
     end) DESC, subject, winner;

两种方法的区别

方法一主要是利用了 IN 关键字,判断出如果字段的值在后面的值列表中那么整个表达式的值就为 1, 不在的话整个表达式的值就为 0。

由于默认升序,0 < 1,所以不在值列表里的数据当然就排在前面了,在值列表里的就排在最后面了。

注意:实例中只要求 subject 值为 'Physics' 和 'Chemistry' 的数据排在最前面/最后面,但是值为 'Physics' 和 'Chemistry' 的先后顺序并不是由第一个排序字段来决定了,他们的顺序又是由后面的两个字段来共同决定了。如果要想精确控制顺序那么可以使用方法二, case 子句给不同的值赋予不同的数字,这样排序时就有个先后之分了。

比如现在要求 'Physics' 和 'Chemistry' 排在最前面,且 'Physics' 要在 'Chemistry' 的前面。

-- 只需要保证 'Physics' < 'Chemistry' < else 就可以实现
SELECT winner, subject
FROM nobel
WHERE yr = 1984
ORDER BY 
    (case subject
        when 'Chemistry' then 1
        when 'Physics'   then 0
        else 2
     end), subject, winner;

本文使用的 SQL 练习网站

免费的 SQL 练习网站,支持中文,有需要的可以去在线练习,本文章也的题目也是来源于该网站。

点此访问网站链接


前天遇到了小鹿,昨天是小兔子,今天是你。