本课讲另外一些联结(含义和使用方法),如何使用表别名,如何对被联结的表使用聚集函数。
13.1 使用表别名
第7课中使用别名引用被检索的表列,给列起别名的语法如下:
SQL除了可以对列名和计算字段使用别名,还可以对表名起别名。
好处:
1. 缩短SQL语句
2. 允许在一条select语句中多次使用相同的表。
customers as c使用c作为customers的别名;
!!!Oracle中没有as,不支持as关键字,使用方法为:customers c
表别名只在查询执行中使用,表别名不返回到客户端
13.2 使用不同类型的联结
第12课只介绍了内联结或等值联结的简单联结,现在介绍三种其他联结:自联结(self-join), 自然联结(natural join), 外联结(outer join).
13.2.1 自联结
使用表别名的一个主要原因是能在一条select语句中不止一次使用相同的表。如下例:
要给与Jim Jones同一公司的所有顾客发送一封信件。
查询要求:首先找出Jim Jones工作的公司,然后找出该公司工作的顾客。
方法一:使用子查询:
方法二:使用联结:
此查询中需要的两个表是相同的表,避免歧义性,使用两个别名。
!!!自联结通常作为外部语句,替代从相同表中检索数据的使用子查询语句。许多DBMS处理联结远比处理子查询快得多。
13.2.2 自然联结
对表进行联结,至少有一列不止出现在一个表中,标准的联结返回所有数据,相同的列出现多次。
自然连接使每一列只返回一次。
自然联结要求只能选择那些唯一的列,一般通过对一个表使用通配符(select * ),而对其他表的列使用明确的子集来完成。
13.2.3 外联结
有时候需要包含没有关联行的那些行。例如:
1. 对每个顾客下的订单进行计数,包括那些至今尚未下订单的顾客。
2. 列出所有产品以及订购数量,包括没有人订购的产品;
3. 计算平均销售规模,包括那些至今尚未下订单的顾客。
内联结:所有顾客及其订单:
外联结:包含没有订单顾客在内的所有顾客
在使用outer join语法时,必须使用right或left关键字指定包括其所有行的表;
right:指出的是outer join右边的表,
left:指出的是outer join左边的表。
上面的例子使用left outer join 从from 子句左边的表(customers表)中选择所有行。
SQLite支持Left outer join ,不支持right outer join
两种基本的外联结形式:左外联结和右外联结。
全外联结(full outer join):检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表的不关联的行不同,全外联结包含两个表的不关联的行。(MySQL不支持)
13.3 使用带聚集函数的联结
第9课讲,聚集函数用来汇总数据。
聚集函数与联结一起使用:检索所有顾客及每个顾客所下的订单数。
group by子句按顾客分组数据,函数调用count(orders.order_num)对每个顾客的订单计数,作为num_ord返回。