SQL server 使用 内联结(INNER JOIN) 联结多个表 (以及过滤条件 WHERE, AND使用区别)

Posted JessePeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL server 使用 内联结(INNER JOIN) 联结多个表 (以及过滤条件 WHERE, AND使用区别)相关的知识,希望对你有一定的参考价值。

INNER JOIN ……ON的语法格式:

FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) 
INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号;

 

连接两个数据表语法格式:

FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

连接三个数据表语法格式:

FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) 
INNER JOIN 表3 ON 表1.字段号=表3.字段号;

代码示例:

SELECT cust_name, cust_contact
FROM ((Customers INNER JOIN Orders ON Orders.cust_id =         
            Customers.cust_id) 
   INNER JOIN OrderItems ON OrderItems.order_num = 
            Orders.order_num)
   WHERE prod_id = RGAN01;

此处 WHERE 也可换成 AND

  • 对于inner join 两种写法在查询结果上没有区别。
  • 对于left join和right join 两种写法在查询结果上是不一致的。

 

join联结可以简单理解为以下过程:

  • 首先两个表做一个笛卡尔积。
  • 然后根据on后面的条件对这个笛卡尔积做一个过滤形成一张临时表。
  • 如果有where就对上一步的临时表再进行过滤,进而得到最终的结果集。
  • 也就是说如果inner join left join联查过滤条件放在on中就是在第二步进行的过滤;如果过滤条件放在where中就是在第三步进行的过滤。

 

对于left join和right join 两种写法在查询结果上是不一致的:

 

  • inner join内连接是没有左右某部分为null的情况的,而对于left join和right join左右连接而言存在左右某部分为null的情况。
  • 以left join左连接为例 A left join B,如果你把过滤条件写在on中,on后面的条件只对右表B有效,那最终结果集中这个限制对A是没有影响的,因为就算是B中的数据被过滤了,A中的数据仍旧可以匹配null来展示(左连接性质)。同理right join也是一样。
  • 如果你把过滤条件写在where中,因为where中的过滤是上面所说的过程中的第三步,是对第二步生成的临时表的过滤,所以会直接体现到对最后结果的限制,也就是等同于对AB左右两部分同时限制的目的。

 

以上是关于SQL server 使用 内联结(INNER JOIN) 联结多个表 (以及过滤条件 WHERE, AND使用区别)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:如何从只有 ID 的联结表中获取数据?

SQL Server进阶:Join联结查询

SQL Server统计信息偏差影响表联结方式案例浅析

MySql Join 语法 性能 优化

使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]

Sql Server 与 MySql 在使用 update inner join 时的区别