zoukankan      html  css  js  c++  java
  • 数据查询语句(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条数据

  • 相关阅读:
    JVM工作原理--垃圾收集
    并发编程之单例模式
    设计模式之动态代理
    UML类图基础
    CAP理论的理解
    Dubbo RPC调用参数校验---错误message自动返回
    ELK日志分析系统搭建
    Kafka原理及应用(一)
    HTTPS的原理
    Maven 生命周期的概念(指令默认顺序执行)
  • 原文地址:https://www.cnblogs.com/homle/p/14969763.html
Copyright © 2011-2022 走看看