SQL 必知必会 Chapter 12 —— 联结表


typora-copy-images-to: SQL 必知必会

文章目录

    • typora-copy-images-to: SQL 必知必会
  • SQL 必知必会 Chapter 12 联结表
      • 12.1 联结
      • 12.2 创建联结
      • 12.3 小结

SQL 必知必会 Chapter 12 联结表

12.1 联结

  • 相同的数据出现多次决不是一件好事,这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表,一类数据一个表

  • 各表通过某些共同的值互相关联

  • 可以增强可伸缩性好

  • 如果数据存储在多个表中,如何用一条select语句就检索出数据?

  • 联结是一种机制,用来在一条 SELECT 语句中关联表

12.2 创建联结

# 指定要检索的列,从两个表中,列明两表关系
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
#  WHERE 子句指示 DBMS将 Vendors 表中的 vend_id 与 Products 表中的 vend_id 匹配起来
# 需要使用到完全限定,如果引用的列可能出现歧义时

# 换一种语法,检索出相同的内容
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

SQL 必知必会 Chapter 12 —— 联结表_第1张图片

  • 笛卡尔积:由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数,又称为叉联结

  • 要保证所有联结都有 WHERE 子句,否则 DBMS将返回比想要的数据多
    得多的数据。同理,要保证 WHERE 子句的正确性。不正确的过滤条件
    会导致 DBMS返回不正确的数据

  • 目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相
    等测试。这种联结也称为内联结(inner join)

# 联结多个表
# 首先列出所有表,然后定义表之间的关系
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;

SQL 必知必会 Chapter 12 —— 联结表_第2张图片

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'));
# 用子循环执行复杂的select操作

# 使用联结完成相同的查询
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';

12.3 小结

  • 联结是 SQL中一个最重要、最强大的特性,有效地使用联结需要对关系
    数据库设计有基本的了解。本课在介绍联结时,讲述了一些关系数据库
    设计的基本知识,包括等值联结(也称为内联结)这种最常用的联结。
    下一课将介绍如何创建其他类型的联结

你可能感兴趣的:(SQL,必知必会,Edition,4th)