子查询
我是长安!子查询就是查询套查询,功能非常强大!
🎯 什么是子查询?
子查询是嵌套在另一个查询中的查询:
-- 外层查询
SELECT * FROM products
WHERE price > (
-- 内层查询(子查询)
SELECT AVG(price) FROM products
);
📝 子查询的位置
1. WHERE子句中
-- 查找价格高于平均价的商品
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- 查找买过iPhone的用户
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders
WHERE product_name LIKE '%iPhone%'
);
2. FROM子句中(派生表)
-- 先统计,再查询
SELECT category, avg_price
FROM (
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
) AS category_stats
WHERE avg_price > 100;
3. SELECT子句中
-- 查询用户及其文章数
SELECT
username,
(SELECT COUNT(*) FROM posts WHERE user_id = users.id) as post_count
FROM users;
🎮 实战例子
-- 查找销量最好的商品
SELECT name
FROM products
WHERE id IN (
SELECT product_id
FROM order_items
GROUP BY product_id
ORDER BY SUM(quantity) DESC
LIMIT 5
);
-- 查找没有订单的用户
SELECT * FROM users
WHERE id NOT IN (
SELECT DISTINCT user_id FROM orders
);
-- 等价于LEFT JOIN
SELECT u.* FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
长安建议:能用JOIN就用JOIN,性能通常更好!
📚 下一步
子查询很强大,但要注意性能!
继续学习视图!
长安的话:子查询要适度使用,复杂的子查询可能很慢!💡