15.1.1 关系表
为什么要把表分开:
以产品表和供应商表为例,将产品和供应商弄成两个表的好处是:
外键:外键为某个表中的某一列,它包含另一个表示的主键值,定义了两个表之间的关系。
使用做的好处表示:
可伸缩性:能够适应不断增加的工作量而不失败
15.1.2 为什么要使用联结
维护引用完整性:指示mysql只允许在products表的供应商ID列中出现合法值(通过在表的定义中指定主键和外键)
15.2 创建联结
select vend_name, prod_name, prod_price
from vendors, products
where vendors.vend_id = products.vend_id
order by vend_name, prod_name;
两个表用where子句正确联结,where子句指示mysql匹配vendors表中的vend_id和products表中的vend_id.
15.2.1 where子句的重要性
利用where子句建立联结关系似乎奇怪,实际上,这是充分的理由。因为,select联结表,相应的关系是在运行时构造的。在联结两个表时,实际上是把第一个表的每一行和第二个表的每一行作匹配。where子句作为过滤条件,只包含那些匹配给定条件
不要忘了where子句,如果联结的时候不使用where子句,否则mysql将会返回比你所需要的更多的数据。
15.2.2 内部联结
上面的连接是等值连接,基于相等测试,也叫内部联结。下面的语法也可以用于明确指定内部联结:
select vend_name, product_name, product_price
from vendors inner join products
on vendors.vend_id = products.vendor_id;
与where语句两处不同,一处是inner join明确指定,第二处是使用on而非是where。
ANSI SQL推荐使用inner join语法,因为比较明确。
15.2.3 联结多张表
我们可以联结多张表,和联结两张表类似。
有时候,子查询和联结表都能够完成工作,需要我们进行实验判断效率。