-- 查询所有工作在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号部门最低工资的部门的编号、名称及部门最低工资。