版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaoxd200808501/article/details/78405344
说明:本文所使用的数据库样例表创建脚本下载地址:https://github.com/zhaoxd298/mysql_scripts
如果要检索的数据存储在多个表中,如何用单条SELECT语句检索出想要的数据?
答案是使用联结。联结是一种机制,用来在一条SELECT语句中关联表。联结实际在数据库中是不存在的,联结由MySQL根据需要建立,它存在于查询的执行当中。
一、创建联结
下面例子为通过联结检索供应商ACME的所有产品:
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id AND vend_name = 'ACME';
执行结果:
在该例子中通过WHERE子句正确的联结了两个表。第一个联结条件“vendors.vend_id = products.vend_id”指示MySQL匹配vendors表中的vend_id和products表中的vend_id。第二个联结条件“vend_name = ‘ACME’”过滤出供应商ACME的产品。
WHERE子句的重要性:
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行匹配,WHERE子句作为过滤条件,它只匹配给定条件(这是是联结条件)的行。
内部联结
上面例子所用的联结称为等值联结,它是基于两个表之间的相等测试。这种联结也称为内部联结。对于这种联结可以使用稍微不同的语法来明确指定联结的类型,下面的SELECT语句返回与前面例子完全相同的数据:
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id AND vend_name = 'ACME';
执行结果:
二、联结多个表
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 = 20005;
执行结果:
这里FROM子句列出了3个表,WHERE子句定义了两个联结条件,而第三个联结条件用来过滤出订单20005中的物品。