
本文共 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时,一定要完全限定列名。
发表评论
最新留言
关于作者
