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) 

posted @ 2020-03-25 17:15  MrHH  阅读(204)  评论(0编辑  收藏  举报