无论是开发、运维还是数据库工程师,SQL 语言都是最常用的技能之一。本文整理了 100 条经典 SQL 命令,覆盖 MySQL / PostgreSQL / SQL Server / Oracle 常见方言,几乎囊括了日常工作场景。提议收藏并在日常开发中查阅使用。
一、数据库与表管理(1-15)
- 创建数据库
CREATE DATABASE company_db;
- 删除数据库
DROP DATABASE company_db;
- 切换数据库(MySQL)
USE company_db;
- 查看所有数据库
SHOW DATABASES;
- 创建数据表
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
age INT,
hire_date DATE
);
- 删除表
DROP TABLE employees;
- 修改表名
ALTER TABLE employees RENAME TO staff;
- 增加字段
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
- 修改字段类型
ALTER TABLE employees MODIFY age SMALLINT;
- 删除字段
ALTER TABLE employees DROP COLUMN email;
- 查看表结构
DESCRIBE employees;
- 查看建表语句(MySQL)
SHOW CREATE TABLE employees;
- 清空表数据(不删除表结构)
TRUNCATE TABLE employees;
- 复制表结构
CREATE TABLE employees_backup LIKE employees;
- 复制表结构+数据
CREATE TABLE employees_copy AS SELECT * FROM employees;
二、数据插入与更新(16-30)
- 插入一行
INSERT INTO employees (name, age, hire_date) VALUES (‘Tom’, 28, ‘2025-01-01’);
- 插入多行
INSERT INTO employees (name, age) VALUES (‘Alice’, 30), (‘Bob’, 35);
- 根据查询结果插入
INSERT INTO employees_backup SELECT * FROM employees WHERE age > 30;
- 更新单行
UPDATE employees SET age = 29 WHERE id = 1;
- 更新多行
UPDATE employees SET age = age + 1 WHERE age < 30;
- 删除数据
DELETE FROM employees WHERE age < 20;
- 防止误删:开启安全模式(MySQL)
SET SQL_SAFE_UPDATES = 1;
- UPSERT(MySQL ON DUPLICATE KEY)
INSERT INTO employees (id, name) VALUES (1, ‘Tom’)
ON DUPLICATE KEY UPDATE name=’Tom’;
- UPSERT(PostgreSQL ON CONFLICT)
INSERT INTO employees (id, name) VALUES (1, ‘Tom’)
ON CONFLICT (id) DO UPDATE SET name=’Tom’;
- 插入忽略冲突(MySQL)
INSERT IGNORE INTO employees (id, name) VALUES (1, ‘Tom’);
三、基本查询(31-50)
- 查询所有列
SELECT * FROM employees;
- 查询指定列
SELECT name, age FROM employees;
- 加别名
SELECT name AS employee_name FROM employees;
- 条件查询
SELECT * FROM employees WHERE age > 30;
- 多条件 AND/OR
SELECT * FROM employees WHERE age > 30 AND name LIKE ‘T%’;
- 排序
SELECT * FROM employees ORDER BY age DESC;
- 限制条数
SELECT * FROM employees LIMIT 10;
- 分页查询(MySQL)
SELECT * FROM employees LIMIT 10 OFFSET 20;
- 去重查询
SELECT DISTINCT age FROM employees;
- 模糊匹配
SELECT * FROM employees WHERE name LIKE ‘%Tom%’;
- 范围查询(BETWEEN)
SELECT * FROM employees WHERE age BETWEEN 25 AND 35;
- 集合查询(IN)
SELECT * FROM employees WHERE age IN (25, 30, 35);
- NULL 判断
SELECT * FROM employees WHERE email IS NULL;
- 聚合函数(COUNT, SUM, AVG, MIN, MAX)
SELECT COUNT(*), AVG(age) FROM employees;
- 分组查询(GROUP BY)
SELECT age, COUNT(*) FROM employees GROUP BY age;
- 分组过滤(HAVING)
SELECT age, COUNT(*) FROM employees GROUP BY age HAVING COUNT(*) > 1;
- 子查询(WHERE IN)
SELECT * FROM employees WHERE id IN (SELECT id FROM employees_backup);
- EXISTS 子查询
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees_backup b WHERE b.id = e.id);
- CASE 表达式
SELECT name,
CASE WHEN age < 30 THEN ‘青年’
WHEN age BETWEEN 30 AND 50 THEN ‘中年’
ELSE ‘老年’ END AS age_group
FROM employees;
- JOIN 查询
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
四、约束与索引(51-65)
- 设置主键
ALTER TABLE employees ADD PRIMARY KEY (id);
- 唯一约束
ALTER TABLE employees ADD CONSTRAINT unique_email UNIQUE (email);
- 外键约束
ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(id);
- 检查约束(CHECK)
ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18);
- 创建索引
CREATE INDEX idx_age ON employees(age);
- 唯一索引
CREATE UNIQUE INDEX idx_email ON employees(email);
- 组合索引
CREATE INDEX idx_name_age ON employees(name, age);
- 删除索引(MySQL)
DROP INDEX idx_age ON employees;
- 查看索引
SHOW INDEX FROM employees;
- 聚簇索引(SQL Server)
CREATE CLUSTERED INDEX idx_id ON employees(id);
五、函数与表达式(66-80)
- 字符串拼接
SELECT CONCAT(name, ‘-‘, age) FROM employees;
- 字符串长度
SELECT LENGTH(name) FROM employees;
- 子字符串
SELECT SUBSTRING(name, 1, 3) FROM employees;
- 转大写/小写
SELECT UPPER(name), LOWER(name) FROM employees;
- 去空格
SELECT TRIM(name) FROM employees;
- 数学函数
SELECT ABS(-5), ROUND(3.14159, 2), CEIL(2.1), FLOOR(2.9);
- 日期函数(MySQL)
SELECT NOW(), CURDATE(), YEAR(NOW()), MONTH(NOW());
- 日期加减
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
- DATEDIFF
SELECT DATEDIFF(NOW(), hire_date) FROM employees;
- 随机数
SELECT RAND();
- COALESCE(取第一个非空值)
SELECT COALESCE(email, ‘no-email’) FROM employees;
- IFNULL
SELECT IFNULL(email, ‘N/A’) FROM employees;
- CAST 类型转换
SELECT CAST(age AS CHAR) FROM employees;
- 分组拼接(MySQL)
SELECT dept_id, GROUP_CONCAT(name) FROM employees GROUP BY dept_id;
- 窗口函数 ROW_NUMBER()
SELECT name, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY age DESC) AS rn FROM employees;
- RANK() 排名
SELECT name, RANK() OVER (ORDER BY age DESC) FROM employees;
- NTILE 分组
SELECT name, NTILE(4) OVER (ORDER BY age) AS quartile FROM employees;
- LAG/LEAD
SELECT name, LAG(age, 1) OVER (ORDER BY id) FROM employees;
- JSON 解析(MySQL 5.7+)
SELECT JSON_EXTRACT(‘{“a”:1,”b”:2}’, ‘$.a’);
- 正则匹配
SELECT * FROM employees WHERE name REGEXP ‘^T.*’;
六、事务与锁(81-90)
- 开启事务
START TRANSACTION;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
- 保存点
SAVEPOINT sp1;
- 回滚到保存点
ROLLBACK TO sp1;
- 设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- 查看事务隔离级别(MySQL)
SELECT @@transaction_isolation;
- 加排他锁
SELECT * FROM employees WHERE id=1 FOR UPDATE;
- 加共享锁
SELECT * FROM employees WHERE id=1 LOCK IN SHARE MODE;
- 死锁检测(MySQL InnoDB)
SHOW ENGINE INNODB STATUS;
七、权限与安全(91-100)
- 创建用户
CREATE USER ‘dev’@’localhost’ IDENTIFIED BY ‘123456’;
- 授予权限
GRANT SELECT, INSERT ON company_db.* TO ‘dev’@’localhost’;
- 回收权限
REVOKE INSERT ON company_db.* FROM ‘dev’@’localhost’;
- 查看权限
SHOW GRANTS FOR ‘dev’@’localhost’;
- 删除用户
DROP USER ‘dev’@’localhost’;
- 修改密码
ALTER USER ‘dev’@’localhost’ IDENTIFIED BY ‘newpwd’;
- 只读账户
GRANT SELECT ON company_db.* TO ‘readonly’@’%’;
- 锁表(MySQL)
LOCK TABLE employees READ;
- 解锁表
UNLOCK TABLES;
- 审计日志(MySQL 8.0+)
SELECT * FROM performance_schema.events_statements_history;
总结
本文整理了 SQL 日常工作最常用的 100 条命令,涵盖:
- 数据库/表管理
- 数据增删改查
- 约束与索引
- 常用函数
- 窗口函数
- 事务与锁
- 权限管理与安全
学会并灵活使用这些命令,基本能覆盖 90% 以上的开发与运维场景。

















- 最新
- 最热
只看作者