SQL多列排序

904

如何在SQL中按多个列和不同的方向进行排序?例如,'column1'将以降序排序,而'column2'将以升序排序。


109
这是“谷歌搜索答案”的第一个结果。至少在我谷歌搜索“按两列排序sql”的时候是这样的。它比等价的官方文档页面更易读,即使我将查询改为“mysql 'order by'”,该官方文档页面直到我翻到第二页才出现在搜索结果中。 - vowel-house-might
18
考虑到Stack Overflow的问题经常排名谷歌搜索结果的前列,我总觉得人们用它来回答问题是很糟糕的。无论如何,Stack Overflow是用来回答问题的,我不明白为什么让网站流量离开是好事。 - user001
9个回答

1417
ORDER BY column1 DESC, column2

首先按照column1(降序)排序,然后每当两行或更多行的column1字段相同时,默认情况下按照column2(升序)排序。


4
如何按列1或列2排序? - PoliDev
1
@PoliDev,它首先按照列1的降序排序,然后按照列2(升序)排序。 - zaheer
177
为了清晰明了,这将首先按column1 对所有内容进行排序,然后在column1 值相等的两行中,按column2 进行排序。 - Nick Benes
3
它适用于任意数量的表达式(不仅仅是列),取决于您RDBMS的限制。 - Ignacio Vazquez-Abrams
5
或者你可以这样说:它按column2进行排序,然后通过column1进行稳定排序。对于了解什么是稳定排序的人来说更清晰明了。 - Atom
显示剩余5条评论

492
其他回答都没有提供具体例子,因此我来举一个例子:
给定以下People表:
 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
如果您执行以下查询:

If you execute the query below:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

结果集将会是这样的:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

47
这个答案是对那个非常有帮助且简短的被采纳答案的很好补充。 - enderland
5
这是一些好的例子,许多人认为如何同时对2列进行排序,实际上即使您将2列放入排序查询中也不会发生。 - mfs
1
当我们按照三列进行排序时,第一列的排序顺序相同,其余所有内容都不同时,它会提供相同的结果。例如:1.名字升序,姓氏降序,出生年份升序和2.名字升序,姓氏降序,出生年份降序有没有办法克服这个问题? - Paramesh Korrakuti
3
@ParameshKorrakuti:这是预期的结果。如果有不同的YearOfBirth和重复的FirstName, LastName条目,您示例中的排序将不同。 - Thomas C. G. de Vilhena
1
谢谢你提供的示例,它让像我这样的人能够理解。 - thippu

149
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC

26
多列排序取决于每列对应的值:以下是我的表格示例,其中有两列以字母和数字命名,这两列的值按照升序降序排序。

enter image description here

现在我通过执行以下命令,在这两列中进行了排序

Order By

enter image description here

现在我再次向这两列插入新的值,其中字母表中的值按ASC顺序排列:

enter image description here

示例表中的列看起来像这样。现在再次执行相同的操作:

enter image description here

您可以看到第一列的值是按降序排列的,但第二列不是按升序排列的。


2
同时插入此数据(g, 10),(g,12)。然后运行您的order-by查询,您将获得第二列按ASC顺序排列的结果(这意味着g-10,g-11,g-12)。 - Pugal

13

你可以在多个条件上使用多重排序。

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

3
如果我在“ORDER BY”中使用“CASE”,那么索引是否有效? - Rousonur Jaman

8
SELECT id,  
  first_name,
  last_name,
  salary
FROM employee
ORDER BY salary DESC, last_name; 

如果你想从表中选择记录并根据两列排序,可以使用ORDER BY。这个子句位于SQL查询的末尾。
在ORDER BY关键字后面,先添加你想要按照其排序的第一个列名(在本例中是salary)。然后,在逗号后添加第二个列名(在本例中是last_name)。你可以分别修改每列的排序顺序(升序或降序)。如果你想使用升序(低到高)排序,可以使用ASC关键字;但这个关键字是可选的,因为当没有指定时,默认的排序就是升序。如果你想使用降序排序,请在相应的列后加上DESC关键字(在本例中,我们对salary列使用了降序排序)。

6

尝试

'select * FROM users ORDER BY id DESC, name ASC, age DESC 

5

通过Intellij DataGrip编译

从EMP表中选择全部内容按DEPTNO升序、JOB降序排序


2

您还可以按照每个要排序的列中的字符数进行排序或排序。下面是一个示例,它按照名字的前三个字符和城镇名称的后两个字符进行排序。

SELECT *
FROM table_name
ORDER BY LEFT(FirstName, 3) ASC, LEFT(Town, 2);

请注意,对于那些情况,您需要特别为其创建索引,因为在模糊处理的情况下,常规的FirstNameTown索引将不会被使用。更多信息请参阅https://planetscale.com/courses/mysql-for-developers/queries/index-obfuscation。 - Can Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接