联结
联结是在数据检索中SELECT的一个最重要的操作。在理解何为联结之前,先了解一些作为关系表及数据库设计的基础知识。
关系表
关系表是两个表之间存在的关联关系。
假如说,现在我们有两张表。一张表是表示供应商的表,另一张表是产品的表。那么应该如何串联起来呢?
我们可以在供应商的表里面给每个供应商一个唯一标识ID,作为供应商的主键。然后在产品的表里面,有一个字段专门用来表示供应商的ID,那么这个字段就称为外键。通过这种方式,就可以把两个表串联起来。
这种好处可以减少数据重复出现,且更方便对供应商和产品的数据进行修改。可伸缩性更好。
像这样把数据分解为多个表确实可以更有效地存储,但是要想能够检索出来,就要使用联结。
联结:可以用一条SELECT语句关联表,联结多个表返回一组输出。
创建联结
我们这里做个简单的介绍。
WHERE子句
基本表介绍
供应商表vendors:
产品表products:
输入:
SELECT vend_name, prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name,prod_name;
输出结果:
通过该语句,可以从vendor、products两个表中检索出其vend_id相同的数据。是一种简单的联结的方式。
笛卡尔积
笛卡尔积:由没有连接条件的表关系返回的结果为笛卡尔积。 输入同上,把WHERE子句去掉。 输入:
SELECT vend_name, prod_name,prod_price
FROM vendors,products
ORDER BY vend_name,prod_name;
输出结果:
(仅展示一部分)
内部联结
以上使用WHERE子句的联结,称为等值联结,是基于两个表之间的相等测试,也可以称为内部联结。 以上的语句可以使用以下的JOIN语句替代:
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
输出结果相同。
ANSI SQL规范推荐使用以上语句。
联结多个表
SQL对于一条SELECT语句可以联结出来的表的数目并没有限制。这里我们新增一个orderitems表。
订单详情表orderitems:
联结多个表示例: 输入:
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 = 20005;
输出: