写“复杂 SQL 查询”通常不是一步写出来的,而是先拆问题、再分层写、最后优化。下面我用一套实用方法 + 模板 + 示例,帮你建立写复杂 SQL 的思路。
在写之前,问自己:
不要一上来就写超长 SQL。
推荐顺序:
SELECT o.order_id, u.user_name
FROM orders o
JOIN users u ON o.user_id = u.id;
常见:
SELECT *
FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE age > 30
);
✅ 适合:
比子查询清晰 10 倍:
WITH high_value_users AS (
SELECT user_id
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 10000
)
SELECT *
FROM users u
JOIN high_value_users h ON u.id = h.user_id;
✅ 优点:
SELECT user_id, COUNT(*) AS order_cnt
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;
⚠️ HAVING 是“分组后过滤”
SELECT
user_id,
order_date,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY order_date DESC
) AS rn
FROM orders;
常见用途:
SELECT
user_id,
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_cnt
FROM orders
GROUP BY user_id;
查询每个用户最近一次订单的金额,以及总订单数
WITH user_orders AS (
SELECT
user_id,
amount,
order_date,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY order_date DESC
) AS rn
FROM orders
),
user_summary AS (
SELECT
user_id,
COUNT(*) AS total_orders
FROM orders
GROUP BY user_id
)
SELECT
u.user_id,
u.user_name,
o.amount AS last_order_amount,
s.total_orders
FROM users u
JOIN user_orders o ON u.user_id = o.user_id AND o.rn = 1
JOIN user_summary s ON u.user_id = s.user_id;
✅ 用 CTE 而不是层层嵌套
✅ 先写“能跑的”,再优化
✅ 给表和字段起别名
✅ 每一步用 LIMIT 看数据
✅ 注意 NULL 和 JOIN 类型
如果你愿意,可以:
我可以直接帮你写一条复杂 SQL 并讲解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。