网站首页 > 技术文章 正文
无论是开发、运维还是数据库工程师,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% 以上的开发与运维场景。
猜你喜欢
- 2025-10-02 通过sql注入获取用户名和密码_sql注入万能密码
- 2025-10-02 SQL窗口函数详解及面试题真题_sql的窗口函数
- 2025-10-02 SQL行转列(Pivot)操作的通用方法(CASE WHEN语句)
- 2025-10-02 SQL 聚合函数有哪些_说出5种sql中常用的聚合函数
- 2025-10-02 java项目数据库从mysql迁移到postgresql经验
- 2025-10-02 WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!
- 2025-10-02 MySQL统计查询优化:内存临时表的正确打开方式
- 2025-10-02 MySql 8.0.33 主从实战配置及迁移企业生产数据
- 2025-10-02 sql注入之报错注入_对于sql注入的修复办法
- 2025-10-02 如何删除 MySQL 数据库中的所有数据表 ?
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)