数据查询语句(DQL)2

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条数据

原文地址:https://www.cnblogs.com/homle/p/14969763.html