11.联结表---SQL

说明:使用交互式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、表
中数据量、是否存在索引或键等条件的影响。因此,有必要试验不同的选择机制,找出最适合具体情况的方法。

时间: 2024-12-28 13:03:57

11.联结表---SQL的相关文章

数据库9:联结表 高级联结 组合查询 全文本搜索

第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分.   外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系. 好处:供应商信息不重复,不浪费空间和时间,方便日后修改,一个表信息改动不影响另一个表的信息 联结是一种机制,使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行.   创建联结          

SQL学习之联结表的使用

1.简介:"联结(join)表"是SQL最强大的功能之一.联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分! 在能够有效的使用联结前,必须了解关系表以及关系型数据库设计的一些基础知识. 2.关系表 下面通过一个列子来理解关系表. 有一个包含产品目录的数据库表,其中每类物品占一行.对于每一种物品,要存储的信息包括产品描述.价格以及生产该产品的供应商.关于供应商,现在一个供应商生产多个产品,那么在何处存储供应商名.地址.联系方式等供应商

SQL必知必会 笔记 第十二章 联结表

12.1联结 SQL最强大的功能之一即是在数据查询的执行中联结(join)表. 12.1.1关系表 相同数据出现多次绝不是一件好事,此因素是关系数据库设计的基础.关系表的设计就是要保证把信息分解成多个表,一类数据一个表.各表通过某些常用的值(即关系设计中的关系(relational))互相关联. 可伸缩性(scale):能够适应不断增加的工作量而不失败.设计良好的数据库或应用程序称之为可伸缩性好(scale well). 12.1.2为什么要使用联结 如果数据存储在多个表中,怎样用单条SELEC

MYSQL必知必会读书笔记 第十五和十六章 联结表

为什么要使用联结? 如果数据存储在多个表中,怎样使用单条SELECT语句检索出数据?答案就是使用联结.简单地说,可以联结多个表返回一组输出,联结在运行时关联表中正确的行. 1.创建联结 SELECT vend_name,prod_name,prod_price from vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name; 注意:在引用列可能出现二义性时,必须使用完全限定列名.

第十五章联结表

1.相同数据出现多次不是一件好事,此因素是关系型数据库设计的基础.关系表的设计就是要保证把信息分解成多个表,一类数据一个表.各表通过某些常用的值互相关联. 2.外键:外键为某个表的一列,它包含另一个表的主键值,定义了两个表之间的关系. 3.联结是一种机制,用来在一条select语句中关联表. 4.基于两个表之间的相等测试,这种联结也称为内部联结 5.sql对一条select语句可以联结的表的数目没有限制 注意点:不要联结不必要的表,联结的表越多,性能下降的越厉害 6.笛卡尔积: 由没有联结条件的

MySQL联结表

联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结表.而联结表是基于关系表.理解关系表如下,假如由同一供应商生产的多种物品,在数据库中需要存储产品信息,而在产品信息的这一行不存储供应商信息,因为这些产品的供应商是同一个,所以在产品信息这一行里记录一个唯一的供应商id就可以,供应商信息单独的存储一个表,并且也用为一个的id记录.这样,产品表与供应商表就通过 共同的供应商id连接起来了.如下表所示: 在vendors表中,vend_id称为主键,products表中的vend_id为外键.

第十五章 联结表

学习目标: 了解什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句. 联结: SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表. 关系表: 关系表的设计就是要保证把信息分解成多个表,一类数据 一个表.各表通过某些常用的值(即关系设计中的关系(relational))互相关联. 外键(foreign key)外键为某个表中的一列,它包含零一个表的主键值,定义了两个表之间的关系. 可伸缩性(scale)能够适应不不断增加的工作量而不失败.设计良好的数据库或应用程序称

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

PowerDesigner如何导出建表sql脚本(转)

1 按照数据库类型,切换数据库. Database-> Change Current DBMS... 2 生成sql脚本 Database -> Database Generation 的Preview选项卡 点击保存按钮,保存产生的sql脚本到本地. [注意]: 1 本人使用的powerDesigner是15.2版本. 2 产生出的sql脚本一般会有drop table的语句,这些语句在运行时可以不要,以防报出表不存在的错误. PowerDesigner如何导出建表sql脚本(转),布布扣,