1. 程式人生 > >Mysql 語句之group by, having, count

Mysql 語句之group by, having, count

Mysql的group by, having, count

平時經常用錯,這裡舉一些使用的例子。

  • group by
  • having
  • 聚合函式count,avg,min,max,sum等

group by

根據by後面的欄位的值分組,值相同的歸為一組。

having

group by後,進行組類的判斷。where後面也是跟條件判斷,但是where是group by之前(如果有group by的話),針對每一行資料;having是針對group by後的組級別的資料。

count等聚合函式

  • count統計條數;
  • sum求和;
  • avg求平均;
  • max最大;
  • min最小。

注意:聚合函式並不只和group by一起用,不是隻有group by的地方才能用它。
比如: select count(*) from stu; # 統計stu表的條數

示例

1:group、兩個表join

create table tmp(rq varchar(10),shengfu nchar(1))

insert into tmp values('2005-05-09','勝')
insert into tmp values('2005-05-09','勝')
insert into tmp values('2005-05-09','負')
insert into tmp values
('2005-05-09','負') insert into tmp values('2005-05-10','勝') insert into tmp values('2005-05-10','負') insert into tmp values('2005-05-10','負')

統計:每一天的勝負次數。輸出是:rq,勝次數,負次數。

select a.rq, a.sheng, b.fu from (select rq, count(shengfu) sheng from tmp where shengfu='勝' group by rq, shengfu) a
join
(select rq, count(shengfu) fu from
tmp where shengfu='負' group by rq, shengfu) b on a.rq = b.rq

結果截圖

2:每個學生的成績在90分以上的各有多少門

create table sc (
sno int,
pno varchar(16),
grade int
)

insert into sc values(1, 'YW', 95)
insert into sc values(1, 'SX', 98)
insert into sc values(1, 'YY', 90)
insert into sc values(2, 'YW', 89)
insert into sc values(2, 'SX', 91)
insert into sc values(2, 'YY', 92)
insert into sc values(3, 'YW', 85)
insert into sc values(3, 'SX', 88)
insert into sc values(3, 'YY', 96)
insert into sc values(4, 'YW', 95)
insert into sc values(4, 'SX', 89)
insert into sc values(4, 'YY', 88)

select sno, count(*) from sc where grade>=90 group by sno;

# 剛開始寫成這樣下面這樣,是錯誤的:
select sno, count(*) from sc group by sno, grade having grade>=90

輸出結果:

輸出

3:至少有兩門課程在90分以上才能有資格,列出有資格的學生號及90分以上的課程數

select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2

輸出

4:列出平均成績大於等於90分並且語文課大於等於95的學生sno和平均成績

select sno, avg(grade) from sc where sno in (select sno from sc where grade>=95 and pno='YW') group by sno having avg(grade)>=90

# 兩種錯誤的,錯誤在哪自己分析
select sno from (select * from sc where pno='YW' and grade>=95) group by sno having avg(grade)>=90

select sno, grade from sc where sno in (select sno from sc group by sno having avg(grade)>=90) and pno='YW' and grade>=95 group by sno

輸出

5 :平均成績至少比學號是3的平均成績高的學生學號以及平均分數

# 兩種方法
select sno, avg(grade) from sc group by sno having avg(grade) > (select avg(grade) from sc where sno=3 group by sno)

select sno, avg(grade) from sc group by sno having avg(grade) > (select avg(grade) from sc where sno=3)
#上面這句,having後面的select子查詢,用到了聚合函式avg但是沒有group by。看出,group by和聚合函式不是天生在一起用的。

輸出

6 : 查詢每一個班級中年齡大於20且性別為男的人數

create TABLE Table1
(
    ID int auto_increment primary key,   
    classid int, 
    sex varchar(10),
    age int
) 

insert into Table1(classid, sex, age) values(1,'m',20)
insert into Table1(classid, sex, age) values(2,'f',22)
insert into Table1(classid, sex, age) values(3,'m',23)
insert into Table1(classid, sex, age) values(4,'m',22)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(2,'f',19)
insert into Table1(classid, sex, age) values(4,'m',26)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(1,'m',20)
insert into Table1(classid, sex, age) values(2,'f',22)
insert into Table1(classid, sex, age) values(3,'m',23)
insert into Table1(classid, sex, age) values(4,'m',22)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(2,'f',19)

select COUNT(*) as '>20歲人數', classid from Table1 where sex='m' and age>20 group by classid

# 原部落格錯誤的sql
select COUNT(*) as '>20歲人數', classid from Table1 where sex='m' group by classid,age having age>20 

輸出

7 : 班級人數大於等於3人的那些班級的學生

create table stu_class_info(
    sid int,
    class_id int,
    snane varchar(32)
)

insert into stu_class_info values(1, 1, 'zhangsan')
insert into stu_class_info values(2, 1, 'zhangsan')
insert into stu_class_info values(3, 2, 'zhangsan')
insert into stu_class_info values(4, 3, 'zhangsan')
insert into stu_class_info values(5, 2, 'zhangsan')
insert into stu_class_info values(6, 2, 'zhangsan')
insert into stu_class_info values(7, 2, 'zhangsan')
insert into stu_class_info values(8, 4, 'zhangsan')
insert into stu_class_info values(9, 4, 'zhangsan')
insert into stu_class_info values(10, 2, 'zhangsan')

# 班級人數大於等於3人的那些班級的學生
select * from stu_class_info where class_id in (select class_id from stu_class_info group by class_id having count(class_id)>=3) order by class_id

輸出

參考連結