本文摘自PHP中文网,作者hzc,侵删。
1. 使用表别名
别名除了用于列名和计算字段外, SQL还允许给表名起别名。这样做有两个主要理由:
缩短SQL语句;
允许在单条SELECT语句中多次使用相同的表。
1 2 3 4 5 6 7 |
|
分析:可以看到,
FROM
子句中3个表全都具有别名。customers AS c
建立c作为customers
的别名,等等。这使得能使用省写的c
而不是全名customers
。在此例子中,表别名只用于WHERE子句。但是,表别名不仅能用于WHERE
子句,它还可以用于SELECT
的列表、ORDER BY
子句以及语句的其他部分。
2. 使用不同类型的联结
2.1 自联结
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
分析:此查询中需要的两个表实际上是相同的表,因此
products
表在FROM
子句中出现了两次。虽然这是完全合法的,但对products
的引用具有二义性,因为MySQL
不知道你引用的是products
表中的哪个实例。
用自联结而不用子查询:自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多
2.2 自然联结
自然联结排除多次出现,使每个列只返回一次。
1 2 3 4 5 6 7 |
|
+
分析:在这个例子中,通配符只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来。
2.3 外部联结
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
为了检索所有客户,包括那些没有订单的客户,可如下进行:
1 2 3 4 5 6 7 8 9 10 11 |
|
分析:类似于上一章中所看到的内部联结,这条SELECT语句使用了关键字OUTER JOIN来指定联结的类型(而不是在WHERE子句中指定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表( RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。 上面的例子使用LEFT OUTER JOIN从FROM子句的左边表(customers表)中选择所有行。
3 使用带聚集函数的联结
如果要检索所有客户及每个客户所下的订单数,下面使用了COUNT()函数的代码可完成此工作:
1 2 3 4 5 6 7 8 9 |
|
分析:此SELECT语句使用INNER JOIN将customers和orders表互相关联。GROUP BY 子 句 按 客 户 分 组 数 据 , 因 此 , 函 数 调 用COUNT(orders.order_num)对每个客户的订单计数,将它作为num_ord返回。
1 2 3 4 5 6 7 8 9 10 |
|
分析:这个例子使用左外部联结来包含所有客户,甚至包含那些没有任何下订单的客户。结果显示也包含了客户Mouse House,它有0个订单。
推荐教程:《MySQL教程》
以上就是MySQL必知必会:创建高级联结的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
mysql数据库在centos系统下如何被彻底删除的步骤介绍
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。