zoukankan      html  css  js  c++  java
  • SQL的表连接

    每天给自己扫盲,让自己变得越博学。

    继续学习《程序员的SQL金典》,这回我们来看看表连接相关的内容。表连接的相关知识在实际的项目开发当中,使用非常广。

    所谓表连接,就是通过关联多张表,从而检索出需要的数据。实际的项目,存在多张表的关联关系。不可能在一张表里面就能检索出所有数据。如果没有表连接的话,那么我们就需要非常多的操作。比如需要从A表找出限制性的条件来从B表中检索数据。不但需要分多表来操作,而且效率也不高。比如书中的例子:

    SELECT FId
    FROM T_Customer
    WHERE FName='MIKE'

    这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录:

    SELECT FNumber,FPrice
    FROM T_Order
    WHERE FCustomerId=2

    下面我们详细来看看表连接。表连接有多种不同的类型,有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN)。

    内连接(INNER JOIN)

    内连接组合两张表,并且只获取满足两表连接条件的数据。

    SELECT o.FId,o.FNumber,o.FPrice,
    c.FId,c.FName,c .FAge
    FROM T_Order o JOIN T_Customer c
    ON o.FCustomerId= c.FId

    注:在大多数数据库系统中,INNER JOIN中的INNER是可选的,INNER JOIN 是默认的连接方式。

    在使用表连接的时候可以不局限于只连接两张表,因为有很多情况下需要联系许多表。例如,T_Order表同时还需要连接T_Customer和T_OrderType两张表才能检索到所需要的信息,编写如下SQL语句即可:

    SELECT o.FId,o.FNumber,o.FPrice,
    c.FId,c.FName,c .FAge
    FROM T_Order o JOIN T_Customer c
    ON o.FCustomerId= c.FId
    INNER JOIN T_OrderType
    ON T_Order.FTypeId= T_OrderType.FId

     

    交叉连接(CROSS JOIN)

    交叉连接所有涉及的表中的所有记录都包含在结果集中。可以采用两种方式来定义交叉连接,分别是隐式和显式的连接。

    下面看看隐式的例子:

    SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,
    T_Order.FId, T_Order.FNumber, T_Order.FPrice
    FROM T_Customer, T_Order

    使用显式的连接则需要使用CROSS JOIN,例子如下:

    SELECT T_Customer.FId, T_Customer.FName, T_Customer.FAge,
    T_Order.FId, T_Order.FNumber, T_Order.FPrice
    FROM T_Customer
    CROSS JOIN T_Order
    外连接(OUTTER JOIN)

    内部连接只获取满足连接条件的数据,而对于外部连接来说,主要是解决这样的一种场景。满足条件的数据检索出来,这个没有疑问,外部连接还会检索另一部分数据,那就是将不满足条件的数据以NULL来填充。先来看一下外连接的分类:左外部连接(LEFT OUTER JOIN)、右外部连接(RIGHT OUTER JOIN)和全外部连接(FULLOUTER JOIN)。

    左外部连接(LEFT OUTER JOIN)

    前头也说了,将不满足条件的数据以NULL来填充。那么具体是哪些需要以NULL来填充呢,对于左外连接来说的话,连接条件当中,如果出现满足条件的左表的数据在右表中没有相应匹配时,需要把相应的右表字段填充NULL值。也就是说左外部连接的主体是左表,右表来配合。

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    注:如果使用左外部连接的话,通过where语句能过滤其中不符合的数据

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId
    WHERE o.FPrice>=150
    右外部连接(RIGHT OUTER JOIN)

    右外部连接与左外连部接相反,将会被填充NULL值的是左表的字段。也就是说右外部连接的主体是右表,左表来配合。

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    RIGHT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    注:同左外连接一样,可以使用where语句进行过滤

    全外部连接(FULLOUTER JOIN)

    全外部连接是左外部连接和右外部连接的合集。也就是既包括左外部连接的结果集,也包括右外部连接的结果集。

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    FULL OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    其结果相当于:

    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    LEFT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId
    UNION
    SELECT o.FNumber,o.FPrice,o.FCustomerId,
    c.FName,c.FAge
    FROM T_Order o
    RIGHT OUTER JOIN T_Customer c
    ON o.FCustomerId=c.FId

    以上的SQL代码都为《程序员的SQL金典》(作者:杨中科)例子,书中的例子更详细,又有相应的步骤查看结果。大家有兴趣的话,可以网上下载PDF文档看,当然购买正版书也是不错的选择。至此本文完。

  • 相关阅读:
    案例分析
    202103226-1 编程作业
    阅读任务
    准备工作
    结对作业
    案列分析
    202103226-1 编程作业
    《构建之法》有感
    准备工作
    案例分析作业
  • 原文地址:https://www.cnblogs.com/csdbfans/p/3444027.html
Copyright © 2011-2022 走看看