MySQL子查询 嵌套查询

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

有三张表分别如下:

  1. customers: 存储顾客信息

MySQL子查询 嵌套查询_第1张图片

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

MySQL子查询 嵌套查询_第2张图片

  1. orders:存储订单号和顾客id

 MySQL子查询 嵌套查询_第3张图片

 

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

 

子查询训练

训练1

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

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

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

SELECT order_num FROM orderitems

WHERE prod_id='TNT2';

MySQL子查询 嵌套查询_第4张图片

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

SELECT cust_id FROM orders

WHERE order_num

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

MySQL子查询 嵌套查询_第5张图片

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'));

MySQL子查询 嵌套查询_第6张图片

这样就得到结果啦~

子查询一般与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;

MySQL子查询 嵌套查询_第7张图片

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

你可能感兴趣的:(MySQL)