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系列笔记
网友评论