avatar

目录
mysql高级联结

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

alt photo

自然联结:

select p.*,v.*
from productinfo as p natural join vendors as v

alt photo

两者的结果相同,但代码有所不同。

外部联结

许多联结将一个表中的行与另一个表中的行相关联。但有时又需要哪些没有关联行的行。例如:

  • 对每个客户下了多少订单进行技术,同时包括尚未下单的客户。
  • 列出所有产品以及订购数量,包括没有人订购的商品。
  • 计算平均销售规模,包括那些尚未下单的客户。

为了检索所有客户,包括未下单的客户:

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。

文章作者: Liang Shuo
文章链接: http://yoursite.com/2020/03/09/mysql%E9%AB%98%E7%BA%A7%E8%81%94%E7%BB%93/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 L·S
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论