SQL ORDER BY多列

时间:2013-03-26 02:26:03

标签: mysql sql sql-order-by

我想按两列对我的产品表进行排序: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 
);

5 个答案:

答案 0 :(得分:33)

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顺序排序,然后每个子集(Column1行以1作为其值)按第二列的顺序排序

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

答案 1 :(得分:6)

结果按第一列排序,然后是第二列,依此类推,因为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。

答案 2 :(得分:1)

是的,排序是不同的。

ORDER BY列表中的项目按顺序应用 以后的项目只订购上一步剩下的同行。

为什么不尝试

答案 3 :(得分:1)

这取决于数据库的大小。

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

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

如果您要运行第二个查询,它只会按名称排序,所以如果有两个名称相同的产品(由于某些奇怪的原因),那么在运行查询后它们将没有保证订单

答案 4 :(得分:1)

是的,排序方式不同。 在第一种情况下,基于column1的订单以及除了该进程之外还通过基于column1对colmun2进行排序。 在第二种情况下,它完全基于第1列进行排序...... 请继续用一个简单的例子......你会很快得到......