- 自联结
上例子:
找到Jim Jones所在公司工作的所有客户。
当然可以使用子查询,在这里就不把子查询的代码写出来了,使用自联结查询一下:
SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM Customers AS c1,Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
此查询中需要的两个表实际上是相同的表,为了解决冲突,使用了别名。
这个例子可以使用子查询也可以使用联结,但是由于许多DBMS处理联结远比处理子查询快的多,因此建议使用自联结。
- 自然联结(NATURAL JOIN)
自然连接自动判断相同名称的列,而后形成匹配。缺点是,虽然可以指定查询结果包括哪些列,但不能人为地指定哪些列被匹配。
事实上,使用基于WHERE子句的等值连接要比使用NATURAL JOIN运算符进行自然连接要灵活得多。
等值连接与自然连接的区别:
1. 等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。如R中的C列和S中的D列可进行等值连接,但因为属性名不同,不能进行自然连接。
2. 等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。如R中的B列和S中的B列进行等值连接时,结果有两个重复的属性列B,而进行自然连接时,结果只有一个属性列B。
- 外部联结(LEFT OUTER JOIN,RIGHT OUTER JOIN)
例:
SELECT Customers.cust_id,Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Custers.cust_id = Orders.cust_id;
与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。
在使用OUTER JOIN的语法时,必须使用LEFT OUTER JOIN或者RIGHT OUTER JOIN指定包括其所有行的表,RIGHT指出是OUTER JOIN右边的表,LEFT指出的是OUTER JOIN左边的表。