sql-explain
分析SQL查询执行计划并提供优化建议,支持PostgreSQL/MySQL/SQLite。
下载 518
提供 SELECT、JOIN、聚合、窗口函数等 SQL 语法快速参考。
openclaw skills install @terrycarter1985/sql-cheatsheet命令、参数、文件名以原文为准
SQL 查询和数据库操作的快速参考。
-- 选择所有列
SELECT * FROM table_name;
-- 选择特定列
SELECT column1, column2 FROM table_name;
-- 使用别名选择
SELECT column1 AS alias1, column2 AS alias2 FROM table_name;
-- 去重
SELECT DISTINCT column FROM table_name;
-- 限制结果数量
SELECT * FROM table_name LIMIT 10;
-- MySQL/PostgreSQL 带偏移量的 LIMIT
SELECT * FROM table_name LIMIT 10 OFFSET 20;
-- SQL Server TOP
SELECT TOP 10 * FROM table_name;-- 等于
SELECT * FROM table WHERE column = 'value';
-- 比较
SELECT * FROM table WHERE column > 100;
SELECT * FROM table WHERE column <= 50;
-- 多条件
SELECT * FROM table WHERE column1 = 'a' AND column2 > 10;
SELECT * FROM table WHERE column1 = 'a' OR column2 > 10;
-- IN 子句
SELECT * FROM table WHERE column IN ('a', 'b', 'c');
-- BETWEEN
SELECT * FROM table WHERE column BETWEEN 1 AND 100;
-- LIKE(模式匹配)
SELECT * FROM table WHERE column LIKE 'prefix%'; -- 以...开头
SELECT * FROM table WHERE column LIKE '%suffix'; -- 以...结尾
SELECT * FROM table WHERE column LIKE '%contains%'; -- 包含
SELECT * FROM table WHERE column LIKE '_attern'; -- 单个字符通配
-- IS NULL / IS NOT NULL
SELECT * FROM table WHERE column IS NULL;
SELECT * FROM table WHERE column IS NOT NULL;
-- NOT
SELECT * FROM table WHERE column NOT IN ('a', 'b');-- 升序(默认)
SELECT * FROM table ORDER BY column ASC;
-- 降序
SELECT * FROM table ORDER BY column DESC;
-- 多列排序
SELECT * FROM table ORDER BY column1 ASC, column2 DESC;SELECT a.*, b.*
FROM table_a a
INNER JOIN table_b b ON a.id = b.a_id;SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.a_id;SELECT a.*, b.*
FROM table_a a
RIGHT JOIN table_b b ON a.id = b.a_id;-- PostgreSQL, SQL Server
SELECT a.*, b.*
FROM table_a a
FULL OUTER JOIN table_b b ON a.id = b.a_id;SELECT a.*, b.*
FROM table_a a
CROSS JOIN table_b b;SELECT a.name, b.name AS manager_name
FROM employees a
LEFT JOIN employees b ON a.manager_id = b.id;SELECT o.*, c.name, p.product_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
INNER JOIN products p ON o.product_id = p.id;-- 统计行数
SELECT COUNT(*) FROM table;
-- 统计非空值数量
SELECT COUNT(column) FROM table;
-- 求和
SELECT SUM(column) FROM table;
-- 平均值
SELECT AVG(column) FROM table;
-- 最小值
SELECT MIN(column) FROM table;
-- 最大值
SELECT MAX(column) FROM table;-- 按单列分组
SELECT category, COUNT(*)
FROM products
GROUP BY category;
-- 按多列分组
SELECT category, status, COUNT(*), SUM(price)
FROM products
GROUP BY category, status;
-- 带 WHERE(分组前过滤)
SELECT category, COUNT(*)
FROM products
WHERE price > 100
GROUP BY category;SELECT category, COUNT(*) as product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 10;
-- HAVING 与 WHERE 结合
SELECT category, COUNT(*)
FROM products
WHERE price > 100
GROUP BY category
HAVING COUNT(*) > 5;SELECT category, SUM(price) as total
FROM products
GROUP BY category
ORDER BY total DESC;-- 行号
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) as rank
FROM employees;
-- 按部门分区
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;-- ROW_NUMBER:唯一编号,无并列
ROW_NUMBER() OVER (ORDER BY salary DESC)
-- RANK:并列时排名有间隔
RANK() OVER (ORDER BY salary DESC)
-- DENSE_RANK:并列时排名无间隔
DENSE_RANK() OVER (ORDER BY salary DESC)
-- NTILE:分桶
NTILE(4) OVER (ORDER BY salary DESC) as quartileSELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) as dept_avg,
SUM(salary) OVER (PARTITION BY department) as dept_total
FROM employees;SELECT
date,
amount,
SUM(amount) OVER (ORDER BY date) as running_total
FROM transactions;SELECT *
FROM products
WHERE price > (SELECT AVG(price) FROM products);SELECT avg_price
FROM (
SELECT category, AVG(price) as avg_price
FROM products
GROUP BY category
) AS category_avg
WHERE avg_price > 100;SELECT
name,
(SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.id) as order_count
FROM customers;SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);WITH category_stats AS (
SELECT
category,
COUNT(*) as count,
AVG(price) as avg_price
FROM products
GROUP BY category
)
SELECT * FROM category_stats
WHERE count > 10;WITH RECURSIVE employee_hierarchy AS (
-- 锚点成员
SELECT id, name, manager_id, 1 as level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 递归成员
SELECT e.id, e.name, e.manager_id, eh.level + 1
FROM employees e
JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;-- Insert single row
INSERT INTO table (column1, column2)
VALUES ('value1', 'value2');
-- Insert multiple rows
INSERT INTO table (column1, column2)
VALUES
('value1', 'value2'),
('value3', 'value4');
-- Insert from another table
INSERT INTO table2 (column1, column2)
SELECT column1, column2 FROM table1 WHERE condition;-- Update all rows (careful!)
UPDATE table
SET column1 = 'new_value';
-- Update specific rows
UPDATE table
SET column1 = 'new_value'
WHERE condition;
-- Update multiple columns
UPDATE table
SET column1 = 'value1', column2 = 'value2'
WHERE condition;
-- Update with join (PostgreSQL)
UPDATE products p
SET price = price * 1.1
FROM categories c
WHERE p.category_id = c.id AND c.name = 'Electronics';-- Delete all rows (careful!)
DELETE FROM table;
-- Delete specific rows
DELETE FROM table WHERE condition;
-- Delete with subquery
DELETE FROM products
WHERE category_id NOT IN (SELECT id FROM categories);TRUNCATE TABLE table_name;CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE
);
-- With foreign key
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total DECIMAL(10,2) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);-- Add column
ALTER TABLE table ADD COLUMN new_column VARCHAR(100);
-- Modify column
ALTER TABLE table ALTER COLUMN column TYPE VARCHAR(200);
-- Rename column
ALTER TABLE table RENAME COLUMN old_name TO new_name;
-- Drop column
ALTER TABLE table DROP COLUMN column;
-- Add constraint
ALTER TABLE table ADD CONSTRAINT constraint_name UNIQUE (column);DROP TABLE table_name;
-- Drop if exists
DROP TABLE IF EXISTS table_name;-- Basic index
CREATE INDEX idx_table_column ON table(column);
-- Composite index
CREATE INDEX idx_table_col1_col2 ON table(column1, column2);
-- Unique index
CREATE UNIQUE INDEX idx_table_column ON table(column);
-- Drop index
DROP INDEX idx_table_column;-- PostgreSQL, MySQL
SELECT * FROM table
ORDER BY id
LIMIT 10 OFFSET 40; -- Page 5 (10 per page)
-- SQL Server
SELECT * FROM table
ORDER BY id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY;WITH ranked AS (
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rn
FROM employees
)
SELECT * FROM ranked WHERE rn <= 3;SELECT column, COUNT(*)
FROM table
GROUP BY column
HAVING COUNT(*) > 1;-- Current date/time
SELECT CURRENT_DATE;
SELECT CURRENT_TIMESTAMP;
SELECT NOW(); -- PostgreSQL
-- Extract parts
SELECT EXTRACT(YEAR FROM date_column) FROM table;
SELECT EXTRACT(MONTH FROM date_column) FROM table;
-- Date arithmetic
SELECT date_column + INTERVAL '7 days' FROM table;
SELECT DATE_ADD(date_column, INTERVAL 7 DAY) FROM table; -- MySQLSELECT
name,
price,
CASE
WHEN price < 50 THEN 'Budget'
WHEN price < 100 THEN 'Mid-range'
ELSE 'Premium'
END as price_category
FROM products;SELECT COALESCE(column, 'default_value') FROM table;用 EXPLAIN 测试查询:
EXPLAIN SELECT * FROM table WHERE condition;
EXPLAIN ANALYZE SELECT * FROM table WHERE condition; -- PostgreSQL已收录 2 个 Skill