注:一个数据库小白的成长之路
1.使用表别名
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 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';
返回物品ID为DTNTR的供应商生产的所有物品。
自然联结
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';
外部联结
外部联结主要用来联结那些在相关表中没有关联行的行,这时候用内部联结会缺少一些情况。
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
检索所有客户的订单,包含那些没有订单的客户。如果这里使用内部联结,那么将无法得知10002号客户的订单数量情况。因为实际上他并没有订单,也就是与表orders没有关联。
注:外部联结相比于内部联结还会包括没有关联的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表。若使用LEFT则是包含左边表的所有行
使用带聚集函数的联结
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;
统计每个客户的订单数,由于使用的是左外部联结,所以也包含那些没有下任何订单的客户。