1. 程式人生 > >mysql之分組查詢

mysql之分組查詢

ace spa 分享圖片 不能 sql語句 concat 排序 _id 分解

註:mysql中不區分大小寫,一般關鍵字用大寫,自己寫的用小寫就可以

分組查詢

1、select sum(salary) from person GROUP BY dept_id #按照部門分組後,求各個部門總的工資數。如果一個部門為空,那麽單獨作為一組

技術分享圖片

2、select sum(salary),dept_id from person GROUP BY dept_id #加上每個部門的id

技術分享圖片

3、select sum(salary) from person; #求出person表中所有人的工資

4、select sum(salary) as w,dept_id from person GROUP BY dept_id HAVING w>20000 #查詢出哪個部門總工資高於兩萬的

技術分享圖片

5、select max(salary),dept_id from person group by dept_id; #找出每個部門工資最大的那個人

技術分享圖片

6、select avg(salary),dept_id from person group by dept_id; #找出每個部門的平均工資

技術分享圖片

7、select avg(salary),dept_id,GROUP_CONCAT(name) from person group by dept_id; #找出每個部門的平均工資,並顯示每個組內所有的人

技術分享圖片

8、select avg(salary) as w,dept_id,GROUP_CONCAT(name) from person group by dept_id HAVING w>5000; 找出平均工資大於5k的部門,並顯示每個部門內所有的人

技術分享圖片

where 與 having區別:
#執行優先級從高到低:where > group by > having
#1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。
#2. Having發生在分組group by之後,因而Having中可以使用分組的字段,無法直接取到其他字段,可以使用聚合函數

分頁查詢

技術分享圖片

1、

原表格:

技術分享圖片

select * from person LIMIT 0,4; #id為1-4的分為一頁

技術分享圖片

select * from person LIMIT 0,4等價於select * from person LIMIT 4

SQL語句的執行順序:

select name, max(salary) 5 查找數據

from person 1 先拿數據 where name is not null 2 再判斷,通過條件過濾一下 group by name 3 分組 having max(salary) > 5000 4分組之後再根據條件進行過濾 order by max(salary) 6 對數據進行排序 limit 0,5 7 分頁

多表聯合查詢

1、select * from person,dept; #笛卡爾乘積,兩個表的數據結果相乘

技術分享圖片

2、select * from person p,dept d where p.dept_id=d.did; #這樣加條件之後就無數據重復了,如果person中由沒有部門或者是部門不在dept中的話,那麽就不再顯示了,同理如果dept中有person中沒有的,那麽也不會在這裏顯示的

技術分享圖片

技術分享圖片只有表A和表B中共有的數據才會顯示出來

3、select * from person left join dept on person.dept_id=dept.did #左連接查詢,特點就是左邊的表數據全出來,如果能跟右邊的表匹配出來那麽就顯示,如果匹配不 出來,只顯示左邊表中的匹配不出來的數據,此時person為基準表

以一張表為基準,符合條件的就拿過來,不符合條件的那麽扔掉,優點是基準表的所有數據都會顯示出來

技術分享圖片

4、select * from person right join dept on person.dept_id=dept.did #同理右連接,也可以將person和dept調換位置以實現右關聯,此時dept為基準表

技術分享圖片

5、select * from person inner join dept on person.dept_id=dept.did #內連接

多表聯合查詢和內連接是一樣的

技術分享圖片

6、select * from person left join dept on person.dept_id=dept.did #同理右連接

union #將重復的數據去掉實現全連接
select * from person right join dept on person.dept_id=dept.did #內連接

技術分享圖片

7、select * from person left join dept on person.dept_id=dept.did #同理右連接

union all #不去重實現全連接
select * from person right join dept on person.dept_id=dept.did #內連接

問題:查詢出 教學部 年兩大於20歲 並且工資小於1萬的員工 並按照工資進行降序排序

8、問題一步步分解

1)select * from dept where dname = ‘教學部‘

技術分享圖片

2)select did from dept where dname = ‘教學部‘

技術分享圖片

3)select * from person where age>20 and dept_id=1; #選出第二張表中年齡大於20且部門id為1的人

技術分享圖片

4)select * from person where age>20 and dept_id=(select did from dept where dname = ‘教學部‘); #選出第二張表中年齡大於20且部門id為1的人

技術分享圖片

5)select * from person where age>20 and dept_id=(select did from dept where dname = ‘教學部‘) and salary<10000 order by salary desc; #在括號裏的成為子查 詢

技術分享圖片

問題2: 查詢每個部門中最高員工工資和最低工資是多少,並顯示部門名稱

解析:每個部門就是要分組了,根據部門分組;顯示部門名稱:因為person中只有部門對應的數字,而在dept表中有數字對應的部門,所以得用多表聯合查詢

1)select max(salary),min(salary) from person group by dept_id

技術分享圖片

2)select max(salary),min(salary),dname from person left join dept on person.dept_id=dept.did group by dept_id

技術分享圖片

技術分享圖片

select avg(age),dname from person left join dept on person.dept_id=dept.did group by dept_id #求每個組的平均年齡

技術分享圖片

子語句查詢:

1、select * from (select * from person) as aaa

技術分享圖片

問題1:查找最大工資哪個人的姓名和薪水

select * from person where salary = (select max(salary) from person)

技術分享圖片

問題2:求工資高於所有人員平均工資的人員

select * from person where salary>(select avg(salary) from person)

技術分享圖片

問題3:查詢平均年齡在20歲以上的部門名

同理在person中只有部門名對應的數字,在dept中有數字對應的部門名,所以要用到聯合查詢

1)select * from person where (select avg(age) from person)>20

技術分享圖片

2)select dept_id from person where (select avg(age) from person)>20 #只是查詢出了person中平均年齡大於20歲的部門代表的數字

技術分享圖片

3)select dname from person left join dept on (select avg(age) from person)>20 group by dname #有問題的。。。不對

技術分享圖片

對於問題3別人的方法:

select dept_id from person GROUP BY dept_id HAVING avg(person.age) > 20 #就只能查到部門所對應的數字

技術分享圖片

問題4:查詢教學部下的員工信息

select * from person where dept_id = (select did from dept where dname =‘教學部‘);

技術分享圖片

2019.01.06 晚

20:16 距離睡覺還有好長時間

good night

haijing in HZ

mysql之分組查詢