zoukankan      html  css  js  c++  java
  • 面试常问的join

    少壮不努力,老大徒伤悲

    工作大半辈子了,来到个陌生的过度,从零开始,像个应届毕业生一样投入茫茫人才市场,碰的满头包。

    凡是涉及到sql server的都会问,join的问题,不烦记录下:

    SQL的join有五种方式:

    1.INNER JOIN or JOIN

    2.OUTER JOIN

       2.1 LEFT OUTER JOIN or LEFT JOIN

       2.2 RIGHT OUTER JOIN or RIGHT JOIN

       2.3 FULL OUTER JOIN or FULL JOIN

    3.NATURAL JOIN

    4.CROSS JOIN

    5.SELF JOIN

    两种连接条件:

    1.Equi JOIN    

        1.1  NATURAL    

        1.2 USING(a,b)    

        1.3=    ...

    2.Theta JOIN    

      2.1>=    

      2.2<=    

      2.3>    ...

    PS:USING(...)指定需要哪些列相等。ON则可以指定任意的连接条件(=,>=,<=,!=,>,<...)123456789101112

    3. JOIN or INNER JOIN

    返回两个表中同时满足条件的元组对,不满足的将被丢弃。

    4. OUTER JOIN

    4.1. LEFT OUTER JOIN

    返回左表所有行以及右表满足条件的行,左表有值右表无值填充为null

    4.2 RIGHT OUTER JOIN

    返回右表所有行以及左表满足条件的行,右表有值左表无值填充为null

    4.3 FULL OUTER JOIN

    返回所有表的所有行,在满足条件的行之外,左表满足右表不满足或者相反,均填充null

    5. NATURAL JOIN

    1、来自两个关系的元组对在共同属性上的值相同。(不限于一个共同属性,也可以是多个共同属性) 2、去掉重复的属性(列)。 3、列出属性的顺序:先是共同属性,然后是第一个关系的属性,最后是第二个关系的属性。

    为了防止两个表有多个共同属性时natural join 会忽略部分需要的元组对,应使用join…using(…),以指定需要哪些列相等 join…using(…)连接只能局限在指定的属性上

    6. CROSS JOIN

    返回笛卡儿积

    7. SELF JOIN

    相当于A JOIN A

    最后放一张图:

    附录:

    SQL中的连接可以分为内连接,外连接,以及交叉连接 。

    1. 交叉连接CROSS JOIN

    如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

    举例,下列A、B、C 执行结果相同,但是效率不一样:

    A:SELECT * FROM table1 CROSS JOIN table2

    B:SELECT * FROM table1,table2

    C:select * from table1 a inner join table2 b

    A:select a.*,b.* from table1 a,table2 b where a.id=b.id

    B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)

    C:select * from table1 a inner join table2 b on a.id=b.id

    一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。 

    因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

    2. 内连接INNER JOIN

    两边表同时符合条件的组合

    如果仅仅使用

    SELECT * FROM table1 INNER JOIN table2

    内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

    但是通常情况下,使用INNER JOIN需要指定连接条件。

     

    ***************关于等值连接和自然连接

    等值连接(=号应用于连接条件, 不会去除重复的列)

    自然连接(会去除重复的列)

    数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。

    例如:

    SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

    3. 外连接OUTER JOIN

    指定条件的内连接,仅仅返回符合连接条件的条目。

    外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。

    1)左外连接LEFT [OUTER] JOIN

    显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL

    例如

    SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column

    2)右外连接RIGHT [OUTER] JOIN

    显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL

    例如

    SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column

    3)全外连接full [outer] join

    显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

  • 相关阅读:
    nginx+php-fpm 配置和错误总结
    C#——Winform 无边框随意拖动【转载】
    C#——Socket
    asp.net——Base64加密解密
    asp.net——上传图片生成缩略图
    C#——获取远程xml文件
    SQL Server—— 如何创建定时作业
    asp.net——正则表达式
    asp.net——Josn转DataTable(转)
    JS——EasyuiCombobox三级联动
  • 原文地址:https://www.cnblogs.com/dusf/p/10999509.html
Copyright © 2011-2022 走看看