我正在C#和Java中实现一个应用程序,并且希望在SQL中具有与ORDER BY函数类似的功能。但是,要做到这一点,我必须理解订购多列的概念。
我尝试编写简单的SQL语句,例如
SELECT *
FROM TABLE
ORDER BY Field1,Field2
。
执行此操作时,仅订购Field1
。实际上是否有任何用于指定多列的用途?
答案 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