15.1 联结
SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表,但在掌握联结之前需要了解一下的名词概念:
关系表
关系表是指包含了共同关联列的众多表格,一般表格的数量大于等于2
主键和外键
- 主键指一个表中的唯一标识字段(简单理解为身份证ID)
- 外键是指的是一个表中的某列是另一个表中的主键值
15.2 创建联结
简单联结
基本的联结通过WHERE子句就可以进行创建:
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
- 在这里通过WHERE以及完全限定列名来建立起两个表格中的vend_id的联结,并且将结果返回
- 为了保证返回结果的准确性,在使用WHERE子句时需要保证其正确
笛卡尔积
没有联结条件的表返回的结果为笛卡尔积,即检索出的行的数目N是第一个表中的行树n乘以第二个表中的行数m。
可以近似理解为,当第一列中只有5个值($n=5$),第二列中有10个值($m=10$),那么返回的笛卡尔积就是50($N=nm=510$),此时返回的行数就50行
15.3 内联结
使用WHERE语句来进行联结是等值联结(即一一对应),等值联结也称为内联结,但是其并不使用WHERE子句,而是使用其他语法:
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
- 这里INNER JOIN表明了两个表之间的关系,然后通过ON来传递条件(实际与WHERE传递)相同
- 虽然使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结件;不过有时候这样做也影响性能。
15.4 多表联结
SELECT语句中可联结的表的数目没有限制,创建联结也基本类似:
SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20005;
- 这里通过WHERE和AND的灵活组合,可以指定多个联结条件
- 但是正如前面提到的,使用过多的联结会导致性能下降,这就需要减少不必要联结的表
网友评论