單表:
HAVING過濾
二次篩選 只能是group by 之后的字段
1.查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數
select post,group_concat(name),count(1) from employee group by post having count(1)<2;
2. 查詢各崗位平均薪資大於10000的崗位名、平均工資
select post,avg(salary) as a from employee group by post having a >10000;(怕avg為關鍵字,用as a 代替)
3. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資
select post,avg(salary) as a from employee group by post having a>10000 and a<20000;
order by 查詢排序
排序 order by age desc / asc
1. 查詢所有員工信息,先按照age升序排序,如果age相同則按照hire_date降序排序
select * from employee order by age asc,hire_date desc;
2. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列
select post,avg(salary) from employee group by post having avg(salary)>10000 order by avg(salary) asc; (order by 后面一定要有參數)
limit 限制查詢的記錄數:
select * from employee order by salary desc limit 5,5; (默認為0
從排好序的第五條開始,找5個)
多表查詢
- 多表連接查詢
select * from employee,department where employee.dep_id = department.id
外鏈接操作:
1.語法
inner /left/right join (顯示全部 有nul不顯示,優先左邊,沒有關聯的表為null/右邊優先)
select * from employe inner join department on employee.dep_id = department.id
全外鏈接 union
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
符合條件查詢
以內連接的方式查詢employee和department表,並且employee表中的age字段值必須大於25,
即找出年齡大於25歲的員工以及員工所在的部門
select employee.name,department.name from employee inner join department on employee.dep_id = department.id where age >25;
(on 后面跟着where 條件)
1、查詢平均年齡在25歲以上的部門名
select name from department where id in( select dep_id from employee group by dep_id having avg(age) >25) ;
通過在emp 表中找到的dep_id 對應上 dep 表中的id 而找到name
2、查看不足1人的部門名
select name from department where id not in(select dep_id from employee group by dep_id) ;
(利用共同的dep_id來判斷)
3、查詢大於所有人平均年齡的員工名與年齡
select name,age from employee where age> (select avg(age) from employee);
(這里找的是員工名和年齡 跟部門沒有關系,,,)
4、查詢大於部門內平均年齡的員工名、年齡
1)先對員工表(employee)中的人員分組(group by),查詢出dep_id以及平均年齡。
(2)將查出的結果作為臨時表,再對根據臨時表的dep_id和employee的dep_id作為篩選條件將employee表和臨時表進行內連接。
(3)最后再將employee員工的年齡是大於平均年齡的員工名字和年齡篩選。
select * from employee inner join (select dep_id,avg(age) as b from employee group by dep_id) as A on employee.dep_id = A.dep_id where employee.age>A.b;
5.查詢每個部門最新入職的那位員工
select name from employee inner join( select post,max(hire_date) as newtime from employee group by post) as A on employee .post = A.post where employee.hire_date=A.newtime;
同上,都是關於進行 on dep_id 的判斷 ,第二個則是關於where 的判斷
pymysql模塊的使用