【问题标题】:SQL ORDER BY multiple columns [duplicate]SQL ORDER BY 多列[重复]
【发布时间】:2013-03-15 17:30:21
【问题描述】:

我想按两列对我的产品表进行排序:prod_priceprod_name

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;

这里的排序是如何进行的?我认为它首先发生在prod_price,然后是prod_name。另外,上面的查询和这个有什么不同:

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_name;

我的产品表如下:

CREATE TABLE Products
(
  prod_id    char(10)      NOT NULL ,
  vend_id    char(10)      NOT NULL ,
  prod_name  char(255)     NOT NULL ,
  prod_price decimal(8,2)  NOT NULL ,
  prod_desc  text          NULL 
);

【问题讨论】:

    标签: mysql sql sql-order-by


    【解决方案1】:

    这取决于您的数据库的大小。

    SQL 基于 SET 理论:查询表时没有固有的顺序。

    因此,如果您要运行第一个查询,它将首先按产品价格排序,然后按产品名称排序,如果价格类别中有任何重复项,例如 20 美元,它会按名称对这些重复项进行排序,因此始终保持在您运行查询时,它将始终以相同的顺序返回相同的结果集。

    如果您要运行第二个查询,它只会按名称排序,因此如果有两个产品具有相同的名称(出于某种奇怪的原因),那么在您运行查询后它们将不会有保证的顺序.

    【讨论】:

      【解决方案2】:

      结果按第一列排序,然后是第二列,依此类推,与 ORDER BY 子句包括的列一样多。如果您希望任何结果按降序排序,您的 ORDER BY 子句必须在相关列的名称或编号之后直接使用 DESC 关键字。

      看看这个例子

      SELECT first_name, last_name, hire_date, salary 
      FROM employee 
      ORDER BY hire_date DESC,last_name ASC;
      

      它将连续订购。先订购 Hire_Date,然后按 Hire_Date 订购 LAST_NAME。

      【讨论】:

        【解决方案3】:

        是的,排序方式不同。 在第一种情况下,基于 column1 的订单,此外还通过基于 column1 对 colmun2 进行排序来进一步处理该过程。 在第二种情况下,它完全基于第 1 列进行排序... 请继续举个简单的例子……你会很快的……

        【讨论】:

          【解决方案4】:

          ORDER BY 中的排序由第一列完成,然后由指定语句中的每个附加列完成。

          例如,考虑以下数据:

          Column1    Column2
          =======    =======
          1          Smith
          2          Jones
          1          Anderson
          3          Andrews
          

          查询

          SELECT Column1, Column2 FROM thedata ORDER BY Column1, Column2
          

          将首先按Column1 中的所有值排序

          然后按Column2 对列进行排序以生成:

          Column1    Column2
          =======    =======
          1          Anderson
          1          Smith
          2          Jones
          3          Andrews
          

          换句话说,数据首先按Column1 的顺序排序,然后每个子集(Column11 作为其值的行)按第二列的顺序排序。

          您发布的两个语句之间的区别在于,第一个语句中的行将首先按prod_price(价格顺序,从最低到最高)排序,然后按名称顺序(意味着如果两个项目有相同的价格,名称的 alpha 值较低的将首先列出),而第二个将仅按名称顺序排序(这意味着价格将根据 prod_name 的顺序出现,而不考虑价格)。

          【讨论】:

          • 只是为了好玩(但不仅仅是为了好玩):还有另一种在支持窗口语法的 DBMS 中对数据进行排序的方法:select *, count(*) over (order by Column1, Column2) from thedata
          【解决方案5】:

          是的,排序不同。

          ORDER BY 列表中的项目按顺序应用。
          后面的项目只对上一步剩下的同行进行排序。

          你为什么不直接试试

          【讨论】:

          • 我认为只有当 prod_price 列具有相同的值时才会按 prod_name 排序,否则按 prod_name 排序。请告诉我是否正确
          • @user2201462:这就是peer这个词的意思。对于某个ORDER BY 项目,这些行都是相同的。只有那些受下一项的约束。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-20
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多