使用别名引用被检索的表列函数
别名除了用于列名和计算字段外,SQL还容许给表名起别名。这样作
有两个主要理由:性能
能够看到, FROM 子句中3个表全都具备别名。 customers AS c
创建 c 做为 customers 的别名,等等。这使得能使用省写的 c 而
不是全名 customers 。在此例子中,表别名只用于 WHERE 子句。可是,表
别名不只能用于 WHERE 子句,它还能够用于 SELECT 的列表、 ORDER BY 子句
以及语句的其余部分。测试
应该注意,表别名只在查询执行中使用。与列别名不同,表别名
不返回到客户机ui
迄今为止,咱们使用的只是称为内部联结或等值联结(equijoin)的简
单联结。如今来看3种其余联结,它们分别是自联结、天然联结和外部联结blog
如前所述,使用表别名的主要缘由之一是能在单条 SELECT 语句中不
止一次引用相同的表。下面举一个例子语法
假如你发现某物品(其ID为 DTNTR )存在问题,所以想知道生产该物
品的供应商生产的其余物品是否也存在这些问题。此查询要求首先找到
生产ID为 DTNTR 的物品的供应商,而后找出这个供应商生产的其余物品。
下面是解决此问题的一种方法引用
这是第一种解决方案,它使用了子查询。内部的 SELECT 语句作
了一个简单的检索,返回生产ID为 DTNTR 的物品供应商的
vend_id 。该ID用于外部查询的 WHERE 子句中,以便检索出这个供应商生
产的全部物品方法
如今来看使用联结的相同查询:
im
此查询中须要的两个表其实是相同的表,所以 products 表在
FROM 子句中出现了两次。虽然这是彻底合法的,但对 products
的引用具备二义性,由于MySQL不知道你引用的是 products 表中的哪一个
实例。
为解决此问题,使用了表别名。 products 的第一次出现为别名 p1 ,
第二次出现为别名 p2 。如今能够将这些别名用做表名。例如, SELECT 语
句使用 p1 前缀明确地给出所需列的全名。若是不这样,MySQL将返回错
误,由于分别存在两个名为 prod_id 、 prod_name 的列。MySQL不知道想
要的是哪个列(即便它们事实上是同一个列)。 WHERE (经过匹配 p1 中
的 vend_id 和 p2 中的 vend_id )首先联结两个表,而后按第二个表中的
prod_id 过滤数据,返回所需的数据。d3
用自联结而不用子查询 自联结一般做为外部语句用来替代
从相同表中检索数据时使用的子查询语句。虽然最终的结果是
相同的,但有时候处理联结远比处理子查询快得多。应该试一
下两种方法,以肯定哪种的性能更好
不管什么时候对表进行联结,应该至少有一个列出如今不止一个表中(被
联结的列)。标准的联结(前一章中介绍的内部联结)返回全部数据,甚
至相同的列屡次出现。天然联结排除屡次出现,使每一个列只返回一次。
天然联结是这样一种联结,其中你只能选择那些惟一的列。这一
般是经过对表使用通配符( SELECT * ),对全部其余表的列使用明确的子
集来完成的。下面举一个例子:
在这个例子中,通配符只对第一个表使用。全部其余列明确列
出,因此没有重复的列被检索出来
事实上,迄今为止咱们创建的每一个内部联结都是天然联结,极可能
咱们永远都不会用到不是天然联结的内部联结
许多联结将一个表中的行与另外一个表中的行相关联。但有时候会需
要包含没有关联行的那些行
下面的 SELECT 语句给出一个简单的内部联结。它检索全部客户及其
订单
SELECT 语句使用了关
键字 OUTER JOIN 来指定联结的类型(而不是在 WHERE 子句中指
定)。可是,与内部联结关联两个表中的行不一样的是,外部联结还包括没
有关联行的行。在使用 OUTER JOIN 语法时,必须使用 RIGHT 或 LEFT 关键字
指定包括其全部行的表( RIGHT 指出的是 OUTER JOIN 右边的表,而 LEFT
指出的是 OUTER JOIN 左边的表)。上面的例子使用 LEFT OUTER JOIN 从 FROM
子句的左边表( customers 表)中选择全部行。为了从右边的表中选择所
没有 = 操做符 MySQL不支持简化字符 = 和 =* 的使用,这两
种操做符在其余DBMS中是很流行的。
外部联结的类型 存在两种基本的外部联结形式:左外部联结
和右外部联结。它们之间的惟一差异是所关联的表的顺序不
同。换句话说,左外部联结可经过颠倒 FROM 或 WHERE 子句中
有行,应该使用 RIGHT OUTER JOIN
汇集函数用来汇总数据。虽然至今为止汇集函数
的全部例子只是从单个表汇总数据,但这些函数也能够与联结一块儿使用
此 SELECT 语句使用 INNER JOIN 将 customers 和 orders 表互相关联。
GROUP BY 子句按客户分组数据,所以,函数调用 COUNT
(orders.order_num) 对每一个客户的订单计数,将它做为 num_ord 返回
这个例子使用左外部联结来包含全部客户,甚至包含那些没有
任何下订单的客户。结果显示也包含了客户 Mouse House ,它
有 0 个订单。
在总结关于联结的这两章前,有必要汇总一下关于联结及其使用的
某些要点。
本章从讲授如何以及为何要使用 别名开始,而后讨论不一样的联结类型及对每种类型的联结使用的各类语 法形式。咱们还介绍了如何与联结一块儿使用汇集函数,以及在使用联结 时应该注意的某些问题