SQL必知必会 第12课 联结表
12.1 联结
SQL中最强大的功能之一就是在数据查询的执行中联结表。
关系表
关系表的设计就是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联。
为什么使用联结
联结是一种机制,用来在一条select语句中关联表,它可以将数据分解为多个表能更有效地存储,更方便地处理,并且伸缩性更好。
12.2 创建联结
# 创建联结
select vend_name, prod_name, prod_price
from vendors, products
where vendors.vend_id = products.vend_id;
这里所指定的两列(prod_name 和 prod_price)在一个表中,而第一列(vend_name)在另一个表中。
这两个表用where子句正确地联结。
where子句的重要性
在数据库表的定义中没有指示DBMS如何对表进行联结的内容,所以必须自己来完成这件事。在联结两个表时,要做的就是将第一个表中的每一行与第二个表中的每一行配对。
因此,要保证所有联结都有where子句,并且要保证where子句的正确性。
内联结
目前使用的联结为等值联结,基于两个表之间的相等测试。这种联结也叫内联结。
# 指定联结方式,查询结果同上
select vend_name, prod_name, prod_price
from vendors
inner join products on vendors.vend_id = products.vend_id;
联结多个表
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 = 20007;
# 列出订购物品RGAN01的所有顾客
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'));
# 列出订购物品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';
还没有评论,来说两句吧...