SQL group by 語句注意事項

2022-06-09 03:57:10 字數 2010 閱讀 8169

使用group by子句的時候,一定要記住下面的一些規則

什麼時候使用group by?

可以考慮查詢結果是以什麼樣的形式返回的

e.g1:求每個學生的所有科目中的最高分,顯示學號,課程號,成績

這個題應該用學號來進行分組嗎?乍一看,我們需要對成績表中所有學號相同的元組進行處理,好像需要用到"group by 學號"來進行分組。然而,本題也可以避免使用group by。不妨簡單分析一下查詢結果

可以看到,本題學號確實是邏輯上的"自成一組",但是另外兩個屬性列課程號,並不應該隨著學號的分組而聚合。

select *

from cj as c1

where c1.成績 >= all

( select 成績

from cj as c2

where c1.學號 = c2.學號

)

如果這一題改成只需要求學號和成績,那麼可以用group by來直接呼叫max聚合函式。

-- 變式

select 學號,max(成績)

from cj

group by 學號

值得注意的是,這兩條並不等價,如果某個學生的兩門課均最大,前乙個**能夠將兩個均輸出,而後乙個不行

e.g2: 求每一年齡的學生人數

其查詢結果應該包含若干行和一列,若干行分別對應著不同的年齡,一列為各個年齡的人數

結果按照年齡的不同分為若干個組,人數屬性列需要按照不同的年齡進行聚合,因此需要使用group by按照年齡進行分組

select 年齡,count(*) as 人數

from xs

group by 年齡

e.g3: 求男同學的人數其查詢結果應該只有一行一列

結果只包含乙個組,因此不需要使用 group by 來額外分組

select count(*) as 男同學人數

from xs

where 性別 = '男'

e.g4: 查詢選課人數超過英語的選課人數的課程的課程號,課程名和人數簡單分析一下結果,首先,對於不同的課程,其選課人數一定是不同的。而成績表中包含的是所有學生、課程的選課記錄。因此我們必須通過按照課程號分組,聚合各門課程來求出各門課程的選課人數。其次,課程號與課程名是一一對應的,不應該對課程名進行聚合。諸如這種一部分屬性應該聚合,另一部分屬性不應該聚合的查詢要求,我們應該先用子查詢處理聚合的屬性,然後與非聚合的屬性進行連線。

select kc.課程號,kc.課程名,temp.人數

from kc right join

( select 課程號,count(*) as 人數

from cj

group by 課程號

) as temp on kc.課程號 = temp.課程號

where temp.人數 >

( select count(*)

from cj

where cj.課程號 =

( select 課程號

from kc

where kc.課程名 = '英語'

) )

SQL函式 SQL GROUP BY 語句

合計函式 比如 sum 常常需要新增 group by 語句。group by 語句用於結合合計函式,根據乙個或多個列對結果集進行分組。select column name,aggregate function column name from table name where column nam...

UPDATE語句關聯時需注意的事

oracle庫中,關聯其他表進行更新時,使用如下語句會出現乙個問題。update student a set a.name select b.name from student copy b where b.id a.id 執行完會發現,a表中未與b表對應上的記錄,name字段值均變為null了。我...

pytorch fine tuning注意事項

前言 這篇文章算是論壇pytorch forums關於引數初始化和finetune的總結,也是我在寫 中用的算是 最佳實踐 吧。最後希望大家沒事多逛逛論壇,有很多高質量的回答。引數初始化 引數的初始化其實就是對引數賦值。而我們需要學習的引數其實都是variable,它其實是對tensor的封裝,同時...