chapter16:创建高级联结

使用表别名

SQL允许给表名起别名,理由如下:

  • 缩短SQL语句;
  • 允许在单挑SELECT语句中多次使用相同的表。
    例:
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = 0.cust_id
  AND oi.order_num = o.order_num
  AND prod_id = 'TNT2';

!:表别名可以用于WHERE、ORDER BY子句等;表别名只在查询执行中使用,不返回到客户机。

使用不同类型的联结

自联结

例:假如你发现ID为DTNTR的物品存在问题,因此想知道生产该物品的供应商生产的其他物品是否也存在问题。

下面是一种解决方法:

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

!:处理自联结比子查询快得多。

自然联结

无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有数据,甚至相同的列出现多次。自然联结排除多次出现,使每个列只返回一次。

你只能选择那些唯一的列,这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集完成。例:

SELECT c.*, o.order_num, 0.order_date, oi.prod_id, oi.quantity, oi.item_price
FROM customers AS c, orders AS o, orderitems AS io
WHERE c.cust_id = o.cust_id
  AND oi.order_num = 0.order_num
  AND prod_id = 'FB';

外部联结

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

一个简单的内部联结。检索所有客户及其订单:

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;

!:外部联结包括没有关联行的行。RIGHT指出的是OUTER JOIN右边的表,LEFT指出的是OUTER JOIN左边的表。

使用带聚集函数的联结

例:检索所有客户及每个客户所下的订单数,使用COUNT():

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;

你可能感兴趣的:(chapter16:创建高级联结)