创建高级联结、自联结、自然联结、外部联结
廖家龙 用心听,不照做

创建高级联结【自联结、自然联结、外部联结】

别名除了用于列名和计算字段外,SQL还允许给表名起别名,这样做有两个主要理由:
1)缩短SQL语句
2)允许在单条SELECT语句中多次使用相同的表

1)表别名不仅能用于WHERE子句,它还可以用于SELECT的列表、ORDER BY子句以及语句的其他部分,表别名只在查询执行中使用,与列别名不一样,表别名不返回到客户机
SELECT custname,custcontact
FROM customers AS c,orders AS o,orderitems AS oi
WHERE c.custid=o.custid
AND oi.ordernum=o.ordernum
AND prod_id=’TNT2’;

2)自联结
首先找到生产ID为DTNTR的物品的供应商,然后找出这个供应商生产的其他物品
SELECT prodid,prodname
FROM products
WHERE vendid =(SELECT vendid
FROM products
WHERE prod_id=‘DTNTR’);

SELECT p1.prodid,p1.prodname
FROM products AS p1,products AS p2
WHERE p1.vendid=p2.vendid
AND p2.prod_id=‘DTNTR’;

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

4)联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结

检索所有客户及其订单(内部联结)
SELECT customers.custid,orders.ordernum
FROM customers INNER JOIN orders
ON customers.custid=orders.custid;

为了检索所有客户,包括那些没有订单的客户(外部联结):
SELECT customers.custid,orders.ordernum
FROM customers LEFT OUTER JOIN orders
ON customers.custid=orders.custid;


5)检索所有客户及每个客户所下的订单数
SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.ordernum) AS numord
FROM customers INNER JOIN orders
ON customers.custid=orders.custid
GROUP BY customers.cust_id;

  1. SELECT customers.cust_name,
    customers.cust_id,
    COUNT(orders.ordernum) AS numord

FROM customers LEFT OUTER JOIN orders
ON customers.custid=orders.custid
GROUP BY customers.cust_id;