数据库查询中的左连接及注意事项
 上班闲来⽆事,上⽹灌⽔累了,于是决定self study⼀会,了⼀份公司的数据库培训资料,翻翻看看
 翻到join查询⼀块,突然想起以前开发时,碰到的⼀个左连接的问题,于是,在CSDN查旧贴,整理了⼀下.
 我们在查询的时候,有三种join类型:内连接、外连接和交叉连接。
 内连接(INNER JOIN)使⽤⽐较运算符进⾏表间某(些)列数据的⽐较操作,并列出这些表中与连接条件相匹配的数据⾏。根据所使⽤的⽐较⽅式不同,内连接⼜分为等值连接、⾃然连接和不等连接三种。
 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹
配的⾏,⽽是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的
数据⾏。
交叉连接(CROSS JOIN)没有WHERE ⼦句,它返回连接表中所有数据⾏的笛卡尔积,其结果集合中的
数据⾏数等于第⼀个表中符合查询条件的数据⾏数乘以第⼆个表中符合查询条件的数据⾏数。
连接操作中的ON (join_condition) ⼦句指出连接条件,它由被连接表中的列和⽐较运算符、逻辑
运算符等构成。
⽆论哪种连接都不能对text、ntext和image数据类型列进⾏直接连接,但可以对这三种列进⾏间接
连接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
好像扯远了,我们要讲的是左外连接(LEFT OUTER JOIN或LEFT JOIN)
采⽤外连接时,它返回到查询结果集合中的不仅包含符合连接条件的⾏,⽽且还包括左表(左外
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据⾏。
 可以简单的理解为,左表中的记录,只要满⾜where 条件,就⼀定要被抓出来,不管是否join 成功
 ⽐如现在的表情况是这样的:
 表A
A    AA
1    22
2    33
3    44
表B
A    B
B  CC
1    23  33
 左连接的写法⼀般有两种,(A做左表)
 1) select  A.A  B.BB  FROM  A,B  WHERE  A.A  *=  B.A
2)  select  A.A  B.BB  FROM  A  Left  Join  b  ON  A.A  =  B.A
这是OK的,返回的结果是 3条记录
 1,23
2,
3,
 后⾯两条的BB 字段为NULL
但是如果我们后⾯加⼀个where 条件,这两个查询的结果就不⼀样了
 select  A.A  B.BB  FROM  A,B  WHERE  A.A  *= B.A AND B.CC  =  33
那么这样,还是返回三条记录
1,23
2,
3,
 但是
select  A.A  B.BB  FROM  A  Left  Join  b  ON  A.A = B.A where  B.CC  =  33
但是这样,就只有
1,23
⼀条记录了,
 彻底晕了,
 于是上⽹问,上⽹查
 终于到原因了
 select  A.A,B.BB  FROM  A,B  WHERE  A.A  *=  B.A  AND  B.CC  =  33
等价于
select  A.A,B.BB  FROM  A  Left  Join  B  ON  A.A  =  B.A  AND  B.CC  =  33
等价于
select  A.A,C.BB  FROM  A  Left  Join  (select  *  from  B  WHERE  CC  =  33)  C  ON  A.A  =  C.A
 ⽽第⼆种:
 select  A.A  B.BB  FROM  A  Left  Join  b  ON  A.A  =  B.A where  B.CC  =  33
等价于
select  C.AA,C.BB  from  (select  A.A,B.BB,B.CC  FROM  A  Left  Join  b  ON  A.A  =  B.A)  C  where     
C.CC=33
 终于明⽩了
 如果没有别的条件(⽐如没有这⾥的B.CC  =  33),两种查询的结果是⼀样的了,
 但是如果有别的条件,如B.CC  =  33,那么如果⽤*=的写法,那么这个条件其实相当于⼀个join的条件⽽已,
sql left join 多表连接 ⽽如果⽤Left  Join的写法,那么这个B.CC  =  33的条件,就相当于⼀个查询的条件,就是说先做join,然后根据这个join以后的结果
,再根据这个B.CC  =  33 再进⾏筛选。
 注:以上查询在Sybase 和SQL  2000中验证通过

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。