个人主页:Lei宝啊
愿所有美好如期而遇
目录
复合查询
前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够
基本查询回顾
回顾我们建的表
以及三张表内的数据
查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
按照部门号升序而雇员的工资降序排序
使用年薪进行降序排序
显示工资最高的员工的名字和工作岗位
显示工资高于平均工资的员工信息
显示每个部门的平均工资和最高工资
显示平均工资低于2000的部门号和它的平均工资
显示每种岗位的雇员总数,平均工资
多表查询
实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询,也就是上面我们给出的表。
显示雇员名、雇员工资以及所在部门的名字
(因为上面的数据来自EMP和DEPT表,因此要联合查询)
显示部门号为10的部门名,员工名和工资
显示各个员工的姓名,工资,及工资级别
自连接
自连接是指在同一张表连接查询
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
使用的子查询
使用多表查询(自查询)
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询
返回一行记录的子查询
显示SMITH同一部门的员工
多行子查询
返回多行记录的子查询
in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自
己的
all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
在from子句中使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
先找出各个部门的平均工资,将其与emp表做笛卡尔积后,通过工资和部门条件筛选出来。
select ename,emp.deptno,sal,avgsal
from emp,(select deptno,avg(sal) avgsal from emp group by deptno)
where emp.deptno=avg.deptno
and sal>avgsal;
也许你会有疑问,avgsal不是求平均值吗,前面三个数据没有分组,为什么能够做聚合?首先,我们在from那里就已经做出了avgsal的表,而且已经拼接。
查找每个部门工资最高的人的姓名、工资、部门、最高工资
select ename,sal,emp.deptno,m
from emp,(select deptno,max(sal) m from emp group by deptno) max
where emp.deptno=max.deptno
and sal=m;
显示每个部门的信息(部门名,编号,地址)和人员数量
子查询
select dept.dname,emp.deptno,dept.loc,count
from (select deptno, count(*) count from emp group by deptno) emp,dept
where emp.deptno=depto;
多表查询
select dept.dname,dept.deptno,dept.loc,count(*)
from emp,dept
where emp.deptno=dept.deptno
group by dname,loc,dept.deptno;
合并查询
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all
union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
将工资大于2500或职位是MANAGER的人找出来
union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
实战OJ
查找所有员工入职时候的薪水情况_牛客题霸_牛客网 (nowcoder.com)
select emp.emp_no,sal.salary from employees emp,salaries sal
where emp.emp_no=sal.emp_no and emp.hire_date=sal.from_date
order by emp.emp_no desc;
获取所有非manager的员工emp_no_牛客题霸_牛客网 (nowcoder.com)
select emp_no from employees
where emp_no not in (select emp_no from dept_manager);
获取所有员工当前的manager_牛客题霸_牛客网 (nowcoder.com)
select emp.emp_no,man.emp_no manager from dept_emp emp,dept_manager man
where emp.dept_no=man.dept_no
and emp.emp_no<>man.emp_no;