mysql高级联结
SQL最强大的功能就是能在数据查询的时候执行联结表,联结可以让多个相关的表联结成一个整体进行运算查询,因而掌握它十分重要。
自联结
顾名思义自联结的意思就是一个表与自己相联结。例如想发送一封信给Jim所在公司的所有客户。因此我们先要查询Jim所在的公司,然后找出为此公司工作的客户。
此题有两种解法:子查询以及自联结
1
select cust_id,cust_name,cust_address from customers where cust_name =(select cust_name from customers where cust_contact =’Jim Jones’);
2
select c1.cust_id,c1.cust_name,c1.cust_address from customers as c1,customers as c2 where c1.cust_name =c2.cust_name and c2.cust_contact=’Jim Jones’
内联结(等值联结)
内联结是基于两个表之间的相等测试,这种联结也称为内部联结。它适用于多个表之间存在一定的联系的情况。例如购物者购买了编号为1的商品,购物者位于购物表中,而
商品表中恰好也有商品编号,那么就可以将多个表进行联结以便查询。
查找订购产品RGAN01的顾客信息:
select cust_id,cust_name,cust_address from customers where cust_id in (select cust_id from orders where order_num in(select order_num from orderitems where prod_id=’RGAN01’));
将相关项紧密联结依次查询。
自然联结
无论何时对表进行联结,应该至少有一个列出现在不止一个表中。内联结是联结运算符为“=”时的特例。
它是从关系R与S的广义笛卡尔积中选取A,B属性值相等的那些元组,而自然联结又是一种特殊的内联结,它能够自动清除掉在两个表中不同属性的元组。因而自然联结不需要加上最后的on和等于判断。
内联结:
select p.*,v.*
from productinfo as p inner join vendors as v
on p.vendname=v.vendname
自然联结:
select p.*,v.*
from productinfo as p natural join vendors as v
两者的结果相同,但代码有所不同。
外部联结
许多联结将一个表中的行与另一个表中的行相关联。但有时又需要哪些没有关联行的行。例如:
- 对每个客户下了多少订单进行技术,同时包括尚未下单的客户。
- 列出所有产品以及订购数量,包括没有人订购的商品。
- 计算平均销售规模,包括那些尚未下单的客户。
为了检索所有客户,包括未下单的客户:
select customers.cust_id,orders.order_num from customers left outer join orders on customers.cust_id=orders.cust_id;
结果比正常的内联结多了一项存在于左表却不存在于右表的元组。
以次类推有: right outer join … on … full outer join … on …;
其中mysql、SQL SERVER 等不支持full outer join。