1. 程式人生 > 其它 >SQL:group by中屬性為什麼一定要出現在select語句中?

SQL:group by中屬性為什麼一定要出現在select語句中?

技術標籤:SQL資料庫sql

問題:按授課班號統計選修該課程的人數,並按照人數升序排列。

--cno是課程號,sno是學號,sc是選修課程表
select cno,COUNT(distinct sno) as 人數 from sc
group by cno
order by 人數 ASC

上面的select語句中包含了cno以及聚集函式,最後的執行結果如下圖:
在這裡插入圖片描述
下面看看刪去cno 改成sno的執行結果:
**加粗樣式
**
當select語句中出現了不在group by語句中的欄位就會報錯,錯誤資訊也表示是這個錯誤。
個人理解,原因如下:

  • group by是按照給定的屬性進行分組,分組後每個組可能出現多值,例如題目中分組後一組可能有多個選修該課程的同學,在這種情況下再使用其餘屬性名去訪問或查詢時會出現歧義,例如SQL中select的是名字,一個班很多人沒有辦法給定
  • 那麼為什麼可以存在聚集函式?首先得看看程式碼執行順序
  • 1.from子句組裝來自不同資料來源的資料;
    2.where子句基於指定的條件對記錄行進行篩選;
    3.group by子句將資料劃分為多個分組;
    4.使用聚集函式進行計算;
    5.使用having子句篩選分組;
    6.計算所有的表示式;
    7.使用order by對結果集進行排序;
    8.select 集合輸出。
  • 可以看出,聚集函式是在group by之後執行的,所以會在各個分組中進行執行,不會出現有歧義的情況。

以上是個人理解,如有錯誤歡迎指出!