13.1使用表别名
别名除了用于列名和计算字段外,SQL还允许给表明起别名。这样做有两个主要理由:
(1)缩短SQL语句
(2)允许在单条SELECT语句中多次使用相同的表。
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 = ‘RGAN01‘;
Oracle中没有AS:Oracle不支持AS关键字,为在Oracle中使用别名,可以不用AS,简单地指定列名即可。
13.2使用不同类型的联结
13.2.1自联结
SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM Customers AS c1,Customers AS c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = ‘Jim Jones‘;
使用自联结而不用子查询
13.2.2自然联结
无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
SELECT C.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price
FROM Customers AS C,Order AS O,OrderItems AS OI
WHERE C.cust.id = O.cust.id
AND OI.order_num = O.order_num
AND prod_id = ‘RGAN01‘;
13.2.3外部联结
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。
检索所有用户及其订单
内链接
SELECT Customers.cust_id,Orders.order_num
FROM Customers INNER JOIN Orders
ON Customer.cust_id = Orders.order_id;
外联结,包括那些没有订单的客户
SELECT Customers.cust_id,Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customer.cust_id = Orders.order_id;
在使用OUTER JOIN语法时必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
SQL服务器额外支持一种简化的外部联结语法。
SELECT Customers.cust_id,Orders.order_num
FROM Customers ,Orders
ON Customer.cust_id *= Orders.order_id;
*=左联结 ,=*右联结
OUTER JOIN语法还有另一种形式(仅由Oracle使用),它需要在表明后使用(+)操作符
SELECT Customers.cust_id,Orders.order_num
FROM Customers ,Orders
ON Customer.cust_id (+) = Orders.order_id;
全外联结(full outer join),他检索两个表中的所有行并关联那些可以关联的行。与左外部联结或右外部联结不一样(他们包含来自一个表的不关联的行),全外部联结包含来自两个表的不关联的行。
SELECT Customers.cust_id,Orders.order_num
FROM Customers FULL OUTER JOIN Orders
ON Customer.cust_id = Orders.order_id;
13.3使用带聚集函数的联结
内联结
SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customer.cust_id = Orders.order_id
GROUP BY Customers.cust_id;
外联结
SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord
FROM Customers LEFT OUTER JOIN Orders
ON Customer.cust_id = Orders.order_id
GROUP BY Customers.cust_id;
13.4使用联结和联结条件
关于联结及使用的某些要点:
(1)注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
(2)关于确切的联结语法,应该查看具体的文档。
(3)保证使用正确的联结条件,否则将返回不正确的数据。
(4)应该总是提供联结条件,否则会得出笛卡儿积。
(5)在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试他们前,分别测试每个链接。这将使故障排除更为简单。