MySQL必知必会学习笔记(7)—— 高级联结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/89703629

1 使用表别名

  • 表别名可以用于 where子句,还可以用于 select 的列表、order by 子句以及语句的其他部分;
  • 表别名只在查询执行中使用,与列别名不一样,表别名不返回客户机;
SELECT cust_name,cust_contact
from customers as c, orders as o, orderitems as oi
where c.cust_id=o.cust_id 
AND oi.order_num=o.order_num
AND prod_id='TNT2';

在这里插入图片描述

2 其他联结类型

2.1 自联结

问题:某物品存在问题,想知道生产该物品的供应商生产的其他物品是否也存在这些问题。

  • 用自联结而不是子查询;
  • 自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句;

  • 使用子查询
SELECT prod_id,prod_name
from products
where vend_id=(
SELECT vend_id from products
WHERE prod_id='DTNTR');

在这里插入图片描述

  • 使用联结
SELECT p1.prod_id,p1.prod_name
from products as p1,products as p2
where p1.vend_id=p2.vend_id
and p2.prod_id='DTNTR';

在这里插入图片描述

2.2 自然联结

  • 无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列);
  • 标准的联结返回所有的数据,甚至相同的列多次出现;
  • 自然联结排除多次出现,使每个列只返回一次;
  • 只能选择那些唯一的列,一般通过对表使用通配符 select * ,对所有其他表的列使用明确的子集来完成;

SELECT c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price
from customers as c,orders as o,orderitems as oi
WHERE c.cust_id=o.cust_id AND
oi.order_num=o.order_num
AND prod_id='FB';

在这里插入图片描述

2.3 外部联结

许多联结将一个表中的行与另一个表中的行相关联,但是有时候会需要包含没有关联行的那些行。

背景

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

  • 联结包含了那些在相关表中没有关联的行,这种类型的联结称为外部联结;

  • 检索所有客户及其订单 (内部联结)
    在这里插入图片描述
    在这里插入图片描述
SELECT customers.cust_id,orders.order_num
from customers INNER JOIN orders
ON customers.cust_id=orders.cust_id;

在这里插入图片描述


  • 外部联结,为了检索所有客户,包括那些没有订单的客户
SELECT customers.cust_id,orders.order_num
from customers left OUTER JOIN orders
ON customers.cust_id=orders.cust_id;

在这里插入图片描述

3 使用带聚集函数的联结

SELECT customers.cust_name,customers.cust_id,
COUNT(orders.order_num) as num_ord
from customers INNER JOIN orders
on customers.cust_id=orders.cust_id
GROUP BY customers.cust_id;

在这里插入图片描述


SELECT customers.cust_name,customers.cust_id,
COUNT(orders.order_num) as num_ord
from customers left OUTER JOIN orders
ON customers.cust_id=orders.cust_id
GROUP BY customers.cust_id;

在这里插入图片描述

4 使用联结和联结条件

  • 注意所使用的联结类型,一般使用内部联结,但是使用外部联结也是有效的;
  • 保证使用正确的联结条件,否则将返回不正确的数据;
  • 应该总是提供联结条件,否则会出现笛卡尔积;

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/89703629