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语言——联结表相关推荐

  1. mysql查询表变量_MySQL 之SQL语言、表库操作、查询及变量精讲

    SQL语言 1. SQL语言组成部分 DDL:定义语言 (create.drop.alter) DML:操作语言 (insert.delete.update.select) DCL: 控制语言 (gr ...

  2. SQL语言多表关联查询

    新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...

  3. 用SQL语言建表,课1

    --删除表 --drop table teachers; --创建表 create table teachers ( tno varchar2(6) not null, tname varchar2( ...

  4. 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)

    数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...

  5. 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图

    数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...

  6. sql 两个表列包含_Oracle数据库扩展语言PL/SQL之运算符

    [本文详细介绍了Oracle数据库扩展语言PL/SQL的运算符,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL 语言有丰富的内置 ...

  7. SQL语言之关系运算与多表操作(五)

    关系代数 SQL语言:并运算UNION, 交运算INTERSECT, 差运算EXCEPT. 基本语法形式: 子查询{ Union [ALL] |Intersect [ALL]|Except [ALL] ...

  8. 在EXCEL中使用SQL语言对工作表进行操作

    选中第一份表格右键,选择定义名,第二份表也如此. 选择菜单中的"数据",再选"其他来源",再选最后一个,从MICROSOFT QUERY 再在弹出的窗口选择EX ...

  9. 《SQL必知必会》第十三课 创建高级联结表 使用不同类型的联结 使用带聚集函数的联结 使用联结时应注意的问题

    第十三课 创建高级联结表 #使用表别名的原因 #不同的联结类型以及每类联结所使用的语法 #如何与联结一起使用聚集函数 #使用联结时的注意问题 一.使用表别名 [1]前面(第七课)介绍使用别名引用被检索 ...

最新文章

  1. 油品调和计算软件_油品调合利器——中控supBlend油品在线优化调合解决方案
  2. Azure Arc 正式商用、Power Platform+GitHub 世纪牵手,一文看懂 Ignite 2020
  3. HDU-4456 Crowd 二维树状数组+坐标转换
  4. MAC Android Studio SDK 无法更新问题
  5. Spring框架-事务管理注意事项
  6. 网络延长器分为哪几类?其应用领域有哪些?
  7. 深入剖析Redis RDN持久化机制
  8. bootstrap中的模态框(modal,弹出层)
  9. OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
  10. 关于前端开发,你真的了解吗?
  11. 我做PM(项目经理)这段时间...
  12. 解决关于打开plist文件乱码问题,plist转换为xml文件的txt文件!
  13. har文件分析http_如何使用HAR文件分析一段时间内的性能
  14. 黑马程序员Python教程——Python从入门到精通教程
  15. 报考上传照片时显示服务器错误,报考上传照片所遇问题及解决方法(转载)
  16. 美团网副总裁王慧文:所谓“农村包围城市”是一个误解
  17. 前端通过后端返回的url下载图片方法
  18. Linux环境go项目启动提示/usr/bin/ld: cannot find -lxxx
  19. 视频画面裁剪怎么弄?分享几个实用技巧
  20. aws saa是什么缩写?aws saa认证考察什么?

热门文章

  1. python 通达信上传云端_云端同步的问题-通达信知识 -程序化交易(CXH99.COM)
  2. 张小龙2011年饭否日记
  3. YII Framework学习教程-用YIIC快速创建YII应用之二-2011-11-11
  4. RHCA第一天:环境搭建,访问命令行,简单命令
  5. 判断两个字符串是否互为变形词
  6. python怎么判断倍数_检查整数及其两倍数是否存在 python3
  7. Android移动游戏之崛起
  8. 5年内被辞退3次,35岁程序员该何去何从?百度,kotlin函数参数
  9. 如何在Keil uVision5建立飞思卡尔K60开发板的工程
  10. 网络营销涉及的137个名词