理解关系表的最好的方法是俩看一个现实的世界中的例子。
假如有一个包含产品目录的数据库表机构更,其中每种的类比诶的物品占一行。
对于每种无凭要存储的次逆袭白喊铲平的描述和价格,以及该铲平的供应商信息。
现在,加入有容一个供应商 的洞中物品,那么在何处存储供应商信息(如 ,供应商的明晨,地址,联系方法等)
将这些数据与铲平的信息分开存储的理由如下。
因为同一个供应商的生产的每个产品的供应商系你想都是相同的,对每个产品重复此信息兰妃四件,浪费空间。
如果供应商的系你想改变,(例如,供应商搬家或电话号码变动)只需该地一次即可。
如果有重复数据,很难保障每次输入该数据的当时都相同,不一致的数据在报表中很难利用。
关键是,相同的数据出现多次不是 一件好的事情,此因素是关系数据库设计的基础。
使用连接的方法:
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,products
order by vend_name,prod_name;
内部连接的另一种方式:
mysql> select vend_name,prod_name,prod_price
-> from vendors innner join products
-> on vendors.vend_id = products.vend_id;
ERROR 1054 (42S22): Unknown column 'vendors.vend_id' in 'on clause'
连接多个表结构:
ysql> select prod_name,vend_name,prod_price
-> from vendors innner join products
-> where products.vend_id=vendors.vend_id
-> and orderitems.prod_id=products.prod_id
-> and order_num=20005;
RROR 1054 (42S22): Unknown column 'vendors.vend_id' in 'where clause'
两种不同的连接方式:
子查询方式:
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_id
from orders
where order_num in ('20005')
多表连接方式:
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';