|
|
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的语句比价简练。既然有这样的有点,我们何乐而不为呢?
|