zoukankan      html  css  js  c++  java
  • 19 连接查询

    19 连接查询
        
        什么是连接查询?
            在实际开发中,大部分的情况下都不是从但表中查询数据,一般都是多张表联合查询取出最终的结果。
            在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。
                stuno stuname classno calssname
                ------------------------------
                1            zs            1                哈哈哈哈
                2            ls            1                哈哈哈哈
                ...
                学生和班级信息存储到一张表中,结果就像上面一样,数据会存在大量重复,导致数据冗余。
                
        连接查询的分类?
            根据语法出现的年代来划分的话,包括
                SQL92(一些老的DBA可能还在使用这种语法。DBA:DataBase Administrator,数据库管理员)
                SQL99(比较新的语法)
                
            根据表的连接方式来划分,包括:
                
                内连接
                    等值连接
                    非等值连接 between...and
                    自连接
                    
                外连接
                    左外连接(左连接)
                    右外连接(右连接)
                    
                全连接(很少用)
                
        在表的连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)
        
        案例:找出每一个员工的部门名称,要求显示员工名和部门名。
            select ename,deptno from emp;
                +--------+--------+
                | ename  | deptno |
                +--------+--------+
                | SMITH  |     20 |
                | ALLEN  |     30 |
                | WARD   |     30 |
                | JONES  |     20 |
                | MARTIN |     30 |
                | BLAKE  |     30 |
                | CLARK  |     10 |
                | SCOTT  |     20 |
                | KING   |     10 |
                | TURNER |     30 |
                | ADAMS  |     20 |
                | JAMES  |     30 |
                | FORD   |     20 |
                | MILLER |     10 |
                +--------+--------+
                
            select * from dept;
                +--------+------------+----------+
                | DEPTNO | DNAME      | LOC      |
                +--------+------------+----------+
                |     10 | ACCOUNTING | NEW YORK |
                |     20 | RESEARCH   | DALLAS   |
                |     30 | SALES      | CHICAGO  |
                |     40 | OPERATIONS | BOSTON   |
                +--------+------------+----------+
            
            这个就是著名的笛卡尔积现象
            select ename,dname from emp,dept;
                +--------+------------+
                | ename  | dname      |
                +--------+------------+
                | SMITH  | ACCOUNTING |
                | SMITH  | RESEARCH   |
                | SMITH  | SALES      |
                | SMITH  | OPERATIONS |
                | ALLEN  | ACCOUNTING |
                | ALLEN  | RESEARCH   |
                | ALLEN  | SALES      |
                | ALLEN  | OPERATIONS |
                | WARD   | ACCOUNTING |
                | WARD   | RESEARCH   |
                | WARD   | SALES      |
                | WARD   | OPERATIONS |
                | JONES  | ACCOUNTING |
                | JONES  | RESEARCH   |
                | JONES  | SALES      |
                | JONES  | OPERATIONS |
                | MARTIN | ACCOUNTING |
                | MARTIN | RESEARCH   |
                | MARTIN | SALES      |
                | MARTIN | OPERATIONS |
                | BLAKE  | ACCOUNTING |
                | BLAKE  | RESEARCH   |
                | BLAKE  | SALES      |
                | BLAKE  | OPERATIONS |
                | CLARK  | ACCOUNTING |
                | CLARK  | RESEARCH   |
                | CLARK  | SALES      |
                | CLARK  | OPERATIONS |
                | SCOTT  | ACCOUNTING |
                | SCOTT  | RESEARCH   |
                | SCOTT  | SALES      |
                | SCOTT  | OPERATIONS |
                | KING   | ACCOUNTING |
                | KING   | RESEARCH   |
                | KING   | SALES      |
                | KING   | OPERATIONS |
                | TURNER | ACCOUNTING |
                | TURNER | RESEARCH   |
                | TURNER | SALES      |
                | TURNER | OPERATIONS |
                | ADAMS  | ACCOUNTING |
                | ADAMS  | RESEARCH   |
                | ADAMS  | SALES      |
                | ADAMS  | OPERATIONS |
                | JAMES  | ACCOUNTING |
                | JAMES  | RESEARCH   |
                | JAMES  | SALES      |
                | JAMES  | OPERATIONS |
                | FORD   | ACCOUNTING |
                | FORD   | RESEARCH   |
                | FORD   | SALES      |
                | FORD   | OPERATIONS |
                | MILLER | ACCOUNTING |
                | MILLER | RESEARCH   |
                | MILLER | SALES      |
                | MILLER | OPERATIONS |
                +--------+------------+
                56 rows in set (0.00 sec)
        
            笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
            
            关于表的别名
            select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno;
            表的别名有什么好处?
                第一:执行效率高。
                第二:可读性好。
     
        如何避免笛卡尔积现象?当然是加条件进行过滤。
        思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
            不会,次数还是56次,只不过显示的是有效记录。
            
        案例:找出每一个员工的部门名称,要求显示员工名和部门名。
            select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno; // SQL92,以后不用
                +--------+------------+
                | ename  | dname      |
                +--------+------------+
                | CLARK  | ACCOUNTING |
                | KING   | ACCOUNTING |
                | MILLER | ACCOUNTING |
                | SMITH  | RESEARCH   |
                | JONES  | RESEARCH   |
                | SCOTT  | RESEARCH   |
                | ADAMS  | RESEARCH   |
                | FORD   | RESEARCH   |
                | ALLEN  | SALES      |
                | WARD   | SALES      |
                | MARTIN | SALES      |
                | BLAKE  | SALES      |
                | TURNER | SALES      |
                | JAMES  | SALES      |
                +--------+------------+
                
        内连接中的等值连接:最大的特点是:条件是等量关系。
        
        案例:查询每个员工的部门名称,要求显示员工名和部门名?
            SQL92:(太老了,不用了)
                select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno;
            
            SQL99:(常用的)
                select a.ename,b.dname from emp a join dept b on a.deptno = b.deptno;
                语法:    
                    ...
                        A
                    join
                        B
                    on
                        连接条件
                    where
                        ...
                
                SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。
                select a.ename,b.dname from emp a join dept b on a.deptno = b.deptno;
                
                // inner可以省略的,带着inner目的是可读性好一些。
                select a.ename,b.dname from emp a inner join dept b on a.deptno = b.deptno; // 他和上面的sql语句一样,只不过没有inner
                    +--------+------------+
                    | ename  | dname      |
                    +--------+------------+
                    | CLARK  | ACCOUNTING |
                    | KING   | ACCOUNTING |
                    | MILLER | ACCOUNTING |
                    | SMITH  | RESEARCH   |
                    | JONES  | RESEARCH   |
                    | SCOTT  | RESEARCH   |
                    | ADAMS  | RESEARCH   |
                    | FORD   | RESEARCH   |
                    | ALLEN  | SALES      |
                    | WARD   | SALES      |
                    | MARTIN | SALES      |
                    | BLAKE  | SALES      |
                    | TURNER | SALES      |
                    | JAMES  | SALES      |
                    +--------+------------+
                    
        内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系。
        案例: 找出每个员工的工资等级,要求显示员工名、工资、工资等级。
        
            select ename,sal from emp;
                +--------+---------+
                | ename  | sal     |
                +--------+---------+
                | SMITH  |  800.00 |
                | ALLEN  | 1600.00 |
                | WARD   | 1250.00 |
                | JONES  | 2975.00 |
                | MARTIN | 1250.00 |
                | BLAKE  | 2850.00 |
                | CLARK  | 2450.00 |
                | SCOTT  | 3000.00 |
                | KING   | 5000.00 |
                | TURNER | 1500.00 |
                | ADAMS  | 1100.00 |
                | JAMES  |  950.00 |
                | FORD   | 3000.00 |
                | MILLER | 1300.00 |
                +--------+---------+
                
            select * from salgrade;
                +-------+-------+-------+
                | GRADE | LOSAL | HISAL |
                +-------+-------+-------+
                |     1 |   700 |  1200 |
                |     2 |  1201 |  1400 |
                |     3 |  1401 |  2000 |
                |     4 |  2001 |  3000 |
                |     5 |  3001 |  9999 |
                +-------+-------+-------+
            
            找出每个员工的工资等级,要求显示员工名、工资、工资等级。
            select a.ename,a.sal,b.grade from emp a inner join salgrade b on a.sal between b.losal and b.hisal;
                +--------+---------+-------+
                | ename  | sal     | grade |
                +--------+---------+-------+
                | SMITH  |  800.00 |     1 |
                | ALLEN  | 1600.00 |     3 |
                | WARD   | 1250.00 |     2 |
                | JONES  | 2975.00 |     4 |
                | MARTIN | 1250.00 |     2 |
                | BLAKE  | 2850.00 |     4 |
                | CLARK  | 2450.00 |     4 |
                | SCOTT  | 3000.00 |     4 |
                | KING   | 5000.00 |     5 |
                | TURNER | 1500.00 |     3 |
                | ADAMS  | 1100.00 |     1 |
                | JAMES  |  950.00 |     1 |
                | FORD   | 3000.00 |     4 |
                | MILLER | 1300.00 |     2 |
                +--------+---------+-------+
                
        自连接:最大的特点是:一张表看做两张表。自己连接自己。
        
        案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
            select empno,ename,mgr from emp;
                +-------+--------+------+
                | empno | ename  | mgr  |
                +-------+--------+------+
                |  7369 | SMITH  | 7902 |
                |  7499 | ALLEN  | 7698 |
                |  7521 | WARD   | 7698 |
                |  7566 | JONES  | 7839 |
                |  7654 | MARTIN | 7698 |
                |  7698 | BLAKE  | 7839 |
                |  7782 | CLARK  | 7839 |
                |  7788 | SCOTT  | 7566 |
                |  7839 | KING   | NULL |
                |  7844 | TURNER | 7698 |
                |  7876 | ADAMS  | 7788 |
                |  7900 | JAMES  | 7698 |
                |  7902 | FORD   | 7566 |
                |  7934 | MILLER | 7782 |
                +-------+--------+------+
            
            select a.empno,a.ename,b.ename from emp a inner join emp b where a.mgr = b.empno;
                +-------+--------+-------+
                | empno | ename  | ename |
                +-------+--------+-------+
                |  7369 | SMITH  | FORD  |
                |  7499 | ALLEN  | BLAKE |
                |  7521 | WARD   | BLAKE |
                |  7566 | JONES  | KING  |
                |  7654 | MARTIN | BLAKE |
                |  7698 | BLAKE  | KING  |
                |  7782 | CLARK  | KING  |
                |  7788 | SCOTT  | JONES |
                |  7844 | TURNER | BLAKE |
                |  7876 | ADAMS  | SCOTT |
                |  7900 | JAMES  | BLAKE |
                |  7902 | FORD   | JONES |
                |  7934 | MILLER | CLARK |
                +-------+--------+-------+
                
        外连接?
        什么是外连接,和内连接有什么区别?
            内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
            AB两张表没有主副之分,两张表是平等的。
            
        外连接:
            假设A表和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,
            当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。
            
        外连接的分类?
            左外连接(左连接):表示左边的这张表是主表。
            右外连接(右连接):表示右边的这张表是主表。
            
            左连接有右连接的写法,右连接也会有对应的左连接的写法。
            
        案例:找出每个员工的上级领导?
            select a.empno,a.ename,b.ename from emp a left join emp b on a.mgr = b.empno;(左外连接/左连接)
            
            // outer是可以省略的
            select a.empno,a.ename,b.ename from emp a left outer join emp b on a.mgr = b.empno;(左外连接/左连接)
                +-------+--------+-------+
                | empno | ename  | ename |
                +-------+--------+-------+
                |  7369 | SMITH  | FORD  |
                |  7499 | ALLEN  | BLAKE |
                |  7521 | WARD   | BLAKE |
                |  7566 | JONES  | KING  |
                |  7654 | MARTIN | BLAKE |
                |  7698 | BLAKE  | KING  |
                |  7782 | CLARK  | KING  |
                |  7788 | SCOTT  | JONES |
                |  7839 | KING   | NULL  |
                |  7844 | TURNER | BLAKE |
                |  7876 | ADAMS  | SCOTT |
                |  7900 | JAMES  | BLAKE |
                |  7902 | FORD   | JONES |
                |  7934 | MILLER | CLARK |
                +-------+--------+-------+
                
        select a.empno,a.ename,b.ename from emp b right join emp a on a.mgr = b.empno;(右外连接/右连接)
            +-------+--------+-------+
            | empno | ename  | ename |
            +-------+--------+-------+
            |  7369 | SMITH  | FORD  |
            |  7499 | ALLEN  | BLAKE |
            |  7521 | WARD   | BLAKE |
            |  7566 | JONES  | KING  |
            |  7654 | MARTIN | BLAKE |
            |  7698 | BLAKE  | KING  |
            |  7782 | CLARK  | KING  |
            |  7788 | SCOTT  | JONES |
            |  7839 | KING   | NULL  |
            |  7844 | TURNER | BLAKE |
            |  7876 | ADAMS  | SCOTT |
            |  7900 | JAMES  | BLAKE |
            |  7902 | FORD   | JONES |
            |  7934 | MILLER | CLARK |
            +-------+--------+-------+
            
        外连接最重要的特点是:主表的数据无条件的全部查询出来。
        
        案例:找出哪个部门没有员工?
            select a.deptno,b.deptno,a.ename from emp a right join dept b on a.deptno = b.deptno;
                +--------+--------+--------+
                | deptno | deptno | ename  |
                +--------+--------+--------+
                |     10 |     10 | CLARK  |
                |     10 |     10 | KING   |
                |     10 |     10 | MILLER |
                |     20 |     20 | SMITH  |
                |     20 |     20 | JONES  |
                |     20 |     20 | SCOTT  |
                |     20 |     20 | ADAMS  |
                |     20 |     20 | FORD   |
                |     30 |     30 | ALLEN  |
                |     30 |     30 | WARD   |
                |     30 |     30 | MARTIN |
                |     30 |     30 | BLAKE  |
                |     30 |     30 | TURNER |
                |     30 |     30 | JAMES  |
                |   NULL |     40 | NULL   |
                +--------+--------+--------+
                
        select b.* from emp a right join dept b on a.deptno = b.deptno where a.empno is null;
            +--------+------------+--------+
            | DEPTNO | DNAME      | LOC    |
            +--------+------------+--------+
            |     40 | OPERATIONS | BOSTON |
            +--------+------------+--------+
            
        三张表怎么连接查询?
        案例:找出每一个员工的部门名称以及工资等级。
            select a.ename as '员工名称',b.dname as '部门名称',a.sal as '工资',c.grade as '工资等级' from emp a
                join dept b on a.deptno = b.deptno
                join salgrade c on a.sal between c.losal and c.hisal;
                +----------+------------+---------+----------+
                | 员工名称 | 部门名称   | 工资    | 工资等级 |
                +----------+------------+---------+----------+
                | SMITH    | RESEARCH   |  800.00 |        1 |
                | ALLEN    | SALES      | 1600.00 |        3 |
                | WARD     | SALES      | 1250.00 |        2 |
                | JONES    | RESEARCH   | 2975.00 |        4 |
                | MARTIN   | SALES      | 1250.00 |        2 |
                | BLAKE    | SALES      | 2850.00 |        4 |
                | CLARK    | ACCOUNTING | 2450.00 |        4 |
                | SCOTT    | RESEARCH   | 3000.00 |        4 |
                | KING     | ACCOUNTING | 5000.00 |        5 |
                | TURNER   | SALES      | 1500.00 |        3 |
                | ADAMS    | RESEARCH   | 1100.00 |        1 |
                | JAMES    | SALES      |  950.00 |        1 |
                | FORD     | RESEARCH   | 3000.00 |        4 |
                | MILLER   | ACCOUNTING | 1300.00 |        2 |
                +----------+------------+---------+----------+
        
        案例:找出每一个员工的部门名称、工资等级、以及上级领导。
            select a.ename as '员工名称',b.dname as '部门名称',a.sal as '工资',c.grade as '工资等级',d.ename as '上级领导' from emp a
            join dept b on a.deptno = b.deptno
            join salgrade c on a.sal between c.losal and c.hisal
            left join emp d on a.mgr = d.empno;
                +----------+------------+---------+----------+----------+
                | 员工名称 | 部门名称   | 工资    | 工资等级 | 上级领导 |
                +----------+------------+---------+----------+----------+
                | SMITH    | RESEARCH   |  800.00 |        1 | FORD     |
                | ALLEN    | SALES      | 1600.00 |        3 | BLAKE    |
                | WARD     | SALES      | 1250.00 |        2 | BLAKE    |
                | JONES    | RESEARCH   | 2975.00 |        4 | KING     |
                | MARTIN   | SALES      | 1250.00 |        2 | BLAKE    |
                | BLAKE    | SALES      | 2850.00 |        4 | KING     |
                | CLARK    | ACCOUNTING | 2450.00 |        4 | KING     |
                | SCOTT    | RESEARCH   | 3000.00 |        4 | JONES    |
                | KING     | ACCOUNTING | 5000.00 |        5 | NULL     |
                | TURNER   | SALES      | 1500.00 |        3 | BLAKE    |
                | ADAMS    | RESEARCH   | 1100.00 |        1 | SCOTT    |
                | JAMES    | SALES      |  950.00 |        1 | BLAKE    |
                | FORD     | RESEARCH   | 3000.00 |        4 | JONES    |
                | MILLER   | ACCOUNTING | 1300.00 |        2 | CLARK    |
                +----------+------------+---------+----------+----------+
  • 相关阅读:
    2017.02.20 ,学习C#第三天,基础运算符的运用~
    Linux上如何安装Mysql数据库并使用?
    Linux(CentOS6)上安装python3.6 并创建虚拟环境 -----最牛逼的方法
    python ----Linux上安装scrapy
    Scrapy selenium 设置头部信息headers-------UA
    python 将Excel表格中的一列数据转化成多行数据
    python中的一些小技巧(个人觉得哈 )
    scrapy selenium 设置chromedriver不加载图片
    Scrapy中添加随机User-Agent
    linux centOs 6.4版本 安装python 2.7.3 中的pip
  • 原文地址:https://www.cnblogs.com/xlwu/p/13639597.html
Copyright © 2011-2022 走看看