《SQL必知必会(第4版》读书笔记第12课

第12课 联结表

12.1 使用联结前,必须先了解关系表及关系数据库设计的基础知识。

相同的数据出现多次绝对不是好事,一类数据一个表,它们通过某些共同的值互相联结。比如:一张表Vendors存储供应商信息,一张表Products存储产品信息。

好处是:供应商信息不重复,不会浪费时间和空间;供应商信息变动,可以只更新Vendors表中的单个记录,相关表中的数据不变;由于数据不重复,数据一致,使得处理数据和生成报表更简单。

因此关系数据库的可伸缩性(scale well)远比非关系数据库要好。

我们在整理银行流水的时候,基于excel,常用的表格设计是一张表存放清单(人员信息+银行信息),另一张表存放合并的流水。有的同事喜欢设计多个表,一个表存放人员信息,一个表存放银行信息,一个表存放纸质账户清单,一个表存放电子账户清单。同一个人的信息被拆分成多张表,容易导致重复工作。同一类信息应该存放于一张表中,与关系数据表的设计思路应该是一致的。

引用完整性表示DBMS强制实施数据完整性规则,指示数据库出现合法数据(有效数据),这些规则一般由提供了界面的DBMS管理。

12.2 创建联结

等值联结(equijoin)

SELECT vend_name,prod_name,prod_price

FROM Vendors, Products

WHERE Vendors.vend_id=Products.vend_id;

完全限定列名 表名.列名 用句点隔开

若没有WHERE子句,即没有联结条件的表关系返回的结果为笛卡儿积(cartesian product),结果行数为第一个表中的行数乘以第二个表中的行数,也称为叉联结(cross join)

内联结(inner join)

SELECT vend_name,prod_name,prod_price

FROM Vendors inner join Products (ANSI SQL规范首选语法)

ON Vendors.vend_id=Products.vend_id;

联结多个表

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;

警告:联结中表的最大数目

虽然 SQL 本身不限制每个联结约束中表的数目,但实际上许多 DBMS 都有限制。请参阅具体的 DBMS 文档以了解其限制。

比较嵌套与联结:

语法一:

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 OrderItems.order_num = Orders.order_num

AND prod_id = 'RGAN01';

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181113G1U7FE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励