[英]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
,該MySQL
在SELECT
子句中允許未分組和未聚合的表達式 。
這當然違反了標准。
這是為了通過在PRIMARY KEY
上進行聯接來簡化GROUP BY
:
SELECT a.*, SUM(b.value)
FROM a
JOIN b
ON b.a_id = a.id
GROUP BY
a.id
通常情況下,你就必須要么從添加的所有列a
到GROUP 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.