扫一扫,加我们为好友有惊喜哦~
-->

核心课程
开班动态
专题服务

您当前所在位置:首页 > 中心动态 >>
[常州cad培训]MySql分组查询及子查询

1、分组查询
A、所有出现在select字句,但没有出现在分组函数(多行函数)中的字段,一定要出现在group by中
B、group by可以和where搭配,where一定要出现在group by之前,where中不能有分组函数
   group by可以和having搭配,having出现在group by之后,having中可以有分组函数


select max(sal) from emp;
select min(sal) from emp;
select * from emp;

-- 查询每个岗位的平均薪水
select job,round(avg(sal),2) from emp group by job;
select avg(sal) from emp where job='开发';

-- 查询每个部门每个岗位的平均薪水
select deptno,job,avg(sal) from emp group by deptno,job;

-- 查询每个部门的平均薪水,没有部门的员工不参加统计
select deptno,round(avg(sal),2) from emp where deptno is not null group by deptno order by avg(sal) desc;

-- 查询每个领导的领导编号和下属人数的数量(没有领导不参加统计),按照下属人数数量降序排序
select mgr,count(*) from emp where mgr is not null group by mgr order by count(*) desc;

-- 查询每个部门的员工中薪水在2000~8000的总人数,按人数降序排序

-- 查询每个部门的最高薪水,没有部门的员工不参加统计(最高薪水在5000以下的部门不显示)
select deptno,max(sal) from emp where deptno is not null group by deptno having max(sal) >= 5000;

-- 查询每个部门的平均薪水,薪水在2000以下的不参加统计,显示平均薪水在4000以上的部门及其平均薪水,按平均薪水降序排序

-- 查询每个岗位的总人数,入职在1年以内的不参加统计,没有岗位的不参加统计,按人数降序,显示人数在3人以上的部门及其部门人数

2、distinct:去除重复的记录
-- 查询公司岗位
select distinct job from emp;

-- 查询每个部门有哪些岗位,按部门升序,部门相同按岗位升序(没有部门的不显示)
select distinct deptno,job from emp where deptno is not null order by deptno,job;

3、子查询
A、单行子查询:子查询的结果只有一条记录
-- 查询在平均薪水以上的员工信息
select avg(sal) from emp;
select * from emp where sal >= (select avg(sal) from emp);

-- 计算公司的平均薪水,不含最高薪水和最低薪水
select round(avg(sal),2) from emp
  where sal != (select max(sal) from emp)
    and sal != (select min(sal) from emp);

-- 计算和James在同一个部门的员工信息
select * from emp where deptno=(select deptno from emp where ename='James');

-- 计算James所在部门的最高薪水
select max(sal) from emp where deptno=(select deptno from emp where ename='James');

-- 查询James所在部门的最高薪水对应的员工信息
select * from emp
   where deptno=(select deptno from emp where ename='James')
   and sal=(select max(sal) from emp where deptno=(select deptno from emp where ename='James'));

-- 查询和Mike的上级在同年入职的员工信息

-- 查询财务岗位入职1年以上的员工中薪水在这批员工的平均薪水以上的人

B、多行子查询:子查询的结果不止一行
-- in:表示在某个集合内,例如:查询和最高薪水在同一个部门的员工信息
select * from emp where deptno in(select deptno from emp where sal=(select max(sal) from emp));

-- all
-- 查询薪水比1号部门的最高薪水还高的员工信息
select * from emp where sal >= (select max(sal) from emp where deptno=1);
-- > all表示大于最大值 <all 小于最小值
select * from emp where sal >= all(select sal from emp where deptno=1);

-- any:> any表示大于最小值, < any 小于最大值
-- 查询比3号部门最低薪水还高的员工信息
select * from emp where sal >= any(select sal from emp where deptno=3);
select * from emp where sal >= (select min(sal) from emp where deptno=3);

4、多表查询
一对一:如,一个员工对应一条个人联系方式
一对多:如,一个员工有多个订单,一个员工有多条考试成绩,一个员工有多条考勤记录...

A、等值连接
-- 查询员工及其所在部门的基本信息
-- 笛卡尔集
select * from emp,dept;
select * from emp,dept where emp.deptno=dept.deptno;

-- 查询员工编号、姓名、薪水、部门编号、部门名称
select empno,ename,sal,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
-- 明确指定字段所在的表以提高查询效率
select emp.empno,emp.ename,emp.sal,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;

-- 为表起别名来简化sql语句,注意:为表起别名不能用as也不能加引号
select e.empno,e.ename,e.sal,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;

-- 多表分组
-- 查询每个部门的平均薪水,没有部门的不需要统计,显示部门名称和平均薪水
select d.dname,round(avg(e.sal),2) from emp e,dept d where e.deptno=d.deptno group by d.dname;

-- 多表子查询
-- 查询在'开发部'最高薪水对应的员工
select max(sal) from emp e,dept d where e.deptno=d.deptno and d.dname='开发部';
select * from emp e,dept d
   where e.deptno=d.deptno
   and d.dname='开发部'
   and e.sal=(select max(sal) from emp e,dept d where e.deptno=d.deptno and d.dname='开发部');

select * from emp where deptno=(select deptno from dept where dname='开发部')
   and sal=(select max(sal) from emp where deptno=(select deptno from dept where dname='开发部'));


5、约束


精彩文章推荐
【常州电脑培训】做seo会出现的误解[2014-3-26]
常州东方博宜学员对任课老师的评价[2013-12-27]
【常州Java培训】优化JDBC代码[2013-6-18]
Validation框架验证——常州电脑培训[2012-6-30]
Java小游戏练习:找数字对——常州电脑培训[2012-6-20]
【常州电脑培训】数据库游标的应用[2012-6-7]
【常州淘宝开店技巧】淘宝开店怎么安全刷信誉[2012-5-8]
常州网络营销培训-常州博客推广方法[2011-12-16]


返回顶部