目录
基本查询回顾

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写

按部门号升序,按雇员的工资降序

使用年薪进行降序排序,由于奖金COMM有的是NULL所以用ifnull函数是null的就设为0

显示工资最高的员工的名字和工作岗位
-
先查最高工资再查表里符合条件的
-
嵌套查询
显示工资高于平均工资的员工信息
嵌套查找使用聚合统计avg来求平均值

显示每个部门的平均工资和最高工资
可以使用format来保留相应的精度

显示平均工资低于两千的部门号和该部门的平均工资
使用format返回字符串,having后不转换就会2000就会与字符串比较导致出错

显示每种岗位的雇员总数平均工资
使用count找该职位的人数

多表查询
实际上数据往往来自多个表,所以需要多表查询
将两个表做组合(本质就是穷举)

如下所示

可以通过where条件限制

显示员工名字、工资、所在部门名称
上面员工名字、工资来自于EMP表,所在部门名称在DEPT表里拿
显示部门号为10的部门名、员工名和工资

显示各个员工的姓名、工资及工资级别

自连接
自连接是在同一张表连接查询
将同一张表做重命名后就可以做笛卡尔积了

显示员工FORD的上级领导的编号和姓名
先找到FORD的领导编号
根据领导编号找领导的信息
可以通过子查询来寻找

我们要的条件都和表有关
如果emp1员工的名字为FORD,emp1 员工FORD的领导工号与emp2的工号相同,那一定是emp1与emp2穷举到此员工与其领导在一行,显示emp2的名字与工号即可

子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询
返回一行记录的子查询
显示与SMITH同部门的员工

多行子查询
返回多行记录的子查询(返回单列多行数据)
in关键字 判断一个列值是否在集合中
查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己

all关键字:比所有行都要高
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字:
显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

多列子查询
多列子查询则是指查询返回多个列数据的子查询语句
查询和SMITH的部门和岗位完全相同的员工,不包括SMITH本人
where (deptno,job)=(select deptno,job from EMP where ename='SMITH')
直接比较多个列,也可以用in ,查出的信息即使是成对的,但可以看为一个整体

在from中使用子查询
子查询语句出现在from子句中,把一个子查询当一个临时表来使用
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
将每个部门的平均工资与部门号查询出来做临时表,与EMP表做笛卡尔积形成一个表
select deptno,avg(sal) from EMP group by deptno;
select * from EMP, (select deptno,avg(sal) myavg from EMP group by deptno) as tmp (必须重命名)

查每个部门工资最高的人的姓名、工资、部门、最高工资
把每个部门最高工资找出来做临时表
(select deptno,max(sal) mymax from EMP group by deptno)做临时表
mysql> select ename,sal,t1.deptno,mymax from EMP t1,(select deptno,max(sal) mymax from EMP group by deptno) as t2 where t1.deptno=t2.deptno and t1.sal=t2.mymax;
显示每个部门的信息部门名、编号、地址和人员数量
将每个部门的人数做临时表
( select deptno,count(*) num from EMP group by deptno)

解决多表问题的本质:想办法将多表转化成为单表,所以mysql中所有select问题全部可以转成单表问题
合并查询
可以对多个select的执行结果做合并 union 与 union all
union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
union all:该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
将工资大于2500或者职位是MANAGER的人找出来
union会去重

这篇就到这里啦(づ ̄3 ̄)づ╭❤~