SQL循序渐进(17)
| 编译：ZSC / 太平洋网络学院 |  |

JOIN子句

为了避免”多余数据”，一个最好的方法：让数据库有两个表： 其中一个用来对顾客保持跟踪；另外一个用来对他们买什么东西保持跟踪。 即有"Customer_info" 表和"Purchases" 表：

"Customer_info" 表为：

customer_number | firstname | lastname | address | city | state | zip

"Purchases" 表为：

customer_number | date | item | price

现在开始，不管顾客什么时候进行重复的购物，只有第二个表"Purchases" 需要更新。这样我们就减少了多余的数据，也就是说我们规格化了这个数据库。

你仔细点就会发现两个表中还是有一个"cusomer_number"列是相同的。这个列包含了单独的顾客号，它将用来JOIN（连接）两个表。下面举个例子来使用这两个表，假如你想搜索顾客的名字以及他们所买的东西，你可以使用以下的语句来实现：

SELECT customer_info.firstname, customer_info.lastname, purchases.item

FROM customer_info, purchases

WHERE customer_info.customer_number = purchases.customer_number;

特殊的"Join"有为"Inner Join" 或者"Equijoin"，这是一个最常见的"Join"类型，以后我们经常用使用到或者看到。

这里要注意每列总是在表名之前，这却也不是必需的。这是一个好的练习对于帮助你澄清列后面跟着表的认识有很大帮助。如果两个表之间有一个相同的列，它就是必须的。我这里推荐在使用JOIN的时候最好在所有列之后加上表名。

注意；上面描述的这个语法将在绝大多数的数据库系统起作用，本教程的也是一样。但是结果你会发现你上面的语句并不起作用，请仔细检查一下吧。

当然你可以试一试修改以上的代码，你可以使用JOIN（ANSI SQL-92语法规范中的INNER JOIN）：

SELECT customer_info.firstname, customer_info.lastname, purchases.item

FROM customer_info INNER JOIN purchases

ON customer_info.customer_number = purchases.customer_number;

再举另外一个例子：

SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission

FROM employee_info, employee_sales

WHERE employee_info.employeeid = employee_sales.employeeid;

这个例子将从employee_info和employee_sales表中选择当employee_info表的employeeid等于employee_sales表的employeeid的employeeid 、emplyee_info表中lastname以及employee_sales表中的comission数值。

从上面的例子中可以发现利用JION的语句比价简练。既然有这样的有点，我们何乐而不为呢？