使用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的封裝,同時...