【MySQL笔记】4 子查询与创建联结

MySQL笔记基于教材,笔记中用到的数据库可以点击该链接下载

子查询 Subquery

  • 在多张表间查询相关的信息时,可以将SELECT语句嵌套起来用;
  • 子查询经常与WHERE子句里的IN一起使用;
  • 列必须匹配:在WHERE子句中使用子查询,应保证SELECT语句和WHERE语句有相同数目的列。通常WHERE使用单个列,而SELECT也返回单个列。
查询购买了产品号(prod_id)为TNT2的产品的顾客信息

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_state, 
       (SELECT COUNT(*)
        FROM orders
        WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

联结 Join

Terminology

  • 外键 (foreign key):外键为某个表中一列,它包含另外一个表的主键值,定义了两个表之间的关系。
  • 可伸缩性 (scale):能够适应不断增加的工作量而不失效。设计良好的数据库或应用程序称之为可伸缩型好 (scale well)。
  • 关系数据库将相关的数据分多个表存储,用各表的主键联系。这样的数据库维护方便,处理灵活。因此关系数据库的可伸缩性要远优于非关系数据库。

Application

在MySQL中可以通过WHERE子句联结两个或更多表。在FROM子句中给出要联结的所有表,在WHERE子句中建立联结的关系。

查找所有供应商生产的所有产品

SELECT vend_name, prod_name, prod_price #列vend_name来自vendors, 后两列来自products
FROM vendors, products #联结了表vendors和表products
WHERE vendors.vend_id = products.vend_id #关系是两个表中行的vend_id相同
ORDER BY vend_name, prod_name;

上述联结由特定列的相等关系来联结行。这种联结被称为"等值联结" (equijoin)。它基于两个表之间的相等测试。这种联结也称为"内部联结"。

实际上,这种联结有专门的语法。

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products #在FROM子句中用INNER JOIN指明联结类型
ON vendors.vend_id = products.vend_id #在下一行用ON建立联结

也可以多个表联结。只要把关系在WHERE子句中写清楚就可以。


MySQL系列笔记

  • 1 MySQL入门
  • 2 SELECT语句拓展
  • 3 MySQL函数与SELECT的更多功能
  • 4 子查询与创建联结
  • 5 组合查询

你可能感兴趣的:(【MySQL笔记】4 子查询与创建联结)