簡體   English   中英

group by,distinct,Union之間用於為多列選擇不同值的區別是什么?

[英]What is the difference between group by, distinct, Union for selecting distinct values for multiple columns?

這個問題解釋了一種獲得多列獨特組合的方法。 但是為了這個目的,我想知道DISTINCT,UNION,GROUP BY關鍵字方法的方法之間的區別。 使用它們時會得到不同的結果。 我的查詢就像這個查詢1。

select 
column1,
column2,
column3
from table
group by 1,2,3

查詢2。

select distinct 
column1,
column2,
column3
from table

查詢3。

SELECT DISTINCT(ans) FROM (
    SELECT column1 AS ans FROM sametable
    UNION
    SELECT column2 AS ans FROM sametable
    UNION
    SELECT column3 AS ans FROM sametable
) AS Temp

我為上面的查詢獲得了不同的行數(編輯:前兩個給出相同數量的行,但最后一個給出了不同的行)。 任何機構都可以解釋上述查詢的作用嗎? 特別是第三個?

編輯:請注意我在同一張桌子上做UNION。 在那種情況下會發生什么?

從我認為最簡單的DISTINCT開始,就是這樣。 它返回不同的行組合。 想想這個數據集:

COL1      COL2      COL3
A         B         C
D         E         F
G         H         I
A         B         C   <- duplicate of row 1

這將返回3行,因為數據集中的第4行與第一行完全匹配。 結果:

COL1      COL2      COL3
A         B         C
D         E         F
G         H         I

GROUP BY經常用於匯總和其他計算,按列1從表組中選擇COL1,SUM(COL2);

對於此數據集:

COL1      COL2
A         5
A         6
B         2
C         3
C         4
C         5

會回來的

COL1     SUM(COL2)
A        11
B        2
C        12

UNION只從不同的查詢中獲取結果並將它們顯示為1個結果集:

Table1
COL1
A

Table2
COLX
B

Table3
WHATEVER_COLUMN_NAME
Giddyup

select COL1 from Table1
UNION
select COLX from Table2
UNION 
select WHATEVER_COLUMN_NAME from Table3;

結果集:

A
B
Giddyup

執行聯合時,列數據類型必須匹配。 你不能UNION一個帶有char列的數字列(除非你明確地執行數據轉換)

讓我們假設這是您的數據庫數據:

column1 | column2 | column3
1       | 2       | 1
1       | 2       | 2
1       | 2       | 1
3       | 1       | 2
1       | 2       | 2
1       | 2       | 2
1       | 2       | 2

第一個查詢

在第一個示例中,您將獲得db中的所有列組合(如GROUP BY 1,2,3不執行任何操作),包括重復項,因此它將返回:

1       | 2       | 1
1       | 2       | 2
1       | 2       | 1
3       | 1       | 2
1       | 2       | 2
1       | 2       | 2
1       | 2       | 2

第二個查詢

第二個示例為列元組采用唯一值,因此您將結束

1       | 2       | 1
1       | 2       | 2
3       | 1       | 2

第三次查詢

上次查詢從三列中獲取所有值,然后從該集合中刪除重復項。 因此,您將從任何表中獲取所有值。 最終這將回歸

1
2
3

這是否清楚了?

讓我們來看一組樣本數據

orderid    customer orderdate
1          B        July 29
2          A        Aug 1
3          A        Aug 4
4          C        Aug 5
5          B        Aug 6
6          A        Aug 11

Distinct基本上返回給定記錄的單個實例,而不會重復結果集中的整個列集。 例如:“從訂單中選擇不同的客戶”將返回“A”,“B”,“C”默認選擇的列的alpha順序。

分組依據是在查詢中的給定字段集中進行聚合。 例如:

選擇客戶,將訂單組中的NumberOfOrders計數(*)減1

Would result with...
A    3
B    2
C    1

您還可以在查詢中應用distinct(僅一次),但在給定的組中。

選擇客戶,計數(*)作為NumberOfOrders,計數(明確{order of orderdate})作為CustomerMonths來自客戶的訂單組

Would result with
A    3    1  (all orders were in August)
B    2    2  (had orders in July and August)
C    1    1  (only one order in August)

聯合是必須是完全相同的結果格式,列名和字段序列的查詢。 假設您有一個訂單表,其結構與存檔的數據版本完全相同。 您只保留當前最新年份的當前數據,所有歷史數據都被推送到存檔。 如果您想在一個查詢中獲取給定客戶的所有訂單活動,您可能希望進行聯合

從currentOrders中選擇customerid,orderdate,amount,其中customerid = ?? 按2降序UNION選擇customerid,orderdate,來自ArchivedOrders的金額,其中customerid = ??

第一個選擇的ORDER by子句將驅動所有后續記錄被拉入結果的結果。 就像SQL說去表一,得到所有資格,然后排序。 然后,轉到表2,獲取所有符合條件的內容並從表1中拉入現有的排序列表。 最終結果是所有記錄。

HTH

如果包含“實際執行計划”(MS SQL Management Studio中的控件+ M),它將為您提供SQL引擎如何優化每個語句的圖表。 理解這將有助於您編寫更好的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM