MySQL子查询
操作系统:ubuntu 18.04
mysql版本:8.0
创建:2020/6/27
修改:2020/6/27
使用的演示表:
users表存储用户信息
orders表存储用户的订单,一个用户可以有多个订单
order_items表存储订单项
利用子查询过滤
在下面的例子中,MySQL实际执行了三条SELECT语句。先执行最内层的SELECT语句,将查询的结果提供给外层的SELECT语句使用。最外层的SELECT返回所需的数据。
-- 查询购买了 长笛 的用户
SELECT *
FROM users
WHERE userId IN (
SELECT userId
FROM orders
WHERE orderId IN (
SELECT orderId
FROM order_items
WHERE `name` = '长笛'
)
);
-- 查询userId最小的用户的信息
SELECT *
FROM users
WHERE userId = (
SELECT MIN(userId)
FROM users
);
作为计算字段
下面的查询先执行外部查询查询到所有用户,子查询再为检索出来的每个用户计算订单数,所以子查询一共执行了6次,因为一共查询出来6个用户。
涉及外部查询的子查询被称为相关查询,在下面的查询中,子查询条件中userId前加了表名限制,如果不加表名限制,则会认为两个userId都是orders表中的,在会产生混淆的地方都应该加表名限制。
-- 查询用户的订单数量
SELECT name,
(
SELECT COUNT(*)
FROM orders
WHERE orders.userId = users.userId
) AS num
FROM users;
子查询作为临时表
下面的例子中选取了orders表中的两列形式临时表,然后将临时表与users表联结。在这里子查询查询了多个列,根据不同的使用情况子查询也是可以查询多个列的。
-- 选取orders表中的orderId, userId列形成临时表
SELECT u.name, t.*
FROM users AS u, (
SELECT orderId, userId
FROM orders
) AS t
WHERE u.userId = t.userId;