MySQL子查询嵌套查询
发布日期:2021-05-07 00:50:59 浏览次数:18 分类:精选文章

本文共 1092 字,大约阅读时间需要 3 分钟。

子查询:嵌套在其他查询中的查询。

有三张表分别如下:

customers: 存储顾客信息

\

orderitems:只存储订单信息,无客户信息

\

orders:存储订单号和顾客id

\

注意:一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。

子查询训练:

训练1:

查询买了商品为’TNT2’的顾客信息

子查询中涉及3张表的订单。因此分三步,1. 在orderitems里找出TNT2的订单号;2. 在orders里找出第一步找出的订单号对应的客户id;3. 在customers中找出第二步对应客户的所有信息。

1. 在orderitems里找出TNT2的订单号

SELECT order_num FROM orderitems

WHERE prod_id='TNT2';

\

2. 在orders里找出第一步找出的订单号对应的客户id

SELECT cust_id FROM orders

WHERE order_num

IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');

\

3. 在customers中找出第二步对应客户的所有信息

SELECT * FROM customers

WHERE cust_id

IN (SELECT cust_id FROM orders WHERE order_num IN

(SELECT order_num FROM orderitems WHERE prod_id='TNT2'));

\

这样就得到结果啦~

子查询一般与IN操作符结合使用,也可用=><等。

另外,子查询还可以用于计算字段。

训练2:

如,想要查询每个客户的订单数

分步思考:1. 查询某个客户的订单数;2. 某个客户改为所有客户。

1. 查询某个客户的订单数

SELECT COUNT(*) AS orders1 FROM orders WHERE cust_id =10001;

\

2. 某个客户改为所有客户

SELECT cust_name, cust_state,

(SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id)

AS orders1

FROM customers

ORDER BY cust_name;

\

注意:当多个表都拥有同样的列名如cust_id时,一定要完全限定列名。

上一篇:机器学习-白板推导系列笔记(十四)-HMM
下一篇:MySQL子查询 嵌套查询

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月26日 13时14分25秒