课程回顾

  1. 数学相关函数
  2. 向下取整 floor()
  3. 四舍五入 round()
  4. 非四舍五入 truncate()
  5. 随机数 rand() 0-1
  6. 分组查询 group by
  7. having 后面写聚合函数的条件 需要结合group by使用 where后面写普通字段的条件
  8. 子查询:嵌套在另外一条sql语句中的查询语句称为子查询,可以嵌套n层
  9. 可写的位置:
    1. 写在where和having后面 当做查询条件的值
    2. 写在创建表的时候,把查询出来的结果保存到新的表中
    3. 写在from后面当成一张虚拟表 必须有别名
  10. 关联查询:同时查询多张表的查询方式称为关联查询
  11. 关联查询的查询方式三种:
  12. 等值连接:select * from A,B where A.x=B.x and A.age=18;
  13. 内连接: select * from A join B on A.x=B.x where A.age=18;
  14. 外链接: select * from A left/right join B on A.x=B.x where A.age=18;
  15. 如果需要查询两张表的交集数据使用等值连接和内连接(推荐)
  16. 如果查询一张表的全部数据和另外一张表的交集数据使用外链接(左外和右外都可以)
  17. 笛卡尔积:关联查询不写关联关系则会得到两张表的乘积,这个乘积称为笛卡尔积

作业:

  1. 每个部门的人数,根据人数降序排序 select deptno,count(*) c from emp group by deptno order by c desc;
  2. 每个部门中,每个主管的手下人数 select deptno,mgr,count(*) from emp where mgr is not null group by deptno,mgr;
  3. 每种工作的平均工资 select job,avg(sal) from emp group by job;
  4. 每年的入职人数 select extract(year from hiredate) year,count(*) from emp group by year;
  5. 少于等于3个人的部门信息

  6. 拿最低工资的员工信息 select * from emp where sal=(select min(sal) from emp);

  7. 只有一个下属的主管信息 -得到主管编号 select * from emp where mgr is not null group by mgr having count()=1; -通过主管编号查询详细信息 select * from emp where empno in(select mgr from emp where mgr is not null group by mgr having count()=1);

  8. 每月发工资最多的部门信息

  9. 下属最多的人,查询其个人信息 -得到最多的人数 select count() from emp group by mgr order by count() desc limit 0,1; -通过最大人数得到领导的编号 select mgr from emp group by mgr having count(*)=(select count() from emp group by mgr order by count() desc limit 0,1);

  10. 拿最低工资员工的同事信息 select min(sal) from emp;

    select job from emp where sal=(select min(sal) from emp);

    select * from emp where job=(select job from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);

  11. 和最后入职的员工在同一部门的员工信息 select max(hiredate) from emp; select deptno from emp where hiredate=(select max(hiredate) from emp); select * from emp where deptno=(第二坨) and hiredate!=(第一坨);
  12. 查询平均工资高于20号平均工资的部门信息 select avg(sal) from emp where deptno=20;

    select d.* from emp e join dept d on e.deptno=d.deptno group by d.deptno having avg(sal)>(select avg(sal) from emp where deptno=20);

  13. 查询员工信息和员工对应的部门名称 select e.*,d.dname from emp e join dept d on e.deptno=d.deptno;

  14. 查询员工信息,部门名称,所在城市 select e.*,d.dname,d.loc from emp e join dept d on e.deptno=d.deptno;
  15. 查询Dallas市所有的员工信息 select e.* from emp e join dept d on e.deptno=d.deptno where d.loc='dallas';
  16. 计算每个城市的员工数量 select d.loc,count(e.ename) from emp e right join dept d on e.deptno=d.deptno group by d.loc;
  17. 查询员工信息和他的主管姓名 select e.ename,m.ename from emp e join emp m on e.mgr=m.empno;
  18. 员工信息,员工主管名字,部门名 select e.ename,m.ename,d.dname from emp e join emp m on e.mgr=m.empno join dept d on e.deptno=d.deptno;
  19. 员工名和他所在部门名 select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
  20. 案例:查询emp表中所有员工的姓名以及该员工上级领导的编号,姓名,职位,工资 select e.ename,m.empno,m.ename from emp e left join emp m on e.mgr = m.empno;
  21. 案例:查询emp表中名字中没有字母'K'的所有员工的编号,姓名,职位以及所在部门的编号,名称,地址 insert into emp (empno,ename) values(10010,'苍老师');

    select e.empno,e.ename,e.job,d.* from emp e left join dept d on e.deptno=d.deptno where e.ename not like '%k%';

  22. 案例:查询dept表中所有的部门的所有的信息,以及与之关联的emp表中员工的编号,姓名,职位,工资 select d.*,e.empno,e.ename,e.job,e.sal from emp e right join dept d on e.deptno=d.deptno;

表设计之关联关系

一对一

一对多

多对多

表设计案例: 权限管理