使用表别名
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;