zoukankan      html  css  js  c++  java
  • JOIN中的外连接(external join)

    外连接:

    ---外连接并不要求连接的两表的每一条记录在对方表中都有一条匹配记录.要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表成为保留表.外连接可以一句连接表保 留左表,右表和全部表的行二进一步分为左外连接、右外连接、全连接.

    (在这种情况下left<左>和right<右>表示Join关键字的两边.)

    在标准的SQL语言中,外连接没有隐式的连接符号.

    外部连接即包含ON子句又包含WHERE子句时,应当只把表之间的连接条件写在ON子句中,对表中数据的筛选必须写在WHERE子句中.

    而内部连接的各条件表达式既可以放在ON子句又可以放在WHERE子句中.

    这是因为对外部连接,保留表中被ON子句筛除掉的行要被添加回来,在此操作之后才会用WHERE子句取筛选连接结果中的各行.

    左外连接

    做外连接(left outer join),简称为左连接(left join) RRREWEQW QEQWQw QWe qWEqwEQWEQWEqweQ jjjkkk

    屏幕快照 2019-05-08 00.04.41

    1. 左外连接会返回左表的所有记录和右表中匹配记录的组合;
    2. 如果右表中无匹配记录,来自于右表的所有列的值设置NULL;
    3. 如果左表的一行在右表中存在多个匹配行,那么左表的行会复制和右表匹配行一样的数量,并进行组合生成连接结果.

    eg:

    SELECT *
    FROM    employee 
            LEFT OUTER JOIN department
      ON employee.DepartmentID = department.DepartmentID;
    

    右外连接

    屏幕快照 2019-05-08 00.12.58

    SELECT *
    FROM    employee 
            RIGHT OUTER JOIN department
      ON employee.DepartmentID = department.DepartmentID
    

    显示的右连接很少使用,一般替换成左连接(换换表的位置就可以了),功能相同

    SELECT * 
    FROM    department 
            LEFT OUTER JOIN employee
      ON employee.DepartmentID = department.DepartmentID
    

    全连接

    全连接是左右外连接的交集.连接表包含被连接的表的所有记录,如果缺少匹配的记录,即以NULL填充.

    屏幕快照 2019-05-08 00.28.04

    SELECT *
    FROM    employee
         FULL OUTER JOIN department
            ON employee.DepartmentID = department.DepartmentID
    

    Mysql数据库不支持全连接,但可以通过左右外连接的并集(union)来模拟实现.

    SELECT *
    FROM    employee
            LEFT JOIN department
                ON employee.DepartmentID = department.DepartmentID
    UNION
    SELECT *
    FROM    employee
            RIGHT JOIN department
                ON employee.DepartmentID = department.DepartmentID
    WHERE   employee.DepartmentID IS NULL
    

    自连接

    自连接就是和自身连接

    eg:构建一个查询,它试图找到这样的记录:每条记录包含两个雇员,他们来自同一个国家.如果你有两张雇员表(Employee),那么只要第一张表的雇员和第二张表的雇员在同样的国家就行了.你可以用一个铜像的连接(相等连接)操作去得到这个表.不过,这里所有雇员信息都在一张单独的达标例.

    employeeID LastName City DepartmentID
    111 小紫 上海 31
    222 小白 上海 33
    333 小蓝 上海 33
    444 小黑 广州 34
    555 小灰 北京 34
    666 小红 北京 NULL

    查询所用SQL:

    SELECT F.EmployeeID, F.LastName, S.EmployeeID,  S.LastName, F.Country
    FROM    Employee F, Employee S
    WHERE   F.City = S.City
    AND     F.EmployeeID < S.EmployeeID
    ORDER BY F.EmployeeID, S.EmployeeID;
    

    通过City自连接后的雇员表(Employee)

    EmployeeID LastName EmployeeID LastName City
    111 小紫 222 小白 上海
    111 小紫 333 小蓝 上海
    222 小白 333 小蓝 上海
    555 小灰 666 小红 北京

    Notes:

    • FS是雇员表的第一个和第二个拷贝的别名

    • 条件F.City = S.City排除了在不同城市的雇员的组合.本实例仅仅期望得到在相同国家的雇员的组合.

    • 条件F.EmployeeID < S.EmployeeID排除了雇员号(EmployeeID)相同的组合.

    • F.EmployeeID < S.EmployeeID排除了重复的组合.没有这个条件,会生成类似下表的无用数据(以北京为例)

      EmployeeID LastName EmployeeID LastName City
      555 小灰 555 小灰 北京
      555 小灰 666 小红 北京
      666 小红 555 小灰 北京
      666 小红 666 小红 北京

      只有中间两行满足初始问题的要求(重复的组合),第一行和最后一项对本例无用,但是在相同的组合的例子中有用

    替代方式

    外连接查询得到的结果也可以通过关联子查询得到.

    eg:

    SELECT employee.LastName, employee.DepartmentID,
    department.DepartmentName
    FROM    employee LEFT OUTER JOIN department
                ON employee.DepartmentID = department.DepartmentID
    

    or:

    SELECT employee.LastName, employee.DepartmentID,
        (SELECT department.DepartmentName
         FROM   department
         WHERE  employee.DepartmentID = department.DepartmentID )
    FROM employee
    
  • 相关阅读:
    监控页面所有checkbox改变状态的简单方法
    poorman’sgraphicalboot
    Linux 高精確的時序(sleep, usleep,nanosleep)
    【转】跟我一起写udev规则(译)
    什么情况下可以不创建QCoreApplication
    Linux双网卡bonding举例
    many former solutions has been "deleted"
    文件浏览器
    配置站点集的配额和锁
    HyperV的三种网卡
  • 原文地址:https://www.cnblogs.com/suixingc/p/join-zhong-de-wai-lian-jie-external-join.html
Copyright © 2011-2022 走看看