第 14 章 使用子查询
子查询
示例:
子查询总是从内向外处理。子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等
作为计算字段使用子查询
假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中
1)从customers表中检索客户列表。
2) 对于检索出的每个客户,统计其在orders表中的订单数目
相关例题:
select cust_id,(select SUM(item_price*quantity) from OrderItems
where Orders.order_num=OrderItems.order_num) AS total_ordered
from Orders
ORDER BY total_ordered DESC
第15章 联结表
关系表
各表通过某些常用的值(即关系设计中的关系(relational))互相关联。
外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
内部联结
明确的联结语法
ANSI SQL规范首选INNER JOIN语法。
例题
SQL100 确定最佳顾客的另一种方式(二)
OrderItems表代表订单信息,确定最佳顾客的另一种方式是看他们花了多少钱,OrderItems表有订单号order_num和item_price商品售出价格、quantity商品数量。Orders表含有字段order_num 订单号、cust_id顾客id。顾客表Customers有字段cust_id 客户id、cust_name 客户姓名。
**【问题】**编写 SQL 语句,返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)。
提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法。
select cust_name,sum(quantity*item_price) as total_price
from Customers t inner join Orders t1 on t.cust_id = t1.cust_id
inner join OrderItems t2 on t1.order_num = t2.order_num
group by cust_name having total_price >=1000
order by cust_name
SQL97 返回顾客名称和相关订单号以及每个订单的总价
Customers 表有字段,顾客名称:cust_name、顾客id:cust_id。Orders订单信息表,含有字段,订单号:order_num、顾客id:cust_id。OrderItems表有字段,商品订单号:order_num、商品数量:quantity、商品价格:item_price。
【问题】
除了返回顾客名称和订单号,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),添加第三列 OrderTotal,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。
select cust_name,Orders.order_num,item_price*quantity AS OrderTotal
from Customers,Orders,OrderItems
where Customers.cust_id=Orders.cust_id
and Orders.order_num=OrderItems.order_num
order by cust_name,order_num
注:这里order_num需要有表前缀
第16章 创建高级联结
不同类型的联结
自联结
自己和自己联结
示例:
自然联结
自然联结排除多次出现,使每个列只返回一次。
外部联结
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。例如,可能需要使用联结来完成以下工作:
1) 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
2) 列出所有产品以及订购数量,包括没有人订购的产品;
3) 计算平均销售规模,包括那些至今尚未下订单的客户。
在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字。指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
使用带聚集函数的联结
聚集函数可以与联结一起使用。