目录
连接查询
连接查询这里更多的时需要自己动手去操作着理解,所以尽可能的给例子,更多的给大家练习。
多表连接查询就是从多个表中获取数据,若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数就是两张表记录的乘积,该现象被称为笛卡尔积现象。
#展示员工信息和所在部门的信息,56条:14×4(笛卡尔积)
select * from emp,dept;
内连接
根据连接条件从多个表中查询选择数据,显示这些表中与连接条件相匹配的行,组合成新的记录。
分类:
- 等值查询:连接条件为相等判断的
select 字段1[,字段2,.....] from 表1
join 表2 on 连接条件(字段1 = 查询的字段1的值);
- 非等值查询:连接条件不为相等判断
select 字段1[,字段2,.....] from 表1
join 表2 on 连接条件(字段1 <> 查询的字段1的值);
- 自连接:在一个连接查询中,涉及的两个表都是同一张表的查询,自连接是一种特殊的连接查询,它指相互连接的表在物理上为同一张表,在逻辑上分为两张表。
select 字段1[,字段2,.....] from 表名 别名
join 表名 别名 on 连接条件;
外连接
A表和B表能够完全匹配的记录查询出来外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录时,会自动模拟出NULL的值与之匹配。
注意:外连接的查询结果条数 >= 内连接的查询结果条数
分类:
- 左外连接 left [outer] join 表名 on连接条件 显示左表的全部记录,右表满足连接条件的记录
- 右外连接 right [outer] join 表名 on连接条件 显示右表的全部记录,左表满足连接条件的记录
连接查询练习
练习答案在最后
1.查询员工名以及所对应的部门名称
2.查询员工薪水所对应的薪水等级
3.查询出员工名以及所对应的领导姓名
4.查询出员工所对应的部门名称,要求显示所有部门
5.查询员工所对应的部门名称,要求显示所有员工
6.查询出员工的部门名称,员工的领导名称和薪水等级
子查询
子查询,嵌套在其他SQL语句内的查询语句,且必须出现在圆括号之内(查询一般指select语句)。
子查询的结果可以作为外层查询的过滤条件或计算字段。
(select 语句)
就是子查询的基本结构,可以把子查询当作查询条件,也可以当作表
使用子查询过滤
子查询一般与 [not] in 结合使用,也可以使用其他运算符:> < =
select 字段1[,字段2,....]
from 表1
where 字段 [not] in (select 字段 from 表2 where 条件);
#查找所在部门名包含e的员工信息
select *
from emp
where deptno in (select deptno from dept where dname like '%e%');
any,some:any和some含义相同,与子查询结果集中的值比较,有任意一个满足条件即可。
#佣金比有的人工资还高的员工
select *
from emp
where ifull(comm,0) > any(select sal from emp);
子查询作为计算字段
select
字段1,
字段2,
....,
(select 聚合函数 from 表2 [where 表2.字段1=表1.字段1])
from 表1 [where 条件];
#查询部门名和部门人数
select dname,(select count(*) from emp where dept.deptno = emp.deptno) as emps
from dept;
子查询练习
同样的练习答案在最后
1.找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
2.找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级
3.查询员工信息,查询那些是管理者,要求显示出其员工编号和员工姓名
4.查询出薪水大于任一部门的平均薪水的员工信息
练习答案
连接查询答案
1.查询员工名以及所对应的部门名称
select ename,dname from emp
join dept on emp.deptno = dept.deptno;
2.查询员工薪水所对应的薪水等级
select sal,grade from emp
join salgrade on emp.sal between salgrade.losal and salgrade.hisal;
3.查询出员工名以及所对应的领导姓名
select e1.ename,e2.ename as mgrname from emp e1
join emp e2 on e1.mgr = e2.empno;
4.查询出员工所对应的部门名称,要求显示所有部门
select ename,dname from emp
right join dept on emp.deptno = dept.deptno;
5.查询员工所对应的部门名称,要求显示所有员工
select ename,dname from emp
left join dept on emp.deptno = dept.deptno;
6.查询出员工的部门名称,员工的领导名称和薪水等级
select e1.ename,dname,e2.ename as mgrname,grade from emp e1
join dept on e1.deptno = dept.deptno
join emp e2 on e1.mgr = e2.empno
join salgrade on e1.sal between salgrade.losal and salgrade.hisal;
子查询答案
1.找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
select ename,sal
from emp
where sal > (select avg(sal) from emp);
2.找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级
select deptno,avg_sal,grade
from (select deptno,avg(sal) avg_sal from emp group by deptno) t1
join salgrade
on avg_sal between losal and hisal;
3.查询员工信息,查询那些是管理者,要求显示出其员工编号和员工姓名
select empno,ename
from emp
where empno in (select distinct mgr from emp where mgr is not null);
4.查询出薪水大于任一部门的平均薪水的员工信息
select *
from emp
where sal > any(select avg(sal) from emp group by deptno);