最近学习了一下Oracle的多表连接,包括内连接、外连接、交叉连接和自然连接,个人用到比较多的是内连接和外连接
1.内连接
场景:某班两门课出了成绩,想要把两份成绩表合一起。table1为语文课成绩,table2为数学课成绩
select a.name, a.course, a.grade, b.course, b.grade
from table1 a
inner join table2 b
on a.name = b.name;
如上图为内连接结果,内连接要求坐标和右表要连接的条数相等,因此内连接也叫做等值连接。
2.外连接
外连接可分为左外连接(左边保持不变)和右外连接(右边保持不变)
场景:我有一个表里面统计了手机号信息,还有一个表统计了不同号段对应的手机号归属地,我想知道这些手机号的归属地,那么就可以使用外连接(两个表要连接的列数不同)
--左连接
SELECT a.*, b.position
FROM TABLE1 a
LEFT OUTER JOIN TABLE2 b
ON SUBSTR(a.phonenum, 1, 7) = b.num;
如上图为左外连接的结果,可以发现右边表TABLE2的数据有重复而左边表TABLE1的数据与原来相同
也可以将上述代码简写为
--左连接简化写法
SELECT a.*, b.position
FROM TABLE1 a, TABLE2 b
WHERE SUBSTR(a.phonenum, 1, 7) = b.num(+);
结果与原来相同,加号出现在右边,可以理解为右边不够需要补充(http://blog.chinaunix.net/uid-21187846-id-3288525.html)
右连接类似
3.交叉连接
用于求两个表两个字段的笛卡尔积,比如说第一个表有10行,第二表有3行,则交叉连接后的行数为10x3=30行
4.自然连接
两个表中存在同名且同类型的列时使用自然连接,我还没有想到需要用到自然连接的场景
还是个新手,也许会有不对的地方,请不吝赐教