zoukankan      html  css  js  c++  java
  • MySQL涉及连接的问题

    内连接和外连接的区别?

    为了说明问题,定义如下2个表。

    t1 ID NAME      t2 ID  AGE

    - ---- ----------------    -------  --------------

      1 aaa          1  20

      2 bbb          3  30

    内连接(inner join):只显示符合连接条件的记录。

    SQL>select * from t1 inner join t2 on t1.id=t2.id;

      ID  NAME        ID  NAME

    --------   -----------------------------------   -----------

      1  aaa          1  20

    外连接分左外连接、右外连接、全外连接三种。

    1)左外连接(LEFT JOIN或LEFT OUTER JOIN):即以左表为基准,到右表找匹配的数据,找不到匹配的用NULL补齐。显示左表的全部记录及右表符合连接条件的记录。

    SQL>select * from t1 left join t2 on t1.id=t2.id;

      ID NAME    ID    AGE

    --------  -----------------------      -----------------

      1  aaa      1     20

      2  bbb      NULL   NULL

    2)右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN):即以右表为基准,到左表找匹配的数据,找不到匹配的用NULL补齐。显示右表的全部记录及左表符合连接条件的记录。

    SQL>select * from t1 right join t2 on t1.id=t2.id;

      ID    NAME    ID  AGE

    --------    ------------------------  --------------

      1   aaa     1   20

      NULL NULL    3   30

    3)全外连接(FULL JOIN 或 FULL OUTER JOIN):除了显示符合连接条件的记录外,在2个表中的其他记录也显示出来。

    inner join 和 left join的性能比较

      从理论上来分析,确实是inner join 的性能要好,因为是选出两个表都有的记录,而left join会出来左边表的所有记录,满足on条件的右边表的记录。

      1.在解析阶段,左连接是内连接的下一阶段,内连接结束后,把存在于左输入而未存在于右输入的集,加回总的结果集,因此如果少了这一步效率应该要高些。

      2.在编译的优化阶段,如果左连接的结果集和内连接一样时,左连接查询会转换成内连接查询,即编译优化器认为内连接要比左连接高效。

    联合查询的索引使用

      在where 子句中要加筛选条件,才可以都用上索引。

    数据库中两个表求交集、并集、差集

    mysql>select * from A;

    id  name  addr  age

    ----------------------------------------

    1  ken   wh   25

    2  jim    wh   26

    3  kenzh  sz    26

    4  jie     sh    24

    mysql>select * from B;

    id  name  addr  age

    1  ken   wh   25

    2  jim    wh   28

    3  kenzh  sz   26

    求交集(用 inner join)

    交集:

    mysql>select A.* from A inner join B using(name,addr,age);

      id  name  addr  age

      1  ken   wh   25

      3  kenzh  sz    26

    using(column_list):其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句代替,如下面例子:

      a LEGT JOIN b USING(c1,c2,c3) ,其作用相当于下面语句

      a LEFT JOIN b ON a.c1=b.c1 AND a.c2 = b.c2 AND a.c3=b.c3

      只是用ON来代替会书写比较麻烦而已。

    求差集(用left join 或 right join)

    差集:(在A中出现没有在B中出现的,这里的left join 你可以对应的换成 right join的)

    mysql>select A.* from A left join B using (name,addr,age) where B.name is NULL;

      id  name  addr  age

      2  jim    wh  26

      4  jie     sh   24

    差集:(在B中出现没有在A中出现)

    mysql>select B.* from B left join A using(name,addr,age) where A.id is NULL;

      id  name  addr  age

      2    jim   wh   28

    求并集(用 union) 

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/HuiH/p/12567424.html
Copyright © 2011-2022 走看看