联结表
2015-10-21 16:55
155 查看
12.1.1 关系表
理解关系表,最好是来看个例子。有一个包含产品目录的数据库表,其中每类物品占一行。对于每一种物品,要存储的信息包括产品描述、价格,以及生产该产品的供应商。
现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:
同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;
如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修改一次即可;
如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。
关键是,相同的数据出现多次决不是一件好事,这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联(所以才叫关系数据库)。
在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。
Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识称为主键(primary key),可以是供应商ID或任何其他唯一值。
等值联结又称为内联结。
13.2 使用不同类型的联结迄今为止,我们使用的只是内联结或等值联结的简单联结。现在来看三种其他联结:自联结(self-join)、自然联结(natural join)和外联结(outer join)。
13.2.1 自联结
如前所述,使用表别名的一个主要原因是能在一条SELECT语句中不止一次引用相同的表。下面举一个例子。
提示:用自联结而不用子查询
自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查询语句。虽然最终的结果是相同的,但许多DBMS处理联结远比处理子查询快得多。应该试一下两种方法,以确定哪一种的性能更好。
提示:用自联结而不用子查询
自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查询语句。虽然最终的结果是相同的,但许多DBMS处理联结远比处理子查询快得多。应该试一下两种方法,以确定哪一种的性能更好。
13.2.2 自然联结无论何时对表进行联结,应该至少有一列不止出现在一个表中(被联结的列)。标准的联结(前一课中介绍的内联结)返回所有数据,相同的列甚至多次出现。自然联结排除多次出现,使每一列只返回一次。
怎样完成这项工作呢?答案是,系统不完成这项工作,由你自己完成它。自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。下面举一个例子:
输入▼
SELECT C.*, O.order_num, O.order_date,
OI.prod_id, OI.quantity, OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';
提示:Oracle中没有AS
Oracle用户应该记住去掉AS。
分析▼
在这个例子中,通配符只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来。
事实上,我们迄今为止建立的每个内联结都是自然联结,很可能永远都不会用到不是自然联结的内联结。
相关文章推荐
- POJ 3253 Fence Repair (霍夫曼编码 + 最小堆)
- Memcache,Redis,MongoDB 数据库 缓存 mysql
- Android 高仿IOS加载数据时圆形的进度条
- fullpage.js与fullpage详解
- Ubuntu14.04使用VNC解决gnome-session-is-accelerated: No composite extension
- jquery end详解
- java判断操作系统是windows还是linux
- jquery end详解
- jquery end详解
- 从SVN中检出的项目-查看项目对应的SVN路径方法
- HDU 4932 Miaomiao's Geometry(BestCoder Round #4)
- 【转】CentOS 6 服务器安全配置指南
- JQuery和JavaScript中功能相似函数总结和比较
- android修改checkbox样式
- 转:visualvm监控远程机器上的Java程序
- springmvc视图解析顺序2
- mysql int(11)
- 图解SQL的各种连接join
- FreeRadius客户端基础配置及测试
- 河北大学工商学院IT志趣汇管理系统(目录)