• SQL 连接语句


    SQL code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    create table Customers (Cust_Id int, Cust_Name varchar(10))
       
    insert Customers values (1, 'Craig')
       
    insert Customers values (2, 'John Doe')
       
    insert Customers values (3, 'Jane Doe')
       
    create table Sales (Cust_Id int, Item varchar(10))
       
    insert Sales values (2, 'Camera')
       
    insert Sales values (3, 'Computer')
       
    insert Sales values (3, 'Monitor')
       
    insert Sales values (4, 'Printer')

     

    Inner joins(内连接)

    Inner join是最常见的连接类型。一个inner join只是简单的找到两行,然后根据连接的谓词放在一起。例如,下面的查询使用这样的连接谓词“S.Cust_Id = C.Cust_Id”来找在Sales和Customer表中具有相同Cust_Id的行。


    SQL code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    select *
       
    from Sales S inner join Customers C
       
    on S.Cust_Id = C.Cust_Id
       
    Cust_Id     Item       Cust_Id     Cust_Name
       
    ----------- ---------- ----------- ----------
       
    2           Camera     2           John Doe
       
    3           Computer   3           Jane Doe
       
    3           Monitor    3           Jane Doe

     

    注意:

    Cust_Id 3 买了两件item,所以该Customer会在结果中出现两次.
    Cust_Id 1 没有购买任何东西,所以没在结果中出现。
    我们卖了一个‘Printer’ 给 Cust_Id 4。但这边没有这个客户,所以在结果里面也看不到该客户。
    Inner Join是中表的位置是可以交换的。也就是说‘A inner join B ‘ 等价于’B inner join A’。

    Outer joins(外连接)

    假设我们想要看到所有的sales的列表,即使是那些没有匹配的客户。我们可以通过外连接来实现。外连接会保留其中一个或者两个输入表里的所有行,即使我们通过join谓词找不到匹配的行。例如:

    SQL code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    select *
       
    from Sales S left outer join Customers C
       
    on S.Cust_Id = C.Cust_Id
       
    Cust_Id     Item       Cust_Id     Cust_Name
       
    ----------- ---------- ----------- ----------
       
    2           Camera     2           John Doe
       
    3           Computer   3           Jane Doe
       
    3           Monitor    3           Jane Doe
       
    4           Printer    NULL        NULL


     

    注意到,SQL Server为对应的“Printer”的销售返回了为NULL的customer数据,因为该sale没有匹配的customer。我们又称这种行为NULL扩展。

    使用一个完全外连接,我们可以得到所有的customer,不管他们是否曾经买过东西。以及得到所有的sale,不管他们是否有个合法的customer。

    SQL code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    select *
       
    from Sales S full outer join Customers C
       
    on S.Cust_Id = C.Cust_Id
       
    Cust_Id     Item       Cust_Id     Cust_Name
       
    ----------- ---------- ----------- ----------
       
    2           Camera     2           John Doe
       
    3           Computer   3           Jane Doe
       
    3           Monitor    3           Jane Doe
       
    4           Printer    NULL        NULL
       
    NULL        NULL       1           Craig


     

    下表显示了不同的外连接里哪些行会被保留,哪些行会进行NULL扩展

    SQL code?
    1
    2
    3
    4
    5
    6
    Join                    保留…
    -------------------------------------------
    left outer join B    all rows
    right outer join B    all rows
    full outer join B    all and rows
  • 相关阅读:
    gitlab使用
    小程序顶部导航栏标题不居中
    mpvue中使用vant-weapp
    原生js实现轮播图
    vue无法检测数组的变动
    vue报错TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function
    vue绑定style使用需要添加浏览器引擎前缀的 CSS 属性
    《孙子算经》之"物不知数"题:中国剩余定理
    Java大数处理类:BigInteger类和BigDecimal类
    【转】操作系统典型调度算法
  • 原文地址:https://www.cnblogs.com/wujy/p/2855565.html
Copyright © 2020-2023  润新知