MySQL学习笔记(二) 联结表

140 阅读2分钟

联结

联结是在数据检索中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;

输出: