一、数据库操作(DDL,数据定义语言)
用于创建、删除、切换数据库,核心操作如下:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 创建数据库(指定字符集可选,推荐utf8mb4) CREATE DATABASE 数据库名 [DEFAULT CHARACTER SET utf8mb4]; -- 2. 删除数据库(谨慎操作,删除后无法恢复) DROP DATABASE 数据库名; -- 3. 使用/切换数据库(操作表前必须执行) USE 数据库名; |
二、表结构操作(DDL)
用于创建、修改、删除表结构,包含约束设置,核心操作如下:
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 创建表(含常见约束示例) CREATE TABLE 表名 ( 列名1 数据类型 约束, 列名2 数据类型 约束, 列名3 数据类型 DEFAULT 默认值, -- 示例:学生表 id INT PRIMARY KEY AUTO_INCREMENT, -- 主键+自增(MySQL) name VARCHAR(20) NOT NULL, -- 非空约束 age INT CHECK (age > 0 AND age < 150),-- 检查约束 gender CHAR(1), create_time DATETIME DEFAULT NOW(), -- 默认当前时间 class_id INT, FOREIGN KEY (class_id) REFERENCES class(id) -- 外键约束(关联班级表) ); -- 2. 删除表(谨慎操作,删除表结构和所有数据) DROP TABLE 表名; -- 3. 清空表数据(保留表结构,无法回滚) TRUNCATE TABLE 表名; -- 4. 修改表名 ALTER TABLE 旧表名 RENAME TO 新表名; -- 5. 给表添加列 ALTER TABLE 表名 ADD 列名 数据类型 [约束]; -- 6. 修改列的数据类型或约束 ALTER TABLE 表名 MODIFY 列名 新数据类型 [新约束]; -- 7. 修改列名(MySQL语法) ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [约束]; -- 8. 删除表中的列 ALTER TABLE 表名 DROP COLUMN 列名; |
三、数据增删改查(DML + DQL)
3.1 查询数据(DQL,数据查询语言,最常用)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 基础查询:查询指定列或所有列 SELECT * FROM 表名; -- 查询所有列(开发调试可用,生产尽量指定列) SELECT 列1, 列2, 列3 FROM 表名; -- 查询指定列 -- 条件查询:根据条件筛选数据 SELECT * FROM 表名 WHERE 条件; -- 示例:查询年龄大于18的学生 SELECT name, age FROM student WHERE age > 18; -- 排序查询:按指定列升序/降序排列 SELECT * FROM 表名 ORDER BY 列名 ASC; -- ASC升序(默认,可省略) SELECT * FROM 表名 ORDER BY 列名 DESC; -- DESC降序 -- 示例:按年龄降序,姓名升序 SELECT * FROM student ORDER BY age DESC, name ASC; -- 分页查询:限制查询结果条数(MySQL语法) SELECT * FROM 表名 LIMIT 起始行, 条数; -- 起始行从0开始 -- 示例:查询第11-20条数据 SELECT * FROM student LIMIT 10, 10; -- 去重查询:去除重复的记录 SELECT DISTINCT 列名 FROM 表名; -- 示例:查询所有不重复的班级ID SELECT DISTINCT class_id FROM student; -- 模糊查询:匹配包含指定关键词的记录 SELECT * FROM 表名 WHERE 列名 LIKE '%关键词%'; -- 包含关键词 SELECT * FROM 表名 WHERE 列名 LIKE '关键词%'; -- 以关键词开头 SELECT * FROM 表名 WHERE 列名 LIKE '%关键词'; -- 以关键词结尾 -- 多条件查询:结合AND/OR连接条件 SELECT * FROM 表名 WHERE 条件1 AND 条件2; -- 同时满足两个条件 SELECT * FROM 表名 WHERE 条件1 OR 条件2; -- 满足任意一个条件 -- 范围查询:BETWEEN...AND... 或 IN SELECT * FROM 表名 WHERE 列名 BETWEEN 取值1 AND 取值2; -- 闭区间 SELECT * FROM 表名 WHERE 列名 IN (值1, 值2, 值3); -- 匹配指定多个值 |
3.2 新增数据(DML,数据操纵语言)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 全列插入(需与表中列顺序、数量完全一致) INSERT INTO 表名 VALUES(值1, 值2, 值3, ...); -- 示例:插入学生信息(对应id、name、age、gender) INSERT INTO student VALUES(1, '张三', 20, '男'); -- 2. 指定列插入(推荐,无需对应所有列,未指定列取默认值/NULL) INSERT INTO 表名(列1, 列2, 列3) VALUES(值1, 值2, 值3); -- 示例:插入学生姓名和年龄,其他列取默认值 INSERT INTO student(name, age) VALUES('李四', 19); -- 3. 批量插入(高效,减少数据库连接次数) INSERT INTO 表名(列1, 列2) VALUES(值1, 值2), (值3, 值4), (值5, 值6); |
3.3 修改数据(DML)
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 语法:UPDATE 表名 SET 列=值 WHERE 条件 -- ⚠️ 必须加WHERE条件,否则会修改全表数据! UPDATE student SET age=21 WHERE id=1; -- 修改id=1的学生年龄为21 UPDATE student SET gender='女', age=18 WHERE name='李四'; -- 同时修改多个列 |
3.4 删除数据(DML)
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 语法:DELETE FROM 表名 WHERE 条件 -- ⚠️ 必须加WHERE条件,否则会删除全表数据! DELETE FROM student WHERE id=1; -- 删除id=1的学生记录 DELETE FROM student WHERE age < 18; -- 删除年龄小于18的学生记录 |
四、高级查询(聚合、分组、连接)
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 聚合函数(统计数据,常与GROUP BY配合) SELECT COUNT(*) FROM 表名; -- 统计总行数(包含NULL) SELECT COUNT(列名) FROM 表名; -- 统计指定列非NULL的行数 SELECT SUM(列名) FROM 表名; -- 求和(仅数值类型) SELECT AVG(列名) FROM 表名; -- 求平均值(仅数值类型) SELECT MAX(列名) FROM 表名; -- 求最大值 SELECT MIN(列名) FROM 表名; -- 求最小值 -- 示例:统计学生总数、平均年龄 SELECT COUNT(*), AVG(age) FROM student; -- 2. 分组查询(GROUP BY):按指定列分组,统计每组数据 SELECT 分组列, 聚合函数 FROM 表名 GROUP BY 分组列; -- 示例:按班级分组,统计每个班级的学生人数 SELECT class_id, COUNT(*) AS 学生人数 FROM student GROUP BY class_id; -- 3. 分组后筛选(HAVING):筛选分组后的结果(区别于WHERE,WHERE筛选行,HAVING筛选组) SELECT class_id, COUNT(*) AS 学生人数 FROM student GROUP BY class_id HAVING 学生人数 > 5; -- 4. 表连接查询(多表关联,最常用) -- 4.1 内连接(INNER JOIN):只查询两张表中匹配的记录 SELECT 表1.列, 表2.列 FROM 表1 INNER JOIN 表2 ON 表1.关联列 = 表2.关联列; -- 示例:查询学生姓名和对应班级名称 SELECT student.name, class.className FROM student INNER JOIN class ON student.class_id = class.id; -- 4.2 左连接(LEFT JOIN):查询左表所有记录,右表匹配不到的显示NULL SELECT 表1.列, 表2.列 FROM 表1 LEFT JOIN 表2 ON 表1.关联列 = 表2.关联列; -- 4.3 右连接(RIGHT JOIN):查询右表所有记录,左表匹配不到的显示NULL SELECT 表1.列, 表2.列 FROM 表1 RIGHT JOIN 表2 ON 表1.关联列 = 表2.关联列; -- 5. 子查询(嵌套查询):将一个查询结果作为另一个查询的条件/数据源 -- 示例:查询年龄大于平均年龄的学生 SELECT * FROM student WHERE age > (SELECT AVG(age) FROM student); |
五、约束(CONSTRAINT)
约束用于保证数据的完整性和一致性,常用约束如下:
- PRIMARY KEY:主键约束,唯一标识表中每条记录,不可为NULL、不可重复,一张表只能有一个主键。
- FOREIGN KEY:外键约束,关联两张表,保证子表数据与父表数据一致,避免无效数据。
- NOT NULL:非空约束,指定列不能为NULL。
- UNIQUE:唯一约束,指定列的值不可重复,但可以为NULL。
- DEFAULT:默认值约束,当插入数据时未指定该列,自动填充默认值。
- AUTO_INCREMENT:自增约束(MySQL专属),指定列自动递增,常用于主键。
- CHECK:检查约束,限制列的取值范围(部分数据库如MySQL5.7及以下不支持,需手动实现)。
六、索引操作
索引用于提升查询效率,核心操作如下(谨慎创建,过多索引会影响插入/修改效率):
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 创建普通索引(最常用,无唯一限制) CREATE INDEX 索引名 ON 表名(列名); -- 示例:给学生表的name列创建索引 CREATE INDEX idx_student_name ON student(name); -- 2. 创建唯一索引(索引列的值不可重复) CREATE UNIQUE INDEX 索引名 ON 表名(列名); -- 3. 创建联合索引(多列组合索引,查询时需遵循最左匹配原则) CREATE INDEX 索引名 ON 表名(列1, 列2); -- 4. 删除索引 DROP INDEX 索引名 ON 表名; |
七、视图操作
视图是虚拟表,基于查询语句创建,用于简化复杂查询、隐藏敏感数据,核心操作如下:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 创建视图 CREATE VIEW 视图名 AS SELECT 查询语句; -- 示例:创建视图,显示学生姓名、年龄和班级名称 CREATE VIEW v_student_class AS SELECT student.name, student.age, class.className FROM student INNER JOIN class ON student.class_id = class.id; -- 2. 查询视图(与查询普通表一致) SELECT * FROM 视图名; -- 3. 修改视图(修改视图的查询逻辑) ALTER VIEW 视图名 AS 新的查询语句; -- 4. 删除视图 DROP VIEW 视图名; |
八、事务控制(TCL,事务控制语言)
事务用于保证一组操作的原子性(要么全成,要么全败),适用于转账、订单创建等场景,核心操作如下:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 开启事务 START TRANSACTION; -- 或 BEGIN; -- 2. 执行一系列SQL操作(增删改) UPDATE account SET balance = balance - 100 WHERE id = 1; -- A账户减100 UPDATE account SET balance = balance + 100 WHERE id = 2; -- B账户加100 -- 3. 提交事务(所有操作生效,无法回滚) COMMIT; -- 4. 回滚事务(操作失败,恢复到事务开启前的状态) ROLLBACK; -- 补充:设置保存点(可部分回滚) SAVEPOINT 保存点名称; -- 设置保存点 ROLLBACK TO 保存点名称; -- 回滚到指定保存点 |
九、权限管理(DCL,数据控制语言)
用于管理数据库用户和权限,核心操作如下(需管理员权限):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 创建用户(指定登录主机和密码) CREATE USER '用户名'@'登录主机' IDENTIFIED BY '密码'; -- 示例:创建本地登录用户test,密码123456 CREATE USER 'test'@'localhost' IDENTIFIED BY '123456'; -- 2. 给用户授权(ALL表示所有权限,可指定具体权限如SELECT、INSERT) GRANT 权限 ON 数据库.表 TO '用户名'@'登录主机'; -- 示例:给test用户授权student表的查询、插入权限 GRANT SELECT, INSERT ON school.student TO 'test'@'localhost'; -- 示例:给test用户授权所有数据库所有表的所有权限 GRANT ALL ON *.* TO 'test'@'localhost'; -- 3. 撤销用户权限 REVOKE 权限 ON 数据库.表 FROM '用户名'@'登录主机'; -- 示例:撤销test用户对student表的插入权限 REVOKE INSERT ON school.student FROM 'test'@'localhost'; -- 4. 刷新权限(授权/撤销后生效) FLUSH PRIVILEGES; -- 5. 删除用户 DROP USER '用户名'@'登录主机'; |
十、常用命令
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 1. 查看数据库列表 SHOW DATABASES; -- 2. 查看当前数据库的所有表 SHOW TABLES; -- 3. 查看表结构(字段、数据类型、约束) DESC 表名; -- 或 DESCRIBE 表名; -- 4. 查看索引 SHOW INDEX FROM 表名; -- 5. 查看当前用户 SELECT USER(); -- 6. 查看用户权限 SHOW GRANTS FOR '用户名'@'登录主机'; |