2019-03-26

-- 查询所有工作在new york 和chicago的员工姓名 员工编号 以及它们的经理姓名 经理编号

select e.ename,e.empno,m.ename,m.empno

from emp e

join emp m

on e.mgr = m.empno

join dept d

on d.deptno = e.deptno

where loc in('new york','chicago')

-- 交叉连接:笛卡尔积

select ename,sal,dname

from emp

cross join dept

-- 自然连接:两张表同名同类型的字段进行等值连接

select ename,sal,dname

from emp

natural join dept

-- USING子句

select ename,sal,dname

from emp

join dept using(deptno)

-- join on 语句

-- 外部链接

-- 左(外)连接left (outer) join,以关键字左边的表为主表,主表中记录都要显示,

-- 若没有匹配的记录 另一张表出空值匹配

-- 查询所有员工的姓名 工资 部门名称 没有部门的也要显示

SELECT ename,sal,dname

from emp e

left join dept d

on e.deptno = d.deptno

-- 右(外)连接right(outer) join,

-- 全(外)连接full (outer) join mysql不支持该功能

-- 查询所有员工的姓名 工资 部门编号 部门名称 没有员工的部门的也要显示

select ename,sal,e.deptno,d.deptno,dname

from emp e

RIGHT JOIN dept d

on e.deptno = d.deptno

-- 4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级

select ename,dname,loc,grade

from emp e

join dept d

join salgrade

on e.deptno = d.deptno and sal BETWEEN losal and hisal

where loc = 'CHICAGO'

-- 5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。

select e.ename,m.ename

from emp e

left join emp m

on e.mgr = m.empno

-- 1.显示员工SMITH的姓名,部门名称,直接上级名称

select ename,dname,mgr

from emp

natural join dept

where ename = 'SMITH'

-- 2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。

select ename,dname,sal,grade

from emp e

join dept d

join salgrade

on e.deptno = d.deptno and sal between losal and hisal

where grade >4

-- 3.显示员工KING和FORD管理的员工姓名及其经理姓名。

select e.ename,m.ename

from emp e

join emp m

on e.mgr = m.empno

where m.ename = 'KING'or m.ename = 'ford'

-- 4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。

select e.ename,e.hiredate,m.ename,m.hiredate

from emp e

join emp m

on e.mgr = m.empno

where e.hiredate < m.hiredate

-- 函数

-- now() curdate() curtime()

-- date_format(date,format)

-- 5个分组函数

-- max(expr) min(expr):所有数据类型

select max(sal),min(sal)

from emp

select max(hiredate),min(hiredate)

from emp

-- sum(expr) avg([DISTINCT] expr) 只能操作数值

select SUM(sal),AVG(sal)

from emp

-- count(expr) 返回个数

select count(empno) from emp

-- 分组函数忽略空值计算

select count(comm) from emp

select avg(ifnull(comm,0)) from emp

-- 查询emp表中有多少个员工

select count(empno)

from emp

where deptno = 20

select count(empno)

from empwhere job = 'SALESMAN'

-- 使用分组函数有严格限制 select子句后面不能再随意写

select deptno,count(empno)

from emp

-- 查询 emp表中有多少员工

select count(*)

from emp

-- 1.查询部门20的员工,每个月的工资总和及平均工资。

select SUM(sal),AVG(sal)

from emp

where deptno = 20

-- 2.查询工作在CHICAGO的员工人数,最高工资及最低工资。

select count(ename),MAX(sal),MIN(sal)

from emp e

join dept d

on e.deptno = d.deptno

where loc = 'chicago'

-- 3.查询员工表中一共有几种岗位类型。

select count(DISTINCT job)

from emp

-- 分组

-- 求各部门平均工资

select avg(sal)

from emp

group by deptno

SELECT deptno,avg(sal)

from emp

where sal >1500

group by deptno

-- where中不能有别名,where中不能用分组函数

-- 求各部门平均工资 要求只显示1600以上的

select deptno,avg(sal)

from emp

group by deptno

having avg(sal) >1600

-- 查询每个部门的平均工资 1500以下的不算

select deptno,avg(sal)

from emp

where sal>= 1500

group by deptno

-- 查询每个部门每个岗位的工资总和

select deptno,job,sum(sal)

from emp

group by deptno,job

-- 1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。

SELECT d.deptno,dname,count(empno),max(sal),min(sal),sum(sal),avg(sal)

from emp e

join dept d

on e.deptno = d.deptno

group by d.deptno-- ,dname 兼容其他数据库的格式

-- 2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。

select d.deptno,dname,job,count(empno),max(sal),min(sal),sum(sal),avg(sal)

from emp e

join dept d

on e.deptno = d.deptno

group by  d.deptno,job

-- 3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。

select count(e.empno),m.empno,m.ename

from emp e

left join emp m

on e.mgr = m.empno

group by m.empno

-- 查询每个部门最高工资 只显示2900以上的

select deptno,max(sal) maxsal

from emp

group by deptno

having maxsal > 2900

-- select 语句执行过程

-- 书写顺序 select from where group by having order by LIMIT

-- 执行顺序 from where group by having select order by LIMIT

-- where不能使用列别名

-- where不能使用分组函数

-- order by可以使用列别名

-- 不分组不允许单独使用having

-- 查询部门平均工资2000以上的员工姓名 工资

-- 1.查询部门人数大于3的部门编号,部门名称,部门人数。

select d.deptno,dname,count(empno)

from emp e

join dept d

on e.deptno = d.deptno

GROUP BY d.deptno

having count(empno)>3

-- 2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,

-- 部门平均工资,并按照部门人数升序排序。

SELECT d.deptno,dname,count(empno),AVG(sal)

from emp e

join dept d

on e.deptno = d.deptno

group by d.deptno

HAVING count(empno) > 2 and avg(sal)>2000

order by count(empno) ASC

-- 子查询(嵌套查询)

-- 查询比clark工资高的员工信息

select *

from emp

where sal>(select sal from emp where binary ename = 'CLARK')

-- 查询比king入职时间晚的员工信息

select *

from emp

where hiredate >(select hiredate from emp where ename = 'KING')

-- 查询工资最高的员工姓名 工资

select ename,sal

from emp

where sal =(select max(sal) from emp)

-- 查询比20号部门平均工资高的员工信息

select *

from emp

where sal >(select avg(sal) from emp where deptno = 20)

SELECT *

from emp

where empno in(select mgr from emp )

SELECT *

from emp

where empno not in(select mgr from emp where mgr is not null)

-- 查询部门最低工资比1000高的部门编号及最低工资

select deptno,min(sal)

FROM emp

group by deptno

having min(sal) >1000

-- 查询部门最低工资比20部门最低工资高的部门编号及最低工资

select deptno,min(sal)

FROM emp

group by deptno

having min(sal) >(select min(sal) from emp where deptno = 20)

-- 1.查询入职日期最早的员工姓名,入职日期

select ename,hiredate

from emp

where hiredate = (select min(hiredate)from emp)

-- 2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称

select ename,sal,dname

from emp e

join dept d

on e.deptno = d.deptno

where sal>(select sal from emp where binary ename = 'SMITH') and loc = 'CHICAGO'

-- 3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期

select ename,hiredate

from emp

where hiredate <(select min(hiredate) from emp where deptno = 20)

-- 4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数

select e.deptno,dname,count(empno)

from emp e

join dept d

on e.deptno = d.deptno

group by d.deptno,dname

having count(empno)>(

select avg(renshu)

from(

select count(empno)renshu

from emp

group by deptno)rs

)

-- 1.查询部门平均工资在2500元以上的部门名称及平均工资。

-- 2.查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。

-- 3.查询部门人数在2人以上的部门名称、最低工资、最高工资,并对求得的工资进行四舍五入到整数位。

-- 4.查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。

-- 5.显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序。

-- 6.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。

-- 7.查询工资最高的员工姓名和工资。

-- 8.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。

你可能感兴趣的:(2019-03-26)