第 12 章 联结表

本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的 SELECT 语句。

12.1 联结

SQL 最强大的功能之一就是能在数据查询的执行中联结表。
在这个例子中,可建立两个表,一个存储供应商信息,另一个存储产品信息。
Vendors 表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识(此标识称为主键),可以是供应商 ID 或任何其他唯一值。
Products 表只存储产品信息,它除了存储供应商 ID(Vebdors 表的主键)外不存储其他供应商信息。
利用 Vendors 表的主键将 Vendors 表与 Products 表关联,通过供应商 ID 从 Vendors 表中找出相应供应商的详细信息。
好处:

  • 供应商信息不重复,从而不浪费时间和空间
  • 如果供应商信息变动,可以只更新 Vendors 表中的单个记录,相关表中的数据不用改动
  • 由于数据无重复,这使得处理数据更简单
    这样就使得关系数据库的可伸缩性比非关系数据库要好。
    可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好

12.1.2 为什么要使用联结

如果数据存储在多个表中,怎么用单条 SELECTT 语句检索出数据?
使用联结。
使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

12.2 创建联结

例 1:

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

完全限定列名:在引用的列可能出现二义性时,必须使用完全限定列名(用一个句点分隔的表名和列名)

上面的例子中没有使用完全限定列名的原因是三个字段没有歧义,都是唯一的

12.2.1 WHERE 子句的重要性

在一条 SELECT 语句联结几个表时,相应的关系是在运行中构造的。
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一个配对
WHERE 子句作为过滤条件,它只包含那些匹配给定条件(联结条件)的行,如果没有 WHERE 子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起

12.2.2 内部联结

上面所用的联结称为等值联结,它基于两个表之间的相等测试,这种联结也称为内部联结。
其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型。
例 2:

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

12.2.3 联结多个表

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 = '2007';

回顾第 11 章中子查询的例子:

SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
    FROM Orders
    WHERE order_num IN (SELECT order_num
        FROM OrderItems
        WHERE prod_id = 'RGAN01'));

下面使用联结的相同查询:

SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id 
      AND Orders.order_num = OrderItems.order_num 
      AND prod_id = 'RGAN01';
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 什么是联结 为什么使用联结 如何编写使用联结的SELECT 语句。 1 联结 SQL 最强大的功能之一就是能在数据...
    曾经像素有点低阅读 125评论 0 0
  • 联结 联结(join)是SQL最强大功能之一。 关系表 看一个例子:假如有一个包含产品目录的数据库表,其中每种类别...
    WeirdoSu阅读 139评论 0 0
  • 连载的上一篇我们使用子查询来过滤数据、创建计算字段。但我们也发现使用子查询在性能方面的不足,尤其是在创建计算字段的...
    山药鱼儿阅读 565评论 0 8
  • 第1章 了解SQL 1.1 数据库基础 1.1.1 什么是数据库 数据库(database) 保存有组织的数据的容...
    _Cappuccino_阅读 11,767评论 0 1
  • 这一篇最主要是记录下命令,方便以后查找 使用Mysql 创建数据库 create database mysql_t...
    Treehl阅读 571评论 0 0