【MySQL必知必会】第十六章 创建高级联结
1、使用表别名
好处:
a、缩短SQL语句。
b、允许在单条SELECT语句中多次使用相同的表。
输入:
SELECT cust_name,cust_contact
FROM customers AS c,orders AS o,orderitems AS io
WHERE c.cust_id = o.cust_id
AND io.order_num = o.order_num
AND prod_id = ‘TNT2’;
注:
a、表别名不仅能用在WHERE子句,还可以用在SELECT的列表、ORDER BY子句,以及语句的其他部分。
b、表别名和列别名不一样,它不会返回到客户机。
3、自联结
如果你知道某样物品存在问题(物品名为DTNT),你想知道该物品的供应商提供的其他物品是什么,以便于检测,你可以这么做:
输入:
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 = ‘DTNT’;
输出:
prod_id prod_name
DTNT Detonator
FB Bird seed
分析:这里使用两张同名的表是合法的。
4、自然联结
输入:
SELECT c.* , o.order_num , o.order_date , io.prod_id
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.order_num
AND oi.order_num = o.order_num
AND prod_id = 'FB';
分析:自然联结不会出现重复的列,每个列都只出现一次,通过对表使用通配符(SELECT *)来实现,对其他表的列使用明确的子集来完成。
5、外部联结
联结包含了那些在相关表中没有关联行的行。
输入:SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JION orders
ON customers.cust_id = orders.cust_id;
输出:
cust_id order_num
10001 2005
10001 2009
10003 null
10005 2008
分析:LEFT OUTER的意思就是它左边的表有一些行可以对应其他表的空值。RIGHT OUTER说的是右边的表的行可以对应空值。
6、使用带聚集函数的联结
输入:
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;
输出:
cust_name cust_id num_ord
Coyote 101 3
Wsad 105 2
分析:该例检索所有客户,以及每个客户所下的订单数。