15.1 联结(join)
15.1.1 关系表
关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。
外键:外键为某个表中的一列,它包含另一个表的主键值(唯一标识),定义了两个表之间的关系。
可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。
15.1.1 为什么要使用联结
如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
联结,用来在一条SELECT语句中关联表。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
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;
**完全限定列名:**在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)
15.2.1 where子句的重要性
where子句做为过滤条件,它只包含那些匹配给定条件(联结条件)的行。没有where子句,第一个表中的每一行将与第二个表中的每一行匹配,而不管他们逻辑上是否可以配在一起。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
SELECT vend_name,prod_name,prod_price
FROM vendors,products
ORDER BY vend_name,prod_name;
15.2.2 内部联结
等值联结,基于两个表之间的相等测试
两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定,联结条件用特定的ON子句而不是where子句给出。
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;
15.2.3 联结多个表
SQL对一条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;
使用联结/子查询的相同查询:
SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN(SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id='TNT2'));
SELECT cust_name,cust_contact
FROM customers,orders,orderitems
WHERE customers.cust_id=orders.cust_id
AND orderitems.order_num=orders.order_num
AND prod_id='TNT2';