目标:
1、学会在多张表中使用SELECT查询,可以包含equijoins(相等操作符)和nonequijoins(不等操作符)
2、学会使用self-join
3、内部连接和外部连接(outer joins)
4、在两个或更多的表中形成笛卡尔积
Agenda
一、JOINS的类型和语法
二、自然连接
---USING 子句
---ON 子句
三、Self-join
四、Nonequijoins
五、OUTER join
---LEFT OUTER join
---RIGHT OUTER join
---FULL OUTER join
六、笛卡尔积
---Cross join
一、JOINS的类型和语法
JOINS基本类型
自然连接
---NATURAL JOIN子句
---USING 子句
---ON 子句
OUTER join
---LEFT OUTER join
---RIGHT OUTER join
---FULL OUTER join
Cross join
SQL国际标准
Oracle的join语法
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435505T9T9.jpg?x-oss-process=style/bb)
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355056I63.jpg?x-oss-process=style/bb)
澄清有歧义的列名
1、添加表前缀
2、给每一个列都加表前缀可以提高效率
3、使用表全名比较长,可以使用表别名
4、表别名可以设计的比较短,通常用一个字母来表示(因为使用的字符小,所有所需要的内存更少)
5、使用表别名区分不同表有同样列名的列
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355051L9i.jpg?x-oss-process=style/bb)
一旦使用了表别名,则不能再使用表原来的名字
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355061CRR.jpg?x-oss-process=style/bb)
二、自然连接
1、使用自然连接的时候,数据库会自动在两张表中查询相同列名和类型的所有的列,以这些列进行匹配
2、找到有相同值的列进行连接
3、如果列名相同,类型不同,则不能进行连接
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355060M55.jpg?x-oss-process=style/bb)
两张表中相同的是“location_id”
即:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_145243550619VR.jpg?x-oss-process=style/bb)
Oracle语法示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355072l7O.jpg?x-oss-process=style/bb)
USING子句
1、如果两张表中有相同的列名,却类型不同,使用USING子句明确指明使用哪一列进行连接
2、USING子句只用一列匹配
3、NATURAL JOIN 和USING 不能同时使用
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355073P5w.jpg?x-oss-process=style/bb)
Oracle语法示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435507UaS9.jpg?x-oss-process=style/bb)
USING子句中不用表别名而且使用了USING子句的话,WHERE也不能使用表别名
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435507dcc3.jpg?x-oss-process=style/bb)
ON 子句
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435508Y5XX.jpg?x-oss-process=style/bb)
(比较纳闷既然有了ON子句,那些NATURAL JOIN和USING子句有什么意义)
多张表查询:
示例:(三张表)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435508rrL5.jpg?x-oss-process=style/bb)
Oracle语法示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435508CPzL.jpg?x-oss-process=style/bb)
在JOIN里面附加其他条件
示例1:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435508lddO.jpg?x-oss-process=style/bb)
示例2:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435509aCXc.jpg?x-oss-process=style/bb)
三、Self-join
示例:列出员工及员工的经理
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435554a49L.jpg?x-oss-process=style/bb)
Oracle语法示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435554w459.jpg?x-oss-process=style/bb)
四、Nonequijoins
不用“相等”条件进行查询
首先创建一个工作等级表(JOB_GRADES):
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355546QS9.jpg?x-oss-process=style/bb)
向工作等级表(JOB_GRADES)中添加几个数据:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435554IW22.jpg?x-oss-process=style/bb)
可以查询一下:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435555q6Zf.jpg?x-oss-process=style/bb)
示例:列出员工薪资及其薪资等级
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435555r9m2.jpg?x-oss-process=style/bb)
五、OUTER join
INNER 和 OUTER join的区别
1、只把匹配上的结果返回回来称做INNER join
2、除INNER join以外,从左边(或右边)没有匹配上的行也显示出来,称做LEFT(or RIGHT) OUTER join
3、除INNER join以外,把左边和右边没有匹配上的行都显示出来,称做FULL OUTER join
示例:LEFT OUTER JOIN
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435555NFI9.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355562HNt.jpg?x-oss-process=style/bb)
示例:RIGHT OUTER JOIN
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435556B2Mt.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435556oLhC.jpg?x-oss-process=style/bb)
示例:FULL OUTER JOIN
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435557ionL.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435557JyXY.jpg?x-oss-process=style/bb)
Oracle语法:OUTER JOIN
LEFT OUTER JOIN
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355578dR5.jpg?x-oss-process=style/bb)
RIGHT OUTER JOIN
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355577tS7.jpg?x-oss-process=style/bb)
六、笛卡尔积
把两张表中的记录进行两两组合,比如第一张表有m条记录,第二张表有n条记录,最终就是(m*n)条记录
产生笛卡尔积
1、JOIN条件被忽略了
2、JOIN条件无效
3、做测试的时候或许需要爆炸性数据的时候
CROSS JOIN
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435558eZHD.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_14524355854uRg.jpg?x-oss-process=style/bb)
Oracle语法:笛卡尔积
示例:
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435585SFsL.jpg?x-oss-process=style/bb)
![](http://img.blog.itpub.net/blog/attachment/201601/10/30197839_1452435585v50s.jpg?x-oss-process=style/bb)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30197839/viewspace-1974661/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30197839/viewspace-1974661/