例子:
假如有一个包含产品目录的数据库表,其中每种类别的物品占一行。对于每种物品要储存的信息包括描述和价格,以及生产该产品的供应商信息。现在,假如有由同一供应商生产的多种物品,那么在何处储存供应商信息呢?
可建立两个表,一个存储供应商信息,另一个存储产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此标识为主键,可以是供应商ID或任何其他的唯一值。
products表只储存产品信息,它除了储存供应商ID外不储存其他供应商信息。vendors表的主键又叫作products的外键,它将两个表关联。
关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各个表通过某些常用的值互相关联。
外键:为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。
等值联结,也称内部联结:基于两个表之间的相等测试.
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id=products.vend_id
ORDER BY vend_name,prod_name
SELECT vend_name,prod_name,prod_price
FROM vendors a ,products b
WHERE a.vend_id=b.vend_id
ORDER BY vend_name,prod_name
SELECT vend_name,prod_name,prod_price
FROM vendors a ,products b
WHERE a.vend_id=b.vend_id
#没有ORDER BY语句也能连接
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,只包含那些匹配给定条件的行.如果没有WHERE,第一个表中的每行将与第二个表中的每行进行配对,而不管逻辑上是否可以在一起.
笛卡尔积:由没有联结条件的表关系返回的结果.检索出的行的数目将是第一个表中行数乘以第二个表的行数.
上述等值联结即为内部联结.
另一种写法
SELECT vend_name,prod_name,prod_price
FROM vendors a
INNER JOIN products b
ON a.vend_id=b.vend_id
SELECT prod_name,vend_name,prod_price,quantity
FROM orderitems a,products b,vendors c
WHERE b.vend_id=c.vend_id
AND a.prod_id=b.prod_id
AND order_num=20005
#找订购产品TNT2的客户列表
#方法一
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 a,orders b,orderitems c
WHERE b.order_num=c.order_num
AND a.cust_id=b.cust_id
AND c.prod_id='TNT2'