MySQL必知必会——第16章 创建高级联结 读书笔记

如何对被联结的表使用表别名?
如何对被联结的表使用聚集函数?
1 使用表别名
回顾:如何使用别名引用被检索的表列?

select Concat(vend_name,'(',vend_country) as vend_title
from vendors
order by vend_name;

别名除了用于列名和计算字段外,SQL还允许给表名起别名。
为什么要表别名?
①缩短SQL语句
②允许在单条select语句中多次使用相同的表
使用表别名改写上一章例子中的语句
未改写前:

select cust_name,cust_contact
from customers,orders,orderitems
where customers.cust_id=orders.cust_id
AND orderitems.order_num=orders.order_num
AND prod_id='TNT2';

改写后:

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 自联结
使用表别名的主要原因之一是能在单条select语句中不止一次引用相同的表。
举例:目的:找出某物品的供应商生产的所有物品

方法一:

select prod_name
from products
where vend_id=(select vend_id 
                          from products
                          where prod_id='3' );

方法二:

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 ='3';

如上语句首先联结两个表,然后按照第二个表中的prod_id过滤数据,返回所需的数据。
自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的, 但有时候处理联结远比处理子查询快的多。
3 自然联结
无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。
标准的联结(上一章中介绍的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。系统不完成这项工作,由你自己完成它。通常是通过对表使用通配符(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';

迄今为止,我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结。
4 外部联结
许多联结将一个表中的行与另一个表中行相关联,但有时候会需要包含没有关联行的那些行。可能需要使用联结来完成以下工作:
①对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
②列出所有产品以及订购数量,包括没有人订购的产品;
③计算平均销售规模,包括那些至今尚未下订单的客户。
联结包含了那些在相关表中没有关联行的行,这种类型的联结成为外部联结。
内部联结语句:

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;

在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指的是OUTER JOIN右边的表,LEFT指的是左边的)
左外部联结可以通过颠倒表的顺序来实现
5 使用带聚集函数的联结
例子:目的:检索所有客户及每个客户所下的订单数

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;

6 使用联结和联结条件
①注意使用联结类型。一般使用内部联结,但使用外部联结也是有效的。
②应该总是提供联结条件,否则会得出笛卡尔积

发布了90 篇原创文章 · 获赞 8 · 访问量 8234

猜你喜欢

转载自blog.csdn.net/weixin_43854189/article/details/103940160