第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';
领取专属 10元无门槛券
私享最新 技术干货