本节,我们将介绍SQL最强大的功能之一,就是在数据检索查询的执行中联结表。联结是利用SQL的SELECT能执行的最重要的操作。
part 1 关系型数据 和 查询他的方法——联结
但是在开始之前,我们要先了解一些知识,作为储备!
我们先要介绍一下,关系型数据库:
想一想如下情况,我们有一堆产品,他的信息有,价格,产品供应商名。 那我们应该如何存储这些信息呢? 我们应该将这些数据和产品信息分开存储!
因为:
1.很多产品的供应商都是相同的,对每个产品重复此信息是对空间和时间的浪费。
2.如果供应商信息改变,那我们只需要改动一次供应商信息即可。
3.如果有重复数据,可以很好的利用起来
在这个例子中,我们最终建立两个表,一个存储供应商信息,一个存储产品信息。
vendors表包含所有供应商的信息,每个供应商占一行,每个供应商占一行,都具有唯一的标识,我们把这称为主键! products表存储了产品信息,他除了存储供应商的主键外,不存储供应商的其他信息! vendors表的主键,又叫products的外键, 他将两个表相关联!
显然,这样子为我们的供应商信息就不会重复,解决了空间和时间;也方便我们修改供应商的信息。
关系型数据的可伸缩应(就是可以适应不断增加的工作量)比非关系型好很多。
上面的用的,我们称为关系型数据表,而我们为了从他那里,检索数据就要用到联结。简单说联结是一种机制,用一条SELECT语句中关联各表,重要的是,理解联结并不是物理试实体!他只存在于查询中!
看例子:
SELECT git.name,coder.ID,git.id FROM coder,git WHERE coder.ID = git.id ORDER BY git.name;
这里需要注意的是,可能产生列名相同的情况,所以我指明了表名 。另外说明一点,我们这样子,用WHERE来联结的方式,我们称为等值联结。 下面介绍内部联结。
part 2 内部联结
目前为止,我们都是通过WHERE进行等值联结,来对两个表进行相等测试。这种联结也称为内部联结。但是我们还有一种内部联结的语法,如下:
SELECT git.name,coder.ID,git.id FROM coder INNER JOIN git ON coder.ID = git.id ORDER BY git.name;
上面的语句将会产生,和part1 中语句 一样的效果。
说明一下:SQL规范首选 INNER JOIN … ON 语法。 尽管使用WHERE子句定义比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能提升性能。
part 3 联结多个表
我们举个例子来说:
SELECT prod_name,vend_name,quantity FROM orderitems,products,vendors
WHERE products.ven_id = vendors.vend_id AND orderitems.prod_id = products.prod_id AND order_num = 20005;
当然,上面的例子,我们也可以用之前学的子查询来做,但是我们也可以通过用联结 和 AND的方法来做。
需要说明的是,不能确定的说,哪种方法就更好,性能可能会收操作类型,表中项目数量,是否存在索引或建来说,所以我们应该多做一些实验来看性能问题。