《SQL实战》书摘(13):通过ORDER BY排序数据

当数据按照顺序排列而不是乱七八糟地随意排列的时候,它们会更有意义,并且也更容易揭示出相应的模式。

在SQL中,我们使用包含ORDER BY关键字的子句对查询结果进行排序,而跟在关键字后面的则是一个或多个被排序列的名字。应用这一子句只会对查询结果产生影响,它不改变原有的表。代码清单3-3展示了一个排序teachers表的例子。

SELECT first_name, last_name, salary
FROM teachers
ORDER BY salary DESC;

代码清单3-3:使用ORDER BY对列进行排序

在默认情况下,ORDER BY将按值进行升序排序,但这里代码通过添加DESC关键字实行了降序排序。(可选的ASC关键字可以让排序以升序进行。)现在,通过让salary列的值从高到低进行排列,我可以轻而易举地知道哪些教师的薪水是最高的。

first_name  last_name   salary
----------  ---------   ------
Lee         Reynolds    65000
Samuel      Cole        43500
Betty       Diaz        43500
Kathleen    Roush       38500
Janet       Smith       36200
Samantha    Bush        36200

ORDER BY子句还允许使用数字来代替列的名字,你只要根据每个列在SELECT子句中的位置,用数字标记想要排序的列即可。我们可以通过这一特性来重写代码清单3-3,用数字3代表SELECT子句中排行第三的salary列:

SELECT first_name, last_name, salary
FROM teachers
ORDER BY 3 DESC;

对查询进行排序的能力,极大地提升了我们在观察和呈现数据时的灵活性。比如说,我们可以对不止一个列进行排序。请键入代码清单3-4中的语句。

  SELECT last_name, school, hire_date
  FROM teachers
 ORDER BY school ASC, hire_date DESC;

代码清单 3-4 :使用ORDER BY排序多个列

这段代码检索教师的姓氏、他们执教的学校以及他们被雇用的日期。通过对学校进行升序排序,并对雇用日期进行降序排序 ➊ ,我们创建了一个按学校分组的教师列表,而最近被雇用的教师则排在列表的前面。这样一来,我们就能够看到每间学校最新雇用的教师都有谁。以下是这个查询的结果:

last_name   school                  hire_date
---------   -------------------     ----------
Smith       F.D. Roosevelt HS       2011-10-30
Roush       F.D. Roosevelt HS       2010-10-22
Reynolds    F.D. Roosevelt HS       1993-05-22
Bush        Myers Middle School     2011-10-30
Diaz        Myers Middle School     2005-08-30
Cole        Myers Middle School     2005-08-01

你可以对两个以上的列使用ORDER BY,但很快就会到达一个收益递减的点,使得排序的效果难以被察觉。想象一下,如果你在ORDER BY子句中加入更多列,比如教师取得的最高学位、他们执教的年级以及他们的出生日期,那么你将很难在短时间内理解结果中的各种排序趋势,更不用说跟别人交流这些排序结果了。当结果只专注于回答一个特定的问题时,消化数据是最容易的;因此,一个更好的策略是限制查询的范围,让它只涉及最重要的列,然后为回答每个问题分别执行多个查询。

Tip

本文摘录自《SQL实战》一书,欢迎访问本书主页以了解更多相关信息:huangz.works/sql/

../_images/psqlcn-banner.jpg