簡體   English   中英

Sams在10分鍾內自學SQL-關於GROUP BY的問題

[英]Sams Teach Yourself SQL in 10 minutes - Question about GROUP BY

我閱讀了“ Sams在10分鍾內自學SQL,第三版”這本書,在第10課“分組數據”的“創建組”部分中,我無法理解以下內容:

除了聚合計算語句外,SELECT語句中的每一列都必須出現在GROUP BY子句中。

為什么? 我試過了,我認為這是不正確的。 例如,考慮具有“大陸”,“國家”,“人口”列的表“世界”。

SELECT continent, country
FROM World
GROUP BY continent;

根據這本書,這應該導致錯誤,對嗎? 但事實並非如此。 我可以將數據分組到不同的大陸(因此我們在結果中有7個大陸),並且每個大陸旁邊都有一個隨機的國家/地區名稱。

像這樣

continent         country
North America     Canada
South America     Brazil
Europe            France
Africa            Cameroon
Asia              Japan
Australia         New Zealand
Antarctica        TuxLand

您最有可能使用MySQL ,該MySQLSELECT子句中允許未分組和未聚合的表達式

這當然違反了標准。

這是為了通過在PRIMARY KEY上進行聯接來簡化GROUP BY

SELECT  a.*, SUM(b.value)
FROM    a
JOIN    b
ON      b.a_id = a.id
GROUP BY
        a.id

通常情況下,你就必須要么從添加的所有列aGROUP BY子句或使用子查詢。

MySQL不允許您這樣做,因為對於給定的PRIMARY KEY (分組在)上,給定的值保證了來自a所有值都相同。

這是正確的,並且在某些形式的SQL(例如MySQL)中不會產生任何錯誤。 您可以選擇在多個列上使用GROUP BY語句,但這不是必需的。

GROUP BY將列出指定列的第一個結果-因此,在您的情況下,它將返回第一個國家/地區對。

PostgreSQL和MySQL允許這樣做,對group by使用一個字段。

本教程可能假設您應該在所有字段上使用GROUP BY,因此從您選擇的內容來看,您不會丟失任何數據-在上面的示例中它將顯示每個國家/地區,但僅顯示一次。

這是一個示例表:

Continent      |  Country     | Random_Field
---------------------------------------------
North America     Canada          Cake
North America     Canada          Dog
South America     Brazil          Cat
Europe            France          Frog
Africa            Cameroon        House
Asia              Japan           Gadget
Asia              India           Dance
Australia         New Zealand     Frodo
Antarctica        TuxLand         Linux

在您的第一個語句中:

SELECT continent, country
FROM World
GROUP BY continent;

輸出為:

Continent      |  Country     
--------------------------
North America     Canada   
South America     Brazil 
Europe            France  
Africa            Cameroon   
Asia              Japan    
Australia         New Zealand 
Antarctica        TuxLand  

請注意,盡管有所不同,但其中一個亞洲行還是丟失了。

兩者都使用GROUP BY:

SELECT continent, country
FROM World
GROUP BY continent, country;

將產生:

   Continent      |  Country     
    -----------------------------
    North America     Canada   
    South America     Brazil    
    Europe            France    
    Africa            Cameroon    
    Asia              Japan      
    Asia              India      
    Australia         New Zealand 
    Antarctica        TuxLand 

暫無
暫無

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

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