1. 去重(distinct)
(1)去除重复的职业
select distinct job from emp;
(2)所有字段都去重,distinct只能出现在所有字段最前面
select distinct deptno,job from emp; distinct和deptno拼接后去重
(3)统计岗位的数量,先去重再统计数量
select count(distinct job) from emp;
2. 连接查询(内连接,外连接)
内连接中的等值连接(连接条件时相等的)
(1)每个员工的部门:
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno; 加上条件限制过滤显示有效数据(SQL92语法,已经不推荐使用)
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno; SQL99语法,表的连接使用join,on后面跟条件
内连接中的非等值连接(连接条件是非等值的)
(1)员工的薪资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and hisal;
内连接中的自连接(一张表看作两张表,自己连接自己,既可以使用等值连接,也可以使用非等值连接)
(1)每个员工的领导
select a.ename as '员工',b.ename '领导' from emp a join emp b on a.mgr = b.empno; 这种情况由于king没有领导,会自动取消king,外连接可以解决这个问题
把emp表看作两张表a,b,a表是员工表,b表是领导表,当员工表中的领导编号 = 领导表的员工编号时,可以显示员工领导
外连接(左外连接,右外连接)
两张表有主,副表之分,没有数据的自动补充NULL
(1)左外连接,每个员工的领导
select a.ename as '员工',b.ename as '领导' from emp a left join emp b on a.mgr = b.empno; 左边是主表,king没有领导,自动补充NULL,而不是像内连接那样取消
(2)右外连接
select a.ename as '员工',b.ename as '领导' from emp b right join emp a on a.mgr = b.empno; 右边是主表
(3)还可以使用where语句
select d.* from emp e right join dept d on e.deptno = d.deptno where e.ename is NULL;
三张表做连接查询(两张表做连接查询,然后在和另外一张表做连接)
(1)员工,员工部门,薪资等级
select e.ename,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and hisal;
(2)员工,员工部门,薪资等级和领导
select e.ename as '员工',d.dname,s.grade,e1.ename '领导' from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal join emp e1 on e.mgr = e1.empno;
3. 子查询
where后面嵌套子查询
(1)工资高于平均工资的员工
select ename,sal from emp where sal > (select avg(sal) from emp);
from后面嵌套子查询
(1)每个部门平均薪资的等级
先求出每个部门的平均薪资作为表t,然后和salgrade表做连接查询,求出平均薪资的等级
select s.grade,t.* from (select deptno,avg(sal) as avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and hisal;
(2)先求每个部门的薪资等级,然后按照部门分组,求等级的平均值
select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group by e.deptno;
4. union (可以对两张无关的表相加)
(1)查询工作岗位是manager或是salesman的员工:
select ename from emp where job = 'manager' or job = 'salesman';
select ename from emp where job in('manager','salesman');
select ename from emp where job = 'manager' union select ename from emp where job = 'salesman';
5. limit(分页查询)
mysql中特有的,其他数据库中没有;取结果集中部分数据,格式:limit startindex,length;
(1)员工工资前5位员工:
select ename,sal from emp order by sal limit 0,5;
6. 笛卡尔积现象
当两张表进行连接查询时,没有任何条件限制,最终的查询结果条数是两张表记录条数的乘积
select e.ename,d.dname from emp e,dept d; 没有任何条件限制,所有会显示56条数据