SQL数据库命令大全涵盖了数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)、数据控制语言(DCL)以及事务控制语言(TCL)等多个方面,以下将详细分类介绍常用命令,并通过表格形式对比部分语法差异,帮助用户全面掌握SQL操作。

数据定义语言(DDL)
DDL用于定义和管理数据库的结构,包括创建、修改和删除数据库对象。
-
创建数据库
- 基本语法:
CREATE DATABASE 数据库名;
- 示例:
CREATE DATABASE company_db;
- 指定字符集:
CREATE DATABASE company_db DEFAULT CHARACTER SET utf8mb4;
- 基本语法:
-
创建表
- 基本语法:
CREATE TABLE 表名 ( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ... [表级约束] );
- 示例(创建员工表):
CREATE TABLE employees ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50) NOT NULL, gender ENUM('男', '女'), hire_date DATE, salary DECIMAL(10,2), dept_id INT, FOREIGN KEY (dept_id) REFERENCES departments(dept_id) );
- 基本语法:
-
修改表结构
(图片来源网络,侵删)- 添加列:
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
示例:ALTER TABLE employees ADD COLUMN email VARCHAR(100);
- 修改列:
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型;
示例:ALTER TABLE employees MODIFY COLUMN emp_name VARCHAR(60);
- 删除列:
ALTER TABLE 表名 DROP COLUMN 列名;
示例:ALTER TABLE employees DROP COLUMN email;
- 重命名表:
RENAME TABLE 旧表名 TO 新表名;
示例:RENAME TABLE employees TO staff;
- 添加列:
-
删除数据库或表
- 删除表:
DROP TABLE 表名;
- 删除数据库:
DROP DATABASE 数据库名;
- 清空表数据(保留结构):
TRUNCATE TABLE 表名;
(比DELETE更快,不可回滚)
- 删除表:
数据操纵语言(DML)
DML用于操作数据库中的数据,包括插入、更新和删除记录。
-
插入数据(INSERT)
- 插入单条记录:
INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2);
示例:INSERT INTO employees (emp_id, emp_name, hire_date) VALUES (1001, '张三', '2023-01-15');
- 插入多条记录:
INSERT INTO employees (emp_id, emp_name, hire_date) VALUES (1002, '李四', '2023-02-20'), (1003, '王五', '2023-03-10');
- 从其他表插入:
INSERT INTO 目标表 (列名) SELECT 列名 FROM 源表 WHERE 条件;
- 插入单条记录:
-
更新数据(UPDATE)
(图片来源网络,侵删)- 基本语法:
UPDATE 表名 SET 列名1=值1, 列名2=值2 WHERE 条件;
- 示例:
UPDATE employees SET salary=8500 WHERE emp_id=1001;
- 注意:省略WHERE会更新全表数据,需谨慎使用。
- 基本语法:
-
删除数据(DELETE)
- 基本语法:
DELETE FROM 表名 WHERE 条件;
- 示例:
DELETE FROM employees WHERE emp_id=1003;
- 与TRUNCATE的区别:DELETE可回滚,逐条删除;TRUNCATE不可回滚,清空表并重置自增ID。
- 基本语法:
数据查询语言(DQL)
DQL用于从数据库中检索数据,核心是SELECT
语句。
-
基本查询
- 查询所有列:
SELECT * FROM 表名;
- 查询指定列:
SELECT 列名1, 列名2 FROM 表名;
- 去重:
SELECT DISTINCT 列名 FROM 表名;
示例:SELECT DISTINCT dept_id FROM employees;
- 查询所有列:
-
条件查询(WHERE)
- 比较运算符:,
>
,<
,>=
,<=
,<>
(或) - 逻辑运算符:
AND
,OR
,NOT
- 范围查询:
BETWEEN...AND...
,IN(值1, 值2)
- 模糊查询:
LIKE
(匹配任意多个字符,_
匹配单个字符)
示例:SELECT * FROM employees WHERE emp_name LIKE '张%';
- 空值判断:
IS NULL
,IS NOT NULL
- 比较运算符:,
-
排序(ORDER BY)
- 升序(默认):
SELECT * FROM 表名 ORDER BY 列名 ASC;
- 降序:
SELECT * FROM 表名 ORDER BY 列名 DESC;
- 多列排序:
SELECT * FROM employees ORDER BY dept_id ASC, salary DESC;
- 升序(默认):
-
聚合函数
- 常用函数:
COUNT()
(计数)、SUM()
(求和)、AVG()
(平均值)、MAX()
(最大值)、MIN()
(最小值)
示例:SELECT dept_id, AVG(salary) AS avg_salary FROM employees GROUP BY dept_id;
- 常用函数:
-
分组(GROUP BY)与筛选(HAVING)
- 分组:
SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名;
- 分组后筛选:
SELECT dept_id, COUNT(*) AS emp_count FROM employees GROUP BY dept_id HAVING COUNT(*)>5;
(HAVING与WHERE的区别:WHERE在分组前过滤行,HAVING在分组后过滤组)
- 分组:
-
限制结果数量(LIMIT)
- 基本语法:
SELECT * FROM 表名 LIMIT 起始位置, 数量;
- 示例(分页):
SELECT * FROM employees LIMIT 0, 10;
(从第1条开始取10条)
- 基本语法:
数据控制语言(DCL)
DCL用于控制数据库的访问权限,主要包括授权和撤销权限。
-
授权(GRANT)
- 语法:
GRANT 权限 ON 数据库对象 TO 用户 [WITH GRANT OPTION];
- 示例:
GRANT SELECT, INSERT ON company_db.employees TO 'user1'@'localhost';
WITH GRANT OPTION
允许用户将权限转授给其他用户。
- 语法:
-
撤销权限(REVOKE)
- 语法:
REVOKE 权限 ON 数据库对象 FROM 用户;
- 示例:
REVOKE INSERT ON company_db.employees FROM 'user1'@'localhost';
- 语法:
事务控制语言(TCL)
TCL用于管理事务,确保数据的一致性和完整性。
-
事务基本操作
- 开启事务:
START TRANSACTION;
(或BEGIN;
) - 提交事务:
COMMIT;
(保存更改) - 回滚事务:
ROLLBACK;
(撤销未提交的更改) - 示例:
START TRANSACTION; UPDATE accounts SET balance=balance-100 WHERE user_id=1; UPDATE accounts SET balance=balance+100 WHERE user_id=2; COMMIT; -- 或 ROLLBACK;
- 开启事务:
-
事务隔离级别
- 查看当前隔离级别:
SELECT @@transaction_isolation;
- 设置隔离级别:
SET TRANSACTION ISOLATION LEVEL 级别;
(级别包括:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)
- 查看当前隔离级别:
常用函数
SQL提供了丰富的内置函数,简化数据处理。
-
字符串函数
CONCAT(str1, str2)
:拼接字符串SUBSTRING(str, 起始位置, 长度)
:截取子串LENGTH(str)
:字符串长度LOWER(str)
/UPPER(str)
:转小写/大写
-
数值函数
ROUND(num, 小数位数)
:四舍五入CEIL(num)
/FLOOR(num)
:向上/向下取整MOD(num1, num2)
:取余
-
日期函数
CURDATE()
/NOW()
:当前日期/日期时间DATE_FORMAT(date, 格式)
:格式化日期(如%Y-%m-%d
)DATEDIFF(date1, date2)
:计算日期差
不同数据库的语法差异对比
功能 | MySQL | SQL Server | Oracle |
---|---|---|---|
自增列 | INT AUTO_INCREMENT |
INT IDENTITY(1,1) |
SEQUENCE + TRIGGER |
分页查询 | LIMIT 0,10 |
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY |
ROWNUM <= 10 AND ROWNUM > 0 |
字符串拼接 | CONCAT(str1, str2) |
str1 + str2 或 CONCAT(str1, str2) |
str1 || str2 或 CONCAT(str1, str2) |
注释 | -- 注释 或 # 注释 |
-- 注释 或 /* 注释 */ |
-- 注释 或 /* 注释 */ |
相关问答FAQs
Q1: SQL中DELETE和TRUNCATE的区别是什么?
A1: 主要区别有三点:
- 功能:DELETE用于删除满足条件的行(可带WHERE条件),TRUNCATE直接清空全表数据;
- 性能:TRUNCATE是DDL语句,操作速度快(直接删除表数据并重建表),DELETE是DML语句,逐行删除,速度较慢;
- 事务与日志:DELETE操作会被记录到事务日志中,支持回滚(ROLLBACK),TRUNCATE不记录日志,通常不可回滚(部分数据库支持事务回滚);
- 自增ID:TRUNCATE会重置自增列的计数器(从1开始),DELETE不会影响自增ID的当前值。
Q2: 如何优化SQL查询性能?
A2: 优化SQL查询性能可从以下方面入手:
- 索引优化:为经常查询、排序或作为条件的列创建索引(如
WHERE
、JOIN
、ORDER BY
涉及的列),但避免过度索引(降低写入性能); - 避免全表扫描:确保查询使用索引,避免对列进行函数操作(如
WHERE YEAR(hire_date)=2023
,应改为hire_date >= '2023-01-01' AND hire_date < '2024-01-01'
); - 减少返回数据量:使用
SELECT
指定必要列,避免SELECT *
;合理使用LIMIT
分页; - 优化JOIN操作:确保JOIN字段有索引,小表驱动大表(将小表放在驱动表位置);
- 使用EXPLAIN分析:通过
EXPLAIN
查询执行计划,检查是否走索引、是否出现临时表或filesort; - 事务管理:避免长事务,及时提交或回滚,减少锁持有时间。