大型的系统中涉及的数据库表之间是存在关系的,如订单表的商品信息会与商品表产生关系,商品表中的供应商列会与供应商信息表产生关系,分开存储有助于数据的一致性和存储空间的节省。那么怎么保证关系的有效?怎么方便地联结多个表进行查询呢?就往下看吧~
1、外键
外键是表中的某一列,包含另一个表的主键值。vendors表的主键就可以作为products表的外键,将两张表相关联。
如果插入/更新products表中的vend_id不是另一个表的主键,非法数据插入/更新不成功。
2、where语句创建联结
例1:查找商品表中商品名称和相应供应商的名字等。
select vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id
例2:讲解子查询时有一个问题是列出订购物品TNT2的所有客户信息,这一问题也可以用多表联结来解决。
子查询:
SELECT cust_id,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'
注意:实际使用时究竟子查询性能好还是联结好可以测试选择,与具体的数据量,索引设置等都有关系,不建议联结特别多的表。
3、笛卡儿积
如果例1中的where条件省略了将发生什么?
select vend_name,prod_name,prod_price from vendors,products
将返回第一个表的行数乘以第二个表的行数那么大的数据表,即两张表的结果两两组合的所有情况都会给出,是没有意义的。
4、内联结
内联结可以替代例1中的等值联结,而且更有助于展示联结关系,语法如下:
select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id=products.vend_id