distinct 把查询结果去除重复记录
⚠:distinct只能出现在所有字段的最前方
出现在两个字段之前,表示两个字段联合起来去重
四、连接查询
从一张表中单独查询称为单表查询。跨表查询,多张表联合起来查询数据被称为连接查询。
1、内连接之等值连接
内连接的两张表没有主次关系
--?查询每个员工所在部门名称,显示员工名和部门名
select e.name,d.dname from emp e,dept d where e.deptno=d.deptno;(sql92语法
select e.name,d.dname from emp e (inner)join dept d on e.deptno=d.deptno;(sql99语法
带着inner的可读性更好
等值连接是因为on后面接的是等式
2、内连接之非等值连接
--?查询员工的工资等级
select e.ename,s.grade from emp e join salgrade s on e.sal between s.lowsal and s. highsal;
3、内连接之自连接
--?查询员工的上级领导,要求显示员工名和对应的领导名
select a.ename as '员工名',b.ename as '领导名' from emp.a join emp.b on a.mgr = b.empno;
自连接技巧:一张表看成两张表
4、外连接(右外连接)
select e.name,d.dname from emp e right (outer)join dept d on e.deptno=d.deptno;
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表
5、外连接(左外连接)
select e.name,d.dname from dept d left (outer) join emp e on e.deptno=d.deptno;
左右连接的写法是可以互换的
--?查询每个员工的上级领导,要求显示所有员工的名字和领导名
select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr=b.empno;
6、三张表、四张表的连接
select...from a join b on a和b的连接条件
join c on a和c的连接条件
join d on a和d的连接条件
一条sql语句中内外连接可以混用
--?找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级
select e.ename as '员工名',d.dname as ‘部门名',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.lowsal and s.highsal;
--?找出每个员工的部门名称以及工资等级,要求显示员工名、领导名、部门名、薪资、薪资等级
select e.ename as '员工名',e1.ename as '领导名',d.dname as ‘部门名',e.sal,s.grade from emp e join dept d on e.deptno = d.deptno left join emp e1 on e.mgr=e1.empno join salgrade s on e.sal between s.lowsal and s.highsal;
五、子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询
1、where中的子查询
--?找出比最低工资高的员工姓名和工资
select ename,sal from emp where sal>(select min(sal) from emp);
2、from中的子查询
from后面的子查询,可以将子查询的查询结果当做一张临时表
--?找出每个岗位的平均工资的薪资等级
select a.*,s.grade from (select job,avg(salary) as avgsal from emp group by job) as a join salgrade s on a.avgsal between s.lowsal and highsal;
3、select后面出现的子查询
--?找出每个员工的部门名称,要求显示员工名,部门名
select e.name,e.deptno,(select d.name from dept d where e.deptpno =d.deptno) as dname from emp;
六、union合并查询结果集
--?查询工作岗位是manager和salesman的员工
①select ename,job from emp where job='manager' or job='salesman';
②select ename,job from emp where job in ('manager','salesman');
③select ename.job from emp where job='manager'
union
select ename.job from emp where job='salesman';
⚠union的效率要高一些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积现象,成倍增长,但是union可以减少匹配的次数,在减少匹配次数的情况下,还可以完成两个结果集的拼接。
⚠union使用中的注意事项
union在进行结果集 合并的时候,要求两个结果集的列数相同