mysql必知必会-第15章 联结表

文章介绍了数据库中关系表的设计原则,强调了一类数据一个表并通过外键关联。联结(JOIN)用于在SELECT语句中结合多个表以检索数据。文中详细讲解了为何使用联结,如何创建不同类型的联结,如内部联结,并展示了联结多个表的示例。同时,提到了WHERE子句在过滤条件中的重要性和无联结条件时可能导致的笛卡尔积问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

15.1 联结(join)

15.1.1 关系表

关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。
外键:外键为某个表中的一列,它包含另一个表的主键值(唯一标识),定义了两个表之间的关系。
可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。

15.1.1 为什么要使用联结

如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
联结,用来在一条SELECT语句中关联表。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

15.2 创建联结

规定要联结的所有表以及它们如何关联。

SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id=products.vend_id
ORDER BY vend_name,prod_name;

**完全限定列名:**在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)

15.2.1 where子句的重要性

where子句做为过滤条件,它只包含那些匹配给定条件(联结条件)的行。没有where子句,第一个表中的每一行将与第二个表中的每一行匹配,而不管他们逻辑上是否可以配在一起。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT vend_name,prod_name,prod_price
FROM vendors,products
ORDER BY vend_name,prod_name;

15.2.2 内部联结

等值联结,基于两个表之间的相等测试
两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定,联结条件用特定的ON子句而不是where子句给出。

SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id=products.vend_id;

15.2.3 联结多个表

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;

使用联结/子查询的相同查询:

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='TNT2'));
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='TNT2';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值