搞清楚内联结和外联结必须先知道应用内联结和外联结的现实需求是什么?
什么是内联结呢?内联结到底是怎么回事呢?
其实很简单,举两个例子就了然内联结的情况了:
假设两个表是这样:
首先是订单表Orders:
id order_num cust_id
--- ---------- -------
001 20001 100001
002 20002 100002
其次是顾客表Custumers
id name
----- --------
100001 jack
100002 tom
100003 betty
注意:
两个表中存在的关系是:左表的一条记录只对应右表中的一条记录!!
通常情况下,我们需要的整合出的表包含的信息仅仅是这样就够了,因为这样很符合实际:
因为,
通常情况下,
我们就想知道:订单表中,下单的那些顾客到底都是谁?
Orders表 Customers表
id order_num cust_id id name
--- ---------- ------- ---- -------
001 20001 100001 100001 jack
002 20002 100002 100002 tom
这种结果集很明显符合我们的需要的!!
观察一下:这种结果集的特点是什么?
左边的两条记录, 在Orders表中是有的
右边的作为连接的两条记录在Customers中也是有的
拥有这种特点联结的结果就叫内联结!!!!! 类似于集合中的交集;
英文名字叫INNER JOIN
为什么?
因为最终JOIN出的结果中的记录都是表中INNER的(包含的)
怎样才能得到这样的结果呢? 就是使用关键字 INNER JOIN 加 ON 就行了
就像下面这样:
来看一个内联结的代码:
SELECT Customers.cust_id,Order.order_num
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
除了使用这种方式之外还有别的方式么? 有啊
例如:
SELECT Customers.cust_id,Order.order_num
FROM Customers , Orders
WHERE Customers.cust_id = Orders.cust_id;
这种方式叫
自然联结!!!! 为啥叫自然联结呢? 这读起来,用起来多他妈自然啊,不仅自然还他妈清新呢!!
所以,自然联结就是内联结的另一种更自然的写法而已!!!!
什么是外联结呢?外联结又是什么意思呢?
外链接无非就是对内联结的进一步丰富和拓展!
同样以上两个表为例
内联结关心的问题是:Order表中下单的客户究竟都是谁?
外联结关心的问题除了这个问题之外,
还关心另外一个问题:顾客表中还有谁没有下过单?
也就是说:
与这个问题对应的答案是这样:
Orders表 Customers表
id order_num cust_id id name
--- ---------- ------- ---- -------
001 20001 100001 100001 jack
002 20002 100002 100002 tom
null null null 100003 betty
观察这个结果的特点是什么?
1.左表中的前两个记录在左表中都有,第三个记录没有,也就是说有一条记录在左表之外,不在左表之内
2.右表中的三个记录在右表中都有
这种特点的联结结果,就叫做外联结
英文名字叫OUTTER JOIN
意思就是联结的记录中并不在某个表之内,而在表之外:说白了就是表中没有该记录
外国人真他妈墨迹!!
怎样才能得到这样的结果呢? 使用关键词OUTTER JOIN 加 ON? 显然这样是不够的啊
因为,
这里明显存在的问题是,谁作为那个结果集中记录会超出范围的那个表呢?谁又做那个不超出范围全都包括的呢?
所以我们用RIGHT OUTER JOIN 或者 LEFT OUTER JOIN 来指定一下:
RIGHT OUTER JOIN :用右边的那个表做全包含的 用左边的那个表作为超出范围的(null记录)
LEFT OUTER JOIN :用左的那个表做全包含的 用右边的那个表作为超出范围的(null记录)
看下面这个例子:
SELECT Customers.cust_id,Orders.order_num
FROM Customers LEFT OURTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
这个sql的意思是:查询的结果中的那些联结的所有记录中是Customers表中的所有记录
而结果集中那些被联结的记录有的是超出Orders表之外的
再来看一个外联结:
SELECT Customers.cust_id,Orders.order_num
FROM Orders RIGHT OURTER JOIN Customers
ON Customers.cust_id = Orders.cust_id;
观察一下,和上面相比,无非是交换了位置,但结果是一回事
为什么? 因为左外联结和右外联结就是一回事而已!!! 用一个足以实现所有的外联结,只要调整好表的顺序就行:
再再来看一个外联结:
SELECT Customers.cust_id,Orders.order_num
FROM Customers FULL OURTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
请读者自己猜猜这个sql是什么意思啊?
总结:
外联结就是在内连接的结果基础上,把其中一张表的没有匹配其他记录追加上去!
这导致的结果肯定是另一张表只能用null记录与之联结
全联结就是把两张表没有匹配上的记录都追加上去了!
没有与之联结的记录就用null与之联结!!
最后补充一个自然联结的知识:
自然联结的代码:
SELECT C.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price
FROM Customers C,Orders O,OrderItems OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01'
阅读这条sql:
1.这条sql整合三张表,其中主表是Orders表,Customers表和OrderItems都是作为附表而存在;
2.明确了表之间关系之后,按照联系联结起来:Orders表,Customers表通过cust_id表联结;
Orders表OrderItems表通过order_num联结;
3.然后随便找个字段,查询该字段对应的你需要的信息;
这里注意的事情是:查询的字段的结果没有重复的列;
这就是自然联结的特点;
注意这里的一个特点:作为主表的字段还出现在了其他的表中