MySQL必知必会:第十五章 联结表

1.关系表

例子:

​ 假如有一个包含产品目录的数据库表,其中每种类别的物品占一行。对于每种物品要储存的信息包括描述和价格,以及生产该产品的供应商信息。现在,假如有由同一供应商生产的多种物品,那么在何处储存供应商信息呢?

​ 可建立两个表,一个存储供应商信息,另一个存储产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此标识为主键,可以是供应商ID或任何其他的唯一值。

​ products表只储存产品信息,它除了储存供应商ID外不储存其他供应商信息。vendors表的主键又叫作products的外键,它将两个表关联。

关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各个表通过某些常用的值互相关联。

外键:为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。

2.创建联结

等值联结,也称内部联结:基于两个表之间的相等测试.

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,第一个表中的每行将与第二个表中的每行进行配对,而不管逻辑上是否可以在一起.

​ 笛卡尔积:由没有联结条件的表关系返回的结果.检索出的行的数目将是第一个表中行数乘以第二个表的行数.

3.内部联结

上述等值联结即为内部联结.

另一种写法

SELECT vend_name,prod_name,prod_price
FROM vendors a 
INNER JOIN products b
ON a.vend_id=b.vend_id

4.联结多个表

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'

你可能感兴趣的:(MySQL)