• 关联查询-高级查询


     关联查询-高级查询

    关联查询:表与表之间想要关联查询,关键点是连接条件。

    连接条件也就是两张表中都有的字段。一般若有n张表,连接条件至少有n-1个。

    实验中:SELECT DISTINCT E.ENAME,

    D.DNAME,D.DEPTNO FROM EMP E,

    DEPT D WHERE E.DEPTNO=D.DEPTNO;实验中emp表和dept表的连接条件就是DEPTNO,所以两张表可以建立连接;

    关联查询主要分为三种查询

    1.内连接 2.外链接 3.自连接

    1.内连接

    特点:表中不满足连接条件的是不会被显示的。

    select DISTINCT E.ENAME,

    D.DEPTNO,D.DNAME,D.LOC,E.SAL FROM EMP E JOIN DEPT D ON E.DEPTNO

    =D.DEPTNO WHERE E.SAL>1000;

    JOIN 表名 ON 连接条件 :用于表的连接 2.外连接

    特点:除了会将满足条件的数据显示出来,也会将不满足的条件显示出来

    A.左外连接(以左边的表为驱动表)若该表中某条记录不满足连接,右侧表中的字段为null

    关键字:LEFT OUTER

    案例:SELECT DISTINCT E.ENAME,

    D.DNAME FROM EMP E LEFT OUTER JOIN DEPT D

    ON E.DEPTNO=D.DEPTNO;

    B:右外连接(与左外连接相反)

    关键字 RIGHT OUTER

    案例:SELECT DISTINCT E.ENAME

    ,D.DNAME FROM EMP E RIGHT OUTER JOIN DEPT D ON

    E.DEPTNO=D.DEPTNO;

    C.全外连接(那边不满足那边null)

    关键字: FULL OUTER

    案例:SELECT DISTINCT E.ENAME,

    D.DNAME FROM EMP E FULL OUTER JOIN DEPT D ON

    E.DEPTNO=D.DEPTNO;

    D.自连接

    当前表的一条记录可以对应当前表自己的多条记录 在一个表中有上下级关系的时候使用!!!

    作业:--查看史密斯的上司在哪个城市工作

    SELECT DISTINCT E.ENAME,D.ENAME

    ,D.DEPTNO,DE.LOC FROM EMP E, EMP D,

    DEPT DE WHERE E.EMPNO=D.MGR AND E.DEPTNO

    =DE.DEPTNO AND D.ENAME='SMITH';

    --左外连接 右外链接 简写 +

    SELECT DISTINCT E.ENAME,

    D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO(+)=D.DEPTNO;

    那边有+号 就是那边外连接 全外连接不可以的

    高级查询

    1.子查询 (子查询其实就是一条SELECT查询语句,嵌在其他的SQL语句中)

    案例; 查询工资比 clark高的员工 SAL 后面就是子查询

    子查询必须用()包住

    SELECT ENAME,SAL FROM EMP WHERE SAL>(SELECT SAL FROM EMP WHERE ENAME='CLARK' );

    子查询在各个位置的使用情况

          A.在DDL中使用子查询 可以创建一张新表 在这其中 字段出现函数和表达式 要用AS 改别名

    案例: CREATE TABLE EMPLAYE AS SELECT DISTINCT E.ENAME AS 名字,E.EMPNO ,E.JOB AS 工作,E.SAL*12 AS 年薪, //这里记住有函数表达式需要改别名

    E.DEPTNO,D.DNAME,D.LOC FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO;

    SELECT * FROM EMPLAYE; //查看新创建表的各个字段及内容

         B.在DML中使用子查询

            DELETE FROM EMPLAYE WHERE DEPTNO=(SELECT DEPTNO FROM EMPLAYE WHERE NAME='CLARK' )

         C.子查询在where字句中 子查询根据查询结果分为:

               c1.单行单列子查询。常用于过滤条件,可以配合= >符号使用

               案例;--查询薪水比平均工资高的人 SELECT ENAME,SAL FROM EMP WHERE SAL>( SELECT AVG(SAL) FROM EMP //单行单列指的是子查询结果是单行单列 )

              C2.多行单列子查询 由于查询出多个值在判断条件时要用IN,判断>等符号时配合any all使用

                案列 : --查询同部门的其他员工 子查询 多行单列子查询 查询出多个值 要用in any all 这些代替掉

                SELECT ENAME,JOB,DEPTNO FROM EMP WHERE DEPTNO IN(SELECT DEPTNO FROM EMP WHERE JOB='SALESMAN') AND JOB<>'SALESMAN';

              C3.多行多列子查询:常常被当做一张表查询 C4.exists关键字后面跟一个关键字 当该子查询可以查询出至少一个记录 则 条件成立 返回适合条件的数据

                案例: --有员工的部门

                SELECT DISTINCT DEPTNO,DNAME FROM DEPT D WHERE EXISTS(SELECT * FROM EMP E WHERE E.DEPTNO=D.DEPTNO );

                ----没有员工的部门

                 SELECT DISTINCT DEPTNO,DNAME FROM DEPT D WHERE NOT EXISTS(SELECT * FROM EMP E WHERE E.DEPTNO=D.DEPTNO );

               C5.在select子句中使用子查询 (这个暂时搞不懂 )

    分页查询 (生活中的分页查询在购物时 查询后会出现多少个商品为一页的商品页面)

    为什么使用分页查询? 害怕查询数据量大,导致系统资源消耗大,数据冗余严重。

    分页查询在每个数据库中基本都有,但是每个数据库的语法不一样 oracle中使用 ROWNUM实现 ROWNUM不存在于任何一张表,但是所有表都可以查询该字段,只要查询出一条数据他就会记录该记录的行号,从1开始增1

    --分页查询 ROWNUM SELECT ROWNUM,ENAME,SAL,DEPTNO FROM EMP

  • 相关阅读:
    ubuntu安装php的 mongodb扩展
    ubuntu安装php的 redis扩展
    Ubuntu14.04下安装Composer
    编译安装php
    RabbitMQ PHP扩展安装
    编译安装opssl
    安装卸载nginx
    本地VM安装虚拟机,使用xshell连接
    下载并破解IntelliJ IDEA(2017)
    symfony框架中使用service
  • 原文地址:https://www.cnblogs.com/lchh/p/9325516.html
Copyright © 2020-2023  润新知