个人主页:Lei宝啊
愿所有美好如期而遇
目录
复合查询
基本查询回顾
多表查询
自连接
子查询
单行子查询
多行子查询
多列子查询
在from子句中使用子查询
合并查询
union
union all
实战OJ
复合查询
前面我们讲解的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;