内连接和外连接的区别?
为了说明问题,定义如下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)