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) 

  • 相关阅读:
    异步加载JS
    解决Vue刷新一瞬间出现样式未加载完或者出现Vue代码问题
    什么是NaN?它的类型是什么?如何可靠的测试一个值是否等于NaN?
    JS快速获取图片宽高的方法
    为什么操作dom会消耗性能
    localstorage的浏览器支持情况
    mongodb Windows系统下安装卡死问题
    正则表达式
    CSS Hack
    css中cursor(光标类型)
  • 原文地址:https://www.cnblogs.com/HuiH/p/12567424.html
Copyright © 2011-2022 走看看