SQL第13课——创建高级联结

本课讲另外一些联结(含义和使用方法),如何使用表别名,如何对被联结的表使用聚集函数。

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返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值