首页 > 代码库 > SQL 中的连接查询

SQL 中的连接查询

      关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2、3个表甚至更多的表7,至于连接,有内连接、外链接、交叉连接之分,每种连接方式都有各自的查询关键字去执行。此时犹记学时对这些概念含糊不分,不知所谓,总是认为课本的知识玄幻深奥,概念晦涩难懂,当然我也时常归咎于是本校师生随手“复印”的教材。

  一、 内连接(通过关联信息匹配数据)

     1.等值连接(=,有重复)  2.不等值连接(不等式、大小于)   3.自然连接(=,无重复,通过过滤条件)

SELECT * FROM a,b  WHERE a.id = b.id  --(ANSI连接语法,SQL92标准以前的写法)SELECT * FROM a INNER JOIN b ON a.id = b.id   --( SQL92标准写法)

  二、 外连接

      1. 左连接(Left Join) 不管能否匹配到on的条件,左表数据均会完整显示

      2. 右连接(Right Join) 不管能否匹配到on的条件,右表数据均会完整显示

      3. 全连接(Full Join)  一定条件下(列名、列数一致),可用Union all 代替

 当出现多个外链接(三路外连接)时,比如,需要连接两个Left Join

 则,A表由5条数据,第一次Left 结束结果是5条,第二次 Left 结束之后结果仍然还是为5条

三、交叉连接(笛卡尔积)

    实际应用中很少接触,查询结果初看乱七八糟,互相匹配,造成的重复值较多

SELECT * FROM a CROSS JOIN b 

 

以上只是些许概念,课本上网上都能查到,实际上在做这些查询的时候,往往伴随着条件的过滤,想要写好SQL,第一步是要明白这些条件的执行顺序

SQl顺序 from -> Join on -> where -> group by -> having -> select -> distinct -> order by -> top

至于比较混淆的几点:

① Where 和 On 的区别 (Inner中无差别) 

  由于Left、right (数据完整)的特殊性,使Where 和 on 对查询过滤产生了不同结果,因为On的查询优先于Where,如在 left 查询中,where 是对 查询后左表数据进行过滤,可使左表最后数据不完整,而使用on ,对最终 左表数据的完整性无影响

②  Where  和 Having 的区别

  这一点其实是很好区分的,Having的使用 一定伴随着 聚合函数 Group by 的出现,Where 是对分组之前进行过滤,having 是对分组之后进行过滤

 

SQL 中的连接查询