多列排序的目的是什么?

时间:2013-02-16 10:36:24

标签: c# java mysql sql sql-server

我正在C#和Java中实现一个应用程序,并且希望在SQL中具有与ORDER BY函数类似的功能。但是,要做到这一点,我必须理解订购多列的概念。

我尝试编写简单的SQL语句,例如

SELECT * FROM TABLE ORDER BY Field1,Field2

执行此操作时,仅订购Field1。实际上是否有任何用于指定多列的用途?

6 个答案:

答案 0 :(得分:4)

考虑一下:如果Field1行值相等会怎么样?

基本上,在您的示例中,您首先按Field1排序,如果值相等,则按Field2排序

示例:

Field1 | Field2
A        4
B        1
A        3

order by Field1, Field2

Field1 | Field2
A        3
A        4
B        1

答案 1 :(得分:1)

  

这样做时,只订购了Field1。

没有。当第一列值相等时,第二列用于排序。

让我们考虑你创建一个像这样的表;

CREATE TABLE tbl
    ([Field1] varchar(1), [Field2] int)
;

INSERT INTO tbl
    ([Field1], [Field2])
VALUES
    ('A', 1),
    ('A', 2),
    ('B', 1),
    ('B', 2),
    ('C', 4),
    ('C', 2),
    ('C', 1)
;

运行此 query ;

Select *
From tbl
Order by Field1

它为您提供了结果

FIELD1  FIELD2
A   1
A   2
B   1
B   2
C   4
C   2
C   1

这是正常的,因为我们仅根据Field1订购它。它对其他专栏并不关心。

但是当你运行 query ;

Select *
From tbl
Order by Field1, Field2

这将为您提供结果

FIELD1  FIELD2
A   1
A   2
B   1
B   2
C   1
C   2
C   4

这是正常的,因为我们说要查询;首先,根据Field1列值对结果进行排序,如果某些Field1值相等,请根据Field2列对其进行排序。

答案 2 :(得分:1)

DECLARE @CocoJambo TABLE (
    ID INT IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    LastName NVARCHAR(50) NOT NULL
);

INSERT  @CocoJambo
        (FirstName, LastName )
SELECT 'Mary', 'SMITH'
UNION ALL SELECT 'John', 'WILLIAMS'
UNION ALL SELECT 'Alan', 'WILLIAMS'
UNION ALL SELECT 'David', 'WILLIAMS'
UNION ALL SELECT 'Erika', 'BROWN';


SELECT  *
FROM    @CocoJambo a
ORDER BY a.LastName;
-- Persons are ordered only by last name but not by first name
-- Look at John W., Alan W., David W.
/*
ID FirstName LastName
-- --------- --------
5  Erika     BROWN
1  Mary      SMITH
2  John      WILLIAMS
3  Alan      WILLIAMS
4  David     WILLIAMS
*/

SELECT  *
FROM    @CocoJambo a
ORDER BY a.LastName, a.FirstName;
-- Persons are ordered by last name and (then by) first name    
-- Look at Alan W., David W., John W.
/*
ID FirstName LastName
-- --------- --------
5  Erika     BROWN
1  Mary      SMITH
3  Alan      WILLIAMS
4  David     WILLIAMS
2  John      WILLIAMS
*/

答案 3 :(得分:0)

如果Field1的多个行具有相同的值,则会在Field2内部对其进行排序:

Field1 | Field2
-------+--------
 1     | 243
 2     | 23
 2     | 42
 2     | 278
 3     | 1

答案 4 :(得分:0)

假设表是“人”,Field1是“last_name”(姓氏),Field2是“first_name”(给定名称),那么共享姓氏“Smith”的三个人将具有第一个第二个类别名称已应用。

Smith Tim
Picard Bernard
Smith Alice
Smith Bob

...变为

Picard Bernard
Smith Alice
Smith Bob
Smith Tim

正如其他人所说,当先前的排序字段遇到重复值时,会出现连续的排序字段。

答案 5 :(得分:0)

如果在ORDER子句中指定多个列,则按顺序排序,然后排序第二个,然后排序第三个......等等。例如,如果您通过Forename,Surname订购,结果将首先按Forename排序,即首先按顺序排序,然后按姓氏排序,因此每个A将按其姓氏排序,因此,如果您的数据中有两个Albert,按照Albert Einstein和Albert Davies的顺序出现在未分类的表格中,它们将按姓氏的顺序出现在列表中,即

Forename   |   Surname
Albert     |   Davies
Albert     |   Einstein
Arthur     |   Dent

如果您只是在姓名上订购,那么您将得到以下内容(当然,提供爱因斯坦在未分类的表格中显示在戴维斯之上):

Forename   |   Surname
Albert     |   Einstein
Albert     |   Davies
Arthur     |   Dent