
本文讲解另一些联结类型,介绍对联结的表使用表别名和聚集函数。
1、使用表别名
给表名起别名的优点:
1. 缩短SQL语句
2. 允许单条SELECT语句中多次使用相同的表

分析:FROM子句中三个表名全部具有别名。注意,表别名只能在查询执行中使用,与列名不同,表别名不返回客户机。
2、使用不同类型的联结
自联结、自然联结、外部联结
自联结
目的:因很多情况下,在一条SELECT子句中不止一次引用相同表格,为避免繁琐,引入自联结。
假如需要通过通过某物品,检索所有此供应商的物品。需要首先查找供应商→检索所有物品

分析:此方法利用 子查询(嵌套查询),缺点:多次输入vend_id。相应的联结查询方式为:

分析:纵使使用同一个表,也需要使用 完全限定。同时使用自联结,用外部语句替代相同表中检索数据时使用的子查询语句。性能上,比子查询快。
自然联结
宗旨:无论何时对表联结,至少有一个列出现在不止一个表中(被联结的列)。
特点:自然联结排除多次出现,每个列只出现一次。
工作方式:只能选择唯一的列,通常使用通配符(SELECT *),对所有其他表的列使用明确子集完成。

外部联结
有时需要包含没有关联行进行关联。例如可能需要使用联结来完成如下工作:
1. 对每个客户订单进行计数,包括至今未下订单的客户。(此时订单表中不包含未下订单客户)
2. 列出所有产品及订购数量,包括没人订购的产品。
如下,检索所有客户和订单:

为了检索没有订单的客户,需要进行如下(外部联结)操作:

分析:使用关键字OUTER JOIN来指定联结类型(不是在WHERE中指定)。与INNER JOIN不同地方在于,还包括为包含的关联行。
注意:使用OUTER JOIN时,必须指明RIGHT,LEFT关键字(RIGHT指出,OUTER JOIN右侧的表)。customers LEFT OUTER JOIN orders从左侧customers表中选择所有行。
使用带聚集函数的联结
聚集函数用来汇总函数。可以同联结一起使用。
如要检索所有客户及每个客户所下订单数,使用COUNT()完成:

注意:函数COUNT()需要同 GROUP BY 一起使用,进行分组计算。同时聚集函数也可以用在如下外部联结:

使用联结和联结条件
注意联结类型。一般为内部联结,有时需要外部联结。
保证使用正确联结条件。
应该总是提供联结条件,否则产生笛卡尔积。
联结中可能包含多个表。测试前需要分别测试单个联结。





