Z
ZHANK
实战技巧

常用查询模式

掌握 TOP N、分页、行转列、去重统计等常用模式

常用查询模式

有些查询需求反复出现——排行、分页、行转列、去重统计。掌握这些"模板查询"让你写 SQL 更快。

学完本章你将: 掌握 TOP N、分页、行转列、差集/交集。


TOP N —— 查前几名

sql
-- 年龄最大的 5 个人
SELECT * FROM users ORDER BY age DESC LIMIT 5;

-- 每个城市年龄最大的 1 个人(窗口函数)
SELECT name, city, age FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY age DESC) AS rn
    FROM users
) WHERE rn = 1;

行转列 —— CASE WHEN 聚合

sql
-- 每个城市各年龄段人数(行变列)
SELECT city,
    COUNT(CASE WHEN age < 18 THEN 1 END) AS 未成年,
    COUNT(CASE WHEN age BETWEEN 18 AND 60 THEN 1 END) AS 成人,
    COUNT(CASE WHEN age > 60 THEN 1 END) AS 老年
FROM users
GROUP BY city;

查差集 —— NOT EXISTS

sql
-- 查没有订单的用户
SELECT * FROM users u
WHERE NOT EXISTS (
    SELECT 1 FROM orders o WHERE o.user_id = u.id
);

-- 也可以用 LEFT JOIN + IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;

累计值 —— 窗口函数

sql
-- 每日注册人数的累计值
SELECT date, daily_count,
    SUM(daily_count) OVER (ORDER BY date) AS 累计
FROM daily_stats;