在我們的日常工作中,寫sql的時候,group by應該是每個程序員都會遇到的。
今天,我們來談論一下關於group by 的相關理解。
針對group by 的例子,我們可以寫成如下樣子:
select (1) from your_table where (2) group by (3) having (4)
下面我們來看一下1、2、3、4分別代表什么,應該怎么用?
首先,我們來看(3):
(3)為group by的字段,字段的選擇為:前面sql語句(select (1) from your_table where (2))鎖查詢出來的字段和聚合函數。
其次,來看(1):
因為,我們再語句中用到了group by,所以,(1)中的列只能是group by 的列或聚合函數(avg,max,min... ...)
再來看(2):
(2)中的限制條件是針對前面查詢語句(select (1) from your_table)和一般where語句無異。
最后,我們來看(4):
(4)是什么呢?其實(4)和where的作用是一樣的,不同的是它(4)限制的范圍為group by 的字段或聚合函數。
說了這么多,大家肯定還是有疑惑。
下面我們用一個實例來進行說明:
--創建表並插入數據: create table sc( 學號 char(3), 課程號 char(5), primary key(學號,課程號), 成績 int ); --然后插入數據: insert into sc values('103','3-245',86); insert into sc values('105','3-245',75); insert into sc values('109','3-245',68); insert into sc values('103','3-105',92); insert into sc values('105','3-105',88); insert into sc values('109','3-105',76); insert into sc values('101','3-105',64); insert into sc values('107','3-105',91); insert into sc values('108','3-105',78); insert into sc values('101','6-166',85); insert into sc values('107','6-166',79); insert into sc values('108','6-166',81);
好了,現在我們有了表和數據,我們來完成一個實驗吧!
實驗:查詢最低分大於70,且最高分小於90的學號列。
首先,我們應該考慮的是,我們是不是需要分組,針對這個實驗,答案是肯定的。
那么,我們又應該以哪一個字段作為依據進行分組呢?分析過后,我們應該以學號作為分組。
最后,我們看到有兩個比較關鍵的字眼“最低分”、“最高分”。那么我們是一定需要用到聚合函數的。
明白以上幾個點后,我們就要編寫sql語句了。
這個sql語句可以編寫為:
select 學號,min(成績)as 最低分,max(成績)as 最高分 from sc group by 學號 having MIN(成績) > 70 and MAX(成績) < 90;
結果如下: