草庐IT

SQL ORDER BY 关键字

三季人 G 2023-05-01 原文

SQL ORDER BY 关键字

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。

ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

SQL ORDER BY子句简介

当使用SELECT语句查询表中的数据时,结果集中显示的行的顺序可能与您的预期不符。在某些情况下,结果集中显示的行按其物理存储在表中的顺序排列。 但是,如果查询优化器使用索引来处理查询,则行记录将显示为它们以索引键顺序存储。 因此,结果集中的行顺序未确定或不可预测。查询优化器是数据库系统中的内置软件组件,用于确定SQL语句查询请求数据的最有效方式。要准确指定结果集中的行顺序,请在SELECT语句中添加使用ORDER BY子句,如下所示:

SELECT 
    column1, column2
FROM
    table_name
ORDER BY column1 ASC , 
         column2 DESC;

在此语法中,ORDER BY子句放在FROM子句之后。 如果SELECT语句包含WHERE子句,则ORDER BY子句必须放在WHERE子句之后。

要对结果集进行排序,请指定要排序的列以及排序顺序的类型:

  • 升序(使用:ASC表示)
  • 降序(使用:DESC表示)

如果未指定排序顺序,则数据库系统通常默认按升序(ASC)对结果集进行排序。

当在ORDER BY子句中包含多个列时,数据库系统首先根据第一列对结果集进行排序,然后根据第二列对排序的结果集进行排序,依此类推。

SQL ORDER BY子句示例

我们将使用示例数据库中的employees表进行演示。

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         105 | David      | Liang     | 1997-06-25 | 4800   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         107 | Diana      | Chen      | 1999-02-07 | 4200   |
... ...
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
|         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

似乎行记录显示为存储在employees表中顺序。 要按字母顺序按名字对员工进行排序,请按如下方式添加ORDER BY子句进行查询:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    first_name;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         114 | Avg        | Su        | 1994-12-07 | 11000  |
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
... ...
|         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

现在,结果集按first_name列的值的字母顺序进行排序。

SQL ORDER BY - 按多列排序示例

要将员工按名字(first_name)列升序排列,然后再按姓氏(last_name)降序排序,请使用以下语句:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    first_name,
    last_name DESC;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         114 | Avg        | Su        | 1994-12-07 | 11000  |
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
... ...
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         122 | Min        | Liu       | 1995-05-01 | 7900   |
|         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
|         192 | Sarah      | Zhang     | 1996-02-04 | 4000   |
|         123 | Shanta     | Liu       | 1997-10-10 | 6500   |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
|         116 | Shelli     | Zhang     | 1997-12-24 | 3000   |
|         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
|         106 | Valli      | Chen      | 1998-02-05 | 4800   |
|         206 | William    | Wu        | 1994-06-07 | 8300   |
+-------------+------------+-----------+------------+--------+
40 rows in set

首先,数据库系统按升序对第一列(first_name)的结果集进行排序,然后按降序对按姓氏(last_name)排序的排序结果进行排序。 请注意两名员工:Alexander Su和Alexander Lee的位置变化。

SQL ORDER BY - 按数字列示例排序

SQL用于按字母顺序对数据进行排序,如上例所示,并以数字方式对数据进行排序。 例如,以下语句选择员工数据,并按降序对薪水(salary)列结果进行排序:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    salary DESC;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         145 | John       | Liu       | 1996-10-01 | 14000  |
|         146 | Karen      | Liu       | 1997-01-05 | 13500  |
|         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
|         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
|         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
... ...
|         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
|         115 | Alexander  | Su        | 1995-05-18 | 3100   |
|         116 | Shelli     | Zhang     | 1997-12-24 | 2900   |
|         117 | Sigal      | Zhang     | 1997-07-24 | 2800   |
|         126 | Irene      | Liu       | 1998-09-28 | 2700   |
|         118 | Guy        | Zhang     | 1998-11-15 | 2600   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
+-------------+------------+-----------+------------+--------+
40 rows in set

SQL ORDER BY - 按日期排序示例

除了字符和数字,SQL还可以按日期对结果集进行排序。 以下语句按hire_date列中的值按升序对员工进行排序。

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    hire_date;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         102 | Lex        | Liang     | 1993-01-13 | 17000  |
|         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
......
|         107 | Diana      | Chen      | 1999-02-07 | 4200   |
|         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
+-------------+------------+-----------+------------+--------+
40 rows in set

要查看刚刚加入公司的最新员工,可以按雇用日期(hire_date)的降序对员工进行排序,如下面的语句所示:

SELECT
    employee_id,
    first_name,
    last_name,
    hire_date,
    salary
FROM
    employees
ORDER BY
    hire_date DESC;

执行上面查询语句,得到以下结果 -

+-------------+------------+-----------+------------+--------+
| employee_id | first_name | last_name | hire_date  | salary |
+-------------+------------+-----------+------------+--------+
|         179 | Charles    | Yang      | 2000-01-04 | 6200   |
|         113 | Min        | Su        | 1999-12-07 | 6900   |
|         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
|         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
......
|         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
|         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
|         101 | Neena      | Wong      | 1989-09-21 | 17000  |
|         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
|         100 | Steven     | Lee       | 1987-06-17 | 24000  |
+-------------+------------+-----------+------------+--------+
40 rows in set

在本教程中,您学习了如何使用SQL ORDER BY子句根据一个或多个列的升序或降序来对结果集进行排序。

有关SQL ORDER BY 关键字的更多相关文章

  1. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  2. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  3. ruby - 在 Ruby 中跳过额外的关键字参数 - 2

    我定义了一个方法:defmethod(one:1,two:2)[one,two]end当我这样调用它时:methodone:'one',three:'three'我得到:ArgumentError:unknownkeyword:three我不想从散列中一个一个地提取所需的键或排除额外的键。除了像这样定义方法之外,有没有办法规避这种行为:defmethod(one:1,two:2,**other)[one,two,other]end 最佳答案 如果不想写**other中的other,可以省略。defmethod(one:1,two:2

  4. ruby - 是否有可能在 Ruby 中以哈希的形式访问关键字参数? - 2

    我知道我能做到:classParentdefinitialize(args)args.eachdo|k,v|instance_variable_set("@#{k}",v)endendendclassA但我想使用关键字参数来更清楚地说明可以接受哪个散列键方法(并进行验证表明不支持此键)。所以我可以写:classAdefinitialize(param1:3,param2:4)@param1=param1@param2=param2endend但是有没有可能写一些更短的东西而不是@x=x;@y=y;...从传递的关键字参数初始化实例变量?是否可以访问作为哈希传递的关键字参数?

  5. ruby :关键字 "in"是什么意思 - 2

    当我第一次在ruby​​中找到关键字“in”时。我想也许我可以这样做:1英寸(0..10)但看起来我不能那样使用它。然后我在ruby​​-lang.org中搜索它,然后用谷歌搜索它。没有答案!ruby中关键字“in”的含义是什么? 最佳答案 您应该能够执行以下操作:foriin0..10doputsiend您提到的表达式1in(0..10)将不起作用,因为常量(1)不能在一定范围内变化-它是一个常量!您需要在in关键字之前命名一个变量。希望对您有所帮助。参见thispage 关于ruby

  6. ruby - 为什么关键字参数必须作为带有符号键的散列传递,而不是 Ruby 中的字符串键? - 2

    我们不能将关键字参数作为带有字符串键的散列传递,关键字参数仅适用于作为符号键的散列。一个简单的例子:defmy_method(first_name:,last_name:)puts"first_name:#{first_name}|last_name:#{last_name}"endmy_method({last_name:'Sehrawat',first_name:'Manoj'})#=>first_name:Manoj|last_name:Sehrawatmy_method({first_name:'Bob',last_name:'Marley'})#=>first_name:Bo

  7. 对于体育新闻中文文本关键字提取有哪些关键字提取算法及其步骤 - 2

    对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.

  8. ruby - 从用户提交的文本中提取关键字的好方法是什么? - 2

    我正在构建一个网站,该网站允许用户通过以图形方式表示支持和反对特定问题的论点来理解辩论。(Wrangl)我想对这些辩论进行分类,以便更容易找到它们并将它们联系起来。我不想让发起辩论的人在他们看到任何好处之前添加标签和类别,从而激怒他们,所以我正在寻找一种自动提取关键字的方法。有什么好的方法可以利用辩论的标题和描述(以及可能的论点本身的内容,一旦有的话)来提取,比如说,可以用作元数据将类似辩论联系在一起的十个强关键字,或者即使是在可以查看辩论的HTML页面头部的“元”关键字标记的内容。例如。DatamappervsActiveRecord该网站使用Ruby和Sinatra编码,使用Dat

  9. Ruby:是否有关键字可以从自身内部调用方法(类似于 super)? - 2

    我想知道:在Ruby中,有没有一种方法可以在不使用其名称的情况下从自身内部调用方法?如果该方法是通过某些元编程技术创建的,那么通过其名称调用它可能会难以阅读。即使对于通常定义的方法,如果您不确定它的好名字,或者如果它的名字很长,通过一些关键字(类似于super)从自身内部调用它可能会很方便。 最佳答案 您可以使用Kernel#__method__以Symbol形式返回当前方法的名称。与super不同,它不是关键字而是常规方法,因此您必须将它连同必需的参数一起传递给send方法才能调用该方法。这是__method__返回的内容:obj

  10. ruby - 在 Ruby 中使用关键字参数柯里化(Currying) proc - 2

    假设我有一个通用的Proc、Lambda或method,它带有一个可选的第二个参数:pow=->(base,exp:2){base**exp}现在我想柯里化(Currying)这个函数,给它一个3的exp。cube=pow.curry.call(exp:3)这里有一个歧义,由关键字参数和新的散列语法引起,Ruby将exp:3解释为作为第一个参数传递的散列,base.这导致函数立即被调用,当#**被发送到散列时呈现NoMethodError。为第一个参数设置默认值同样会导致函数在柯里化(Currying)时立即被调用,如果我将第一个参数标记为必需,而不提供默认值:pow=->(base:

随机推荐