1、高级数据处理,主讲人: 许雪峰 Email: 办公地点:C7 二楼 203 计科系,第16章 创建高级联结,本次课主要内容,使用表别名 使用不同类型的联结 使用带聚集函数的联结 使用联结和联结条件,使用表别名,别名的作用 可以缩短sql语句 允许在单条SELECT 语句中多次使用相同的表,例子 使用表别名检索订购产品为TNT2的客户的姓名和联系方式,表别名的使用范围 表别名可用于WHERE子句、SELECT的列表、ORDER BY子句以及语句的其他部分 表别名只在查询执行中使用 与列别名不一样,表别名不返回到客户机,使用不同类型的联结,联结的分类 内部联结(等值联结) 自联结 自然联结 外部
2、联结,自联结 问题的提出 利用子查询检索提供产品DTNTR的供应商的所有产品ID号和产品名称 利用联结完成上述检索,什么是自联结 自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句,自然联结 自然联结排除多次出现的列,每个列只返回一次 这一般是通过对表使用通配符,对所有其他表的列使用明确的子集来完成,例子 SELECT c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_pirce FROM customer AS c, orders AS o, orderitems AS oi WHERE c.cu
3、st_id = o.cust_id AND oi.order_num = o.order_num AND prod_id = FB;,外部联结 联结包含了那些在相关表中没有关联的行,这种联结类型的联结称为外部联结,例子 检索所有客户及其订单 检索所有客户,包括那些没有订单的客户,问题 内部联结、自联结、自然联结、外部联结之间的区别?,使用带聚集函数的联结,聚集函数在内联结中的应用 检索下了订单的客户的姓名、ID号及订单数,SELECT customers.cust_name , customers.cust_id , COUNT(orders.order_num) AS num_ordFROM
4、 customers INNER JOIN orders ON customers.cust_id = orders.cust_idGROUP BY customers.cust_id;,聚集函数在外联结中的应用 检索所有客户的姓名、ID号及所下的订单数,SELECT customers.cust_name , customers.cust_id , COUNT(orders.order_num) AS num_ordFROM customers LEFT OUTER JOIN ordersON customers.cust_id = orders.cust_id GROUP BY customers.cust_id;,使用联结和联结条件,1 注意所使用的联结类型,一般我们使用内部联结,但使用外部联结也是有效的。 2 保证使用正确的联结条件,否则将返回不正确的数据; 3 应该始终提供联结条件,否则会得出笛卡尔积 4 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在测试它们之前,分别测试每个联结。这将使故障排除更为简单。,