说明:使用交互式DBMS工具
重要的是,要理解联结不是物理实体。换句话说,它在实际的数据库表中并不存在。DBMS会根据需要建立联结,它在查询执行期间一直存
在。

一、等值语法:SELECT 字段 FROM 表1,表2 WHERE 表1.字段=表2.字段


SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

分析▼
我们来看这段代码。SELECT语句与前面所有语句一样指定要检索的列。这里最大的差别是所指定的两列(prod_name和prod_price)在一个表
中,而第三列(vend_name)在另一个表中。
现在来看FROM子句。与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表:Vendors和Products。它们就是这条SELECT语句联结
的两个表的名字。这两个表用WHERE子句正确地联结,WHERE子句指示DBMS将Vendors表中的vend_id与Products表中的vend_id匹配起来。
可以看到,要匹配的两列指定为Vendors.vend_id和Products.vend_id。这里需要这种完全限定列名,如果只给出vend_id,DBMS就不知道指的
是哪一个(每个表中有一个)。从前面的输出可以看到,一条SELECT语句返回了两个不同表中的数据。

警告:完全限定列名(用表名点出列)
就像前一课提到的,在引用的列可能出现歧义时,必须使用完全限定列名(用一个句点分隔表名和列名)。如果引用一个没有用表名限制的
具有歧义的列名,大多数DBMS会返回错误

警告:不要忘了WHERE子句
要保证所有联结都有WHERE子句,否则DBMS将返回比想要的数据多得多的数据。同理,要保证WHERE子句的正确性。不正确的过滤条件
会导致DBMS返回不正确的数据

笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

提示:叉联结
有时,返回笛卡儿积的联结,也称叉联结(cross join)。

二.内联结:SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.字段=表2.字段


目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内联结(inner join)。其实,可以对这种联结
使用稍微不同的语法,明确指定联结的类型。

SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

分析▼
此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是以INNER JOIN指定的部分FROM子句。在使用
这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。

说明:“正确的”语法
ANSI SQL规范首选INNER JOIN语法,之前使用的是简单的等值语法。其实,SQL语言纯正论者是用鄙视的眼光看待简单语法的。这就是
说,DBMS的确支持简单格式和标准格式,我建议你要理解这两种格式,具体使用就看你用哪个更顺手了。

三、联结多个表


SQL不限制一条SELECT语句中可以联结的表的数目。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。

SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

警告:性能考虑
DBMS在运行时关联指定的每个表,以处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能
下降越厉害。
警告:联结中表的最大数目
虽然SQL本身不限制每个联结约束中表的数目,但实际上许多DBMS都有限制。请参阅具体的DBMS文档以了解其限制。

提示:多做实验
可以看到,执行任一给定的SQL操作一般不止一种方法。很少有绝对正确或绝对错误的方法。性能可能会受操作类型、所使用的DBMS、表
中数据量、是否存在索引或键等条件的影响。因此,有必要试验不同的选择机制,找出最适合具体情况的方法。

最新文章

  1. ExecutorService与ThreadPoolTaskExecutor
  2. webapp之meta
  3. Struts2环境搭建
  4. My97DatePicker 日期控制,开始时间不能>结束时间,结束时间不能<开始时间
  5. Newton-Raphson算法简介及其R实现
  6. wordpress搬家到本地URL修改问题
  7. SQL 2012 镜像 图解(解决1418)
  8. 初学JDBC,JDBC工具类的简单封装
  9. 序列for循环语句
  10. 汉洛塔递归实现的思考(C语言)
  11. VC6.0 显示代码行号和WndTab插件
  12. MySql命令行命令和SQL语句
  13. HDU3791二叉搜索树(二叉树)
  14. cocos2d-x 游戏开发之有限状态机(FSM) (三)
  15. 普通用户登陆系统显示 -bash-4.1$
  16. spring cloud(五)熔断监控Hystrix Dashboard和Turbine
  17. APP包打包签名步骤
  18. ActiveMQ(3)---ActiveMQ原理分析之消息持久化
  19. windows系统下发布python模块到pypi
  20. windows 解放鼠标快捷键

热门文章

  1. Rabbitmq+Nginx+keepalived高可用热备
  2. ansible mysql模块的使用今年
  3. 分享知识-快乐自己:Excel快速导入Oracle 数据库
  4. 动态创建TeeChart的简便方法
  5. codeforces 658D D. Bear and Polynomials(数学)
  6. MySQL条件判断处理函数_20160925
  7. windows下VisualStudio和QtCreator搭建Qt开发环境
  8. fabric优先级,进程管理
  9. NLB
  10. PDF,IMAGE,HTML,WORD,EXCEL 互操作