SQL语言——联结表
1 联结
SQL最强大的功能之一就是能在数据检索查询的执行中联结(join) 表。联结是利用SQL的
SELECT能执行的最重要的操作,很好地理解联结 及其语法是学习SQL的一个极为重要的组成部
分。
1.1 关系表
理解关系表的最好方法是来看一个现实世界中的例子。
假如有一个包含产品目录的数据库表,其中每种类别的物品占一行。 对于每种物品要存储的信息包括产品描述和价格,以及生产该产品的供 应商信息。
现在,假如有由同一供应商生产的多种物品,那么在何处存储供应 商信息(如,供应商名、地址、联系方法等)呢?将这些数据与产品信 息分开存储的理由如下。
因为同一供应商生产的每个产品的供应商信息都是相同的,对每 个产品重复此信息既浪费时间又浪费存储空间。
如果供应商信息改变(例如,供应商搬家或电话号码变动),只需 改动一次即可。
如果有重复数据(即每种产品都存储供应商信息),很难保证每次 输入该数据的方式都相同。不一致的数据在报表中很难利用。
关键是,相同数据出现多次决不是一件好事,此因素是关系数据库 设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据 一个表。各表通过某些常用的值(即关系设计中的关系(relational))互 相关联。
在这个例子中,可建立两个表,一个存储供应商信息,另一个存储 产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供 应商具有唯一的标识。此标识称为主键(primary key)(在第1章中首次 提到),可以是供应商ID或任何其他唯一值。
products表只存储产品信息,它除了存储供应商ID(vendors表的主 键)外不存储其他供应商信息。vendors表的主键又叫作products的外键, 它将vendors表与products表关联,利用供应商ID能从vendors表中找出 相应供应商的详细信息。
1.2 为什么要使用联结
正如所述,分解数据为多个表能更有效地存储,更方便地处理,并 且具有更大的可伸缩性。但这些好处是有代价的。
如果数据存储在多个表中,怎样用单条SELECT语句检索出数据? 答案是使用联结。简单地说,联结是一种机制,用来在一条SELECT 语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返 回一组输出,联结在运行时关联表中正确的行。
15.2 创建联结
联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。 请看下面的例子:
我们来考察一下此代码。SELECT语句与前面所有语句一样指定 要检索的列。这里,最大的差别是所指定的两个列(prod_name 和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。
现在来看FROM子句。与以前的SELECT语句不一样,这条语句的FROM 子句列出了两个表,分别是vendors和products。它们就是这条SELECT 语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句 指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
可以看到要匹配的两个列以 vendors.vend_id 和 products. vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id, 则MySQL不知道指的是哪一个(它们有两个,每个表中一个)。
(完全限定列名 在引用的列可能出现二义性时,必须使用完 全限定列名(用一个点分隔的表名和列名)。如果引用一个 没有用表名限制的具有二义性的列名,MySQL将返回错误。)
2.1 WHERE子句的重要性
利用WHERE子句建立联结关系似乎有点奇怪,但实际上,有一个很充 分的理由。请记住,在一条SELECT语句中联结几个表时,相应的关系是 在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进 行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做 的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为 过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管 它们逻辑上是否可以配在一起。
这样会导致笛卡尔积 即由没有联结条件的表关系返回 的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘 以第二个表中的行数。
2.2 内部联结
目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的 相等测试。这种联结也称为内部联结。其实,对于这种联结可以使用稍 微不同的语法来明确指定联结的类型。下面的SELECT语句返回与前面例 子完全相同的数据
此语句中的SELECT与前面的SELECT语句相同,但FROM子句不 同。这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE 子句给出。传递给ON的实际条件与传递给WHERE的相同
2.3 联结多个表
SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结 的基本规则也相同。首先列出所有表,然后定义表之间的关系。例如:
此例子显示编号为20005的订单中的物品。订单物品存储在 orderitems表中。每个产品按其产品ID存储,它引用products 表中的产品。这些产品通过供应商ID联结到vendors表中相应的供应商, 供应商ID存储在每个产品的记录中。这里的FROM子句列出了3个表,而 WHERE子句定义了这两个联结条件,而第三个联结条件用来过滤出订单 20005中的物品
SQL语言——联结表相关推荐
- mysql查询表变量_MySQL 之SQL语言、表库操作、查询及变量精讲
SQL语言 1. SQL语言组成部分 DDL:定义语言 (create.drop.alter) DML:操作语言 (insert.delete.update.select) DCL: 控制语言 (gr ...
- SQL语言多表关联查询
新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...
- 用SQL语言建表,课1
--删除表 --drop table teachers; --创建表 create table teachers ( tno varchar2(6) not null, tname varchar2( ...
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图
数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...
- sql 两个表列包含_Oracle数据库扩展语言PL/SQL之运算符
[本文详细介绍了Oracle数据库扩展语言PL/SQL的运算符,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL 语言有丰富的内置 ...
- SQL语言之关系运算与多表操作(五)
关系代数 SQL语言:并运算UNION, 交运算INTERSECT, 差运算EXCEPT. 基本语法形式: 子查询{ Union [ALL] |Intersect [ALL]|Except [ALL] ...
- 在EXCEL中使用SQL语言对工作表进行操作
选中第一份表格右键,选择定义名,第二份表也如此. 选择菜单中的"数据",再选"其他来源",再选最后一个,从MICROSOFT QUERY 再在弹出的窗口选择EX ...
- 《SQL必知必会》第十三课 创建高级联结表 使用不同类型的联结 使用带聚集函数的联结 使用联结时应注意的问题
第十三课 创建高级联结表 #使用表别名的原因 #不同的联结类型以及每类联结所使用的语法 #如何与联结一起使用聚集函数 #使用联结时的注意问题 一.使用表别名 [1]前面(第七课)介绍使用别名引用被检索 ...
最新文章
- 油品调和计算软件_油品调合利器——中控supBlend油品在线优化调合解决方案
- Azure Arc 正式商用、Power Platform+GitHub 世纪牵手,一文看懂 Ignite 2020
- HDU-4456 Crowd 二维树状数组+坐标转换
- MAC Android Studio SDK 无法更新问题
- Spring框架-事务管理注意事项
- 网络延长器分为哪几类?其应用领域有哪些?
- 深入剖析Redis RDN持久化机制
- bootstrap中的模态框(modal,弹出层)
- OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
- 关于前端开发,你真的了解吗?
- 我做PM(项目经理)这段时间...
- 解决关于打开plist文件乱码问题,plist转换为xml文件的txt文件!
- har文件分析http_如何使用HAR文件分析一段时间内的性能
- 黑马程序员Python教程——Python从入门到精通教程
- 报考上传照片时显示服务器错误,报考上传照片所遇问题及解决方法(转载)
- 美团网副总裁王慧文:所谓“农村包围城市”是一个误解
- 前端通过后端返回的url下载图片方法
- Linux环境go项目启动提示/usr/bin/ld: cannot find -lxxx
- 视频画面裁剪怎么弄?分享几个实用技巧
- aws saa是什么缩写?aws saa认证考察什么?