1.使用表别名
SQL除了可以对列名和计算字段使用别名,还允许给表名起别名。
这样做有两个主要理由:
- 缩短SQL语句
- 允许在一条SELECT语句中多次使用相同的表
SQL
SELECT cust_name,cust_contact
FROM Customers AS C , Orders AS O , OrdersItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
"SELECT publish_time,arist_id
FROM songs AS S
INNER JOIN useractions AS U
ON S.id = U.id"
需要注意,表别名只在查询执行中使用。
与列别名不一样,表别名不返回到客户端。
2.使用不同类型的联结
除了内联结或等值联结,还有三种其他联结:自联结(self-join)、自然联结(natural join)和外联结(outer join)
2.1自联结
自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查询语句。
虽然最终的结果是相同的,但许多DBMS处理联结远比处理子查询快得多。
子查询:
SQL
SELECT cust_id,cust_name,cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = 'Jim Jones'
)
自联结:
SQL
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'
"SELECT S.song_id,S.arist_id,S.`language`
FROM songs AS S ,useractions AS U
WHERE S.id = U.id
AND U.action_type = 1"
2.2自然联结
SQL
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';
事实上,我们迄今为止建立的每个内联结都是自然联结,很可能永远都不会用到不是自然联结的内联结。
2.3外联结
SQL
SELECT Customers.cust_id,Orders.order_num
FROM Customers
RIGHT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
提示:外联结的类型
要记住,总是有两种基本的外联结形式:左外联结和右外联结。
它们之间的唯一差别是所关联的表的顺序。
换句话说,调整FROM或WHERE子句表的顺序,左外联结可以转换为右外联结。
3.使用带聚集函数的联结
聚集函数用来汇总数据。虽然至今为止我们举的聚集函数的例子都只是从一个表中汇总数据,
但这些函数也可以与联结一起使用。
SQL
SELECT 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;
4.使用联结和联结条件
联结及其使用的要点:
- 注意所使用的联结类型。一般我们使用内联结,但使用外联结也有效。
- 关于确切的联结语法,应该查看具体的文档,看相应的DBMS支持何种语法
- 保证使用正确的联结条件,否则会返回不正确的数据。
- 应该总是提供联结条件,否则会得出笛卡尔积(假如A表中的数据为m行,B表中的数据有n行,那么A和B做笛卡尔积,结果为m*n行。)。
- 在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型。
- 虽然这样做是合法的,一般也很有用,但应该在一起测试它们前分别测试每个联结。这会使故障排除更为简单。