與聚合函式和Group by 子句有關的常見錯誤
常見錯誤1:在select子句中書寫了多余的列 ,
在使用count這樣的聚合函式時,select子句中的元素有嚴格的限制,實際上,在使用聚合函式時,select 子句中只能存在以下三種元素
①常數
②聚合函式
③group by 子句中指定的列明(也就是聚合鍵)
例:
常數就是像數字123,或者字串‘測驗’這樣寫在sql陳述句中的固定值,將常數直接寫在select子句中沒有任何問題,此外還可以書寫聚合函式或者聚合鍵,這些在之前的示例代碼中都已經出現過了,
這里經常會出現的錯誤就是吧聚合鍵之外的列名書寫在select子句中,
比如:select product_name,purchase_price,count(*) from product group by purchase_price;
運行結果會出錯,這里出錯的原因就是在用group by子句中并沒有select子句中的 select product_name 列即列名 product_name 并沒有包含在group by子句中 因此該列名也不能寫在select子句中,
不支持這種語法的原因,大家仔細想一想就明白了,通過某個聚合鍵將表進行分組之后,一行就代表一組,例如,使用進貨單價將表進行分組之后,一行就代表了一個進貨單價,問題就出在這里,聚合鍵和商品名并不一定是一對一的
例如,進貨單價是2800日元的商品有‘運動T恤’和‘菜刀’兩種,但是用groop by 子句 進貨單價分組 2800日元這一行應該對應那種商品名稱呢?
所以像這樣與聚合鍵相對應的丶同時存在多個值的列出現在select 子句中的情況,是錯誤的,
常見錯誤2:在group by子句中寫了列的別名 ,
這個也是一個非常常見的錯誤,select子句中的專案可以通過 AS 關鍵字來指定列名,但是,在group by 子句中是不能使用別名的,例:select product_type as pt ,count(*) from product group by pt
上述陳述句發生錯誤的原因之前已經介紹過了,是sql陳述句在資料庫中執行時的執行順序造成的,
例:from → where → group by → having → select 這樣的執行順序
所以在執行group by 子句時 select 子句中AS的別名 資料庫還不知道,
常見錯誤3:在where子句中使用聚合函式
這也是一個經常出現的錯誤,我們先來看一下之前提到的按照商品種類(product_type列)對表進行分組,計算每種商品資料行數的例子1
select product_type,count(*) from product group by product_type;

如果我們想要取出包含2行資料的組該怎么辦呢?滿足要求的是“辦公用品”和“衣服”
想要指定選擇條件時就要用到where子句,初學者通常會想到使用到下列的代碼
這行代碼是錯誤的示范
select product_type,count(*) from product where count(*)=2 group by product_type;
執行該結果

實際上,只有select子句和Having子句(以及下面的ORDER BY 子句)中能夠使用count等聚合函式,并且,Having子句可以很快的實作這個效果
例:``
select product_type,count(*) from product group by product_type Having count(*)=2;
也就是說 只有select子句和having子句以及order by 子句中能夠使用聚合函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/168738.html
標籤:其他
下一篇:超級簡單的sql入門(一)
