-- CASE表达式
SELECT
name,
salary,
CASE
WHEN salary > 100000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END as salary_level
FROM employees;
-- 简单CASE
SELECT
product_type,
CASE product_type
WHEN 'A' THEN 'Type A'
WHEN 'B' THEN 'Type B'
ELSE 'Other'
END as type_description
FROM products;
-- 计数
SELECT count(*) FROM table; -- 总行数
SELECT count(DISTINCT column) FROM table; -- 不重复计数
-- 求和与平均
SELECT sum(salary) FROM employees;
SELECT avg(salary) FROM employees;
-- 最大最小值
SELECT max(salary) FROM employees;
SELECT min(salary) FROM employees;
-- 统计信息
SELECT stddev(salary) FROM employees; -- 标准差
SELECT variance(salary) FROM employees; -- 方差
(2)高级聚合函数
sql复制代码
-- 分组统计
SELECT
department,
count(*) as emp_count,
avg(salary) as avg_salary,
sum(salary) as total_salary
FROM employees
GROUP BY department;
-- 字符串聚合
SELECT
department,
string_agg(name, ', ') as employees
FROM employees
GROUP BY department;
-- 数组聚合
SELECT
department,
array_agg(name) as employees
FROM employees
GROUP BY department;
-- JSON聚合
SELECT
department,
json_agg(json_build_object('name', name, 'salary', salary)) as employees
FROM employees
GROUP BY department;
6. 窗口函数
(1)排名函数
sql复制代码
-- 行号、排名、密集排名
SELECT
name,
salary,
row_number() OVER (ORDER BY salary DESC) as row_num,
rank() OVER (ORDER BY salary DESC) as rank,
dense_rank() OVER (ORDER BY salary DESC) as dense_rank
FROM employees;
-- 分区排名
SELECT
department,
name,
salary,
rank() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
(2)前后值函数
sql复制代码
-- LAG和LEAD(访问前后行)
SELECT
date,
sales,
lag(sales) OVER (ORDER BY date) as prev_sales,
lead(sales) OVER (ORDER BY date) as next_sales
FROM sales_data;
-- FIRST_VALUE和LAST_VALUE
SELECT
date,
sales,
first_value(sales) OVER (ORDER BY date) as first_sales,
last_value(sales) OVER (ORDER BY date) as last_sales
FROM sales_data;
(3)累计和移动平均
sql复制代码
-- 累计计算
SELECT
date,
sales,
sum(sales) OVER (ORDER BY date) as cumulative_sum,
avg(sales) OVER (ORDER BY date) as cumulative_avg
FROM sales_data;
-- 移动平均
SELECT
date,
sales,
avg(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg_3
FROM sales_data;
-- 行转JSON
SELECT row_to_json(employees) FROM employees WHERE id = 1;
-- JSON聚合
SELECT
department,
json_agg(json_build_object('name', name, 'salary', salary)) as employees
FROM employees
GROUP BY department;
-- 查看查询计划
EXPLAIN SELECT * FROM large_table WHERE id = 1000;
EXPLAIN ANALYZE SELECT * FROM large_table WHERE id = 1000;
-- 查看表大小和索引
SELECT
schemaname,
tablename,
tableowner,
tablesize,
indexsize
FROM pg_tables
WHERE schemaname = 'public';
-- 查看长查询
SELECT
pid,
now() - pg_stat_activity.query_start AS duration,
query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
3. 实用管理查询
sql复制代码
-- 查看锁信息
SELECT
locktype,
relation::regclass,
mode,
granted
FROM pg_locks
WHERE relation = 'mytable'::regclass;
-- 查看连接数
SELECT
datname,
count(*) as connections
FROM pg_stat_activity
GROUP BY datname;
-- 查看表统计信息
SELECT
schemaname,
tablename,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch
FROM pg_stat_user_tables;