默认示例表:student(学生表)、class(班级表),适配MySQL 5.7+ / 8.0+
一、数据库(库)操作指令
1. CREATE DATABASE:创建数据库
-- 基础创建(可能中文乱码)
CREATE DATABASE school;
-- 推荐创建(判断不存在+指定字符集,避免乱码)
CREATE DATABASE IF NOT EXISTS school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
2. DROP DATABASE:删除数据库
-- 直接删除(不存在则报错)
DROP DATABASE school;
-- 安全删除(判断存在再删除)
DROP DATABASE IF EXISTS school;
3. SHOW DATABASES / SHOW SCHEMAS:查看所有数据库
-- 查看所有数据库(最常用)
SHOW DATABASES;
-- 等价写法
SHOW SCHEMAS;
4. USE:选择/切换数据库
-- 切换到school数据库,后续操作均在此库执行
USE school;
5. ALTER DATABASE:修改数据库属性
-- 修改数据库字符集(解决中文乱码)
ALTER DATABASE school CHARACTER SET utf8mb4;
-- 同时修改字符集和排序规则
ALTER DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
6. SHOW CREATE DATABASE:查看数据库创建语句
-- 查看school数据库完整创建语句
SHOW CREATE DATABASE school;
二、数据表(表)操作指令
1. CREATE TABLE:创建数据表
-- 创建student学生表(含字段、约束、说明)
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号(主键,自增)',
name VARCHAR(20) NOT NULL COMMENT '姓名(非空)',
age INT DEFAULT 18 COMMENT '年龄(默认18)',
gender ENUM('男','女') COMMENT '性别(二选一)',
class_id INT COMMENT '班级ID(关联class表)',
score DECIMAL(5,2) COMMENT '成绩(保留2位小数)',
FOREIGN KEY (class_id) REFERENCES class(id) -- 外键关联班级表
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';
2. DESC / DESCRIBE:查看数据表结构
-- 查看student表结构(常用)
DESC student;
-- 等价写法
DESCRIBE student;
3. SHOW TABLES:查看当前数据库所有数据表
-- 查看当前数据库(school)所有表
SHOW TABLES;
4. SHOW CREATE TABLE:查看数据表创建语句
-- 查看student表完整创建语句
SHOW CREATE TABLE student;
5. ALTER TABLE:修改数据表(最全用法)
5.1 添加字段(ADD COLUMN)
-- 新增phone字段,在age后
ALTER TABLE student ADD COLUMN phone VARCHAR(11) AFTER age;
-- 新增非空字段,放在第一列
ALTER TABLE student ADD COLUMN id_card VARCHAR(18) NOT NULL FIRST;
-- 批量新增多个字段
ALTER TABLE student
ADD COLUMN address VARCHAR(50),
ADD COLUMN create_time DATETIME DEFAULT NOW();
5.2 修改字段类型/约束(MODIFY COLUMN)
-- 修改age字段类型+添加非空约束
ALTER TABLE student MODIFY COLUMN age TINYINT NOT NULL;
-- 修改score字段默认值+取消非空约束
ALTER TABLE student MODIFY COLUMN score DECIMAL(5,2) DEFAULT 0 NULL;
5.3 修改字段名(CHANGE COLUMN)
-- 仅修改字段名(phone改为tel)
ALTER TABLE student CHANGE COLUMN phone tel VARCHAR(11);
-- 修改字段名+类型+约束(tel改phone,非空)
ALTER TABLE student CHANGE COLUMN tel phone VARCHAR(13) NOT NULL;
5.4 删除字段(DROP COLUMN)
-- 单个删除tel字段
ALTER TABLE student DROP COLUMN tel;
-- 批量删除多个字段
ALTER TABLE student
DROP COLUMN address,
DROP COLUMN create_time;
5.5 添加主键(ADD PRIMARY KEY)
-- 给id字段添加主键
ALTER TABLE student ADD PRIMARY KEY (id);
5.6 删除主键(DROP PRIMARY KEY)
-- 删除student表主键约束
ALTER TABLE student DROP PRIMARY KEY;
5.7 添加唯一约束(ADD UNIQUE)
-- 给phone字段添加唯一约束(避免重复)
ALTER TABLE student ADD UNIQUE uk_phone(phone);
5.8 删除唯一约束(DROP INDEX)
-- 删除phone字段的唯一约束(索引名uk_phone)
ALTER TABLE student DROP INDEX uk_phone;
5.9 重命名表(RENAME TO / RENAME TABLE)
-- 单表重命名(student改为stu)
ALTER TABLE student RENAME TO stu;
-- 批量重命名
RENAME TABLE stu TO student, class TO cls;
6. DROP TABLE:删除数据表
-- 直接删除(不存在则报错)
DROP TABLE student;
-- 安全删除(判断存在再删除)
DROP TABLE IF EXISTS student;
-- 批量删除多个表
DROP TABLE IF EXISTS student, class;
7. TRUNCATE TABLE:清空表数据
-- 清空数据,保留表结构,重置自增
TRUNCATE TABLE student;
-- 简写
TRUNCATE student;
8. 复制数据表(CREATE TABLE ... AS / LIKE)
-- 复制表结构+所有数据
CREATE TABLE stu_copy AS SELECT * FROM student;
-- 只复制表结构,不复制数据
CREATE TABLE stu_empty LIKE student;
-- 复制指定字段的结构+数据
CREATE TABLE stu_part AS SELECT name,age,score FROM student;
三、DML 数据操作指令(增删改查)
1. INSERT INTO:插入数据(增)
-- 按字段顺序插入(id自增填NULL)
INSERT INTO student VALUES(NULL, '张三', 18, '男', 1, 90.5);
-- 指定字段插入(推荐,安全)
INSERT INTO student(name, age, gender, score)
VALUES('李四', 17, '女', 88.0);
-- 批量插入3行数据
INSERT INTO student(name, age)
VALUES('王五', 18),
('赵六', 17),
('孙七', 18);
-- 从另一张表导入数据(18岁学生导入stu_copy)
INSERT INTO stu_copy SELECT * FROM student WHERE age=18;
-- 导入指定字段(成绩≥80的姓名和成绩)
INSERT INTO stu_copy(name, score) SELECT name, score FROM student WHERE score>=80;
2. SELECT:查询数据(查)
-- 1. 基础查询
SELECT * FROM student; -- 查询所有字段(不推荐)
SELECT name, age, score FROM student; -- 查询指定字段(推荐)
SELECT DISTINCT class_id FROM student; -- 去重查询班级ID
-- 2. WHERE条件筛选
SELECT * FROM student WHERE age>17 AND score>=80; -- 年龄>17且成绩≥80
SELECT * FROM student WHERE age BETWEEN 16 AND 18; -- 年龄16-18
SELECT * FROM student WHERE class_id IN(1,2,3); -- 班级ID为1/2/3
SELECT * FROM student WHERE name LIKE '张%'; -- 姓"张"的学生
SELECT * FROM student WHERE name LIKE '_三'; -- 第二个字是"三"
SELECT * FROM student WHERE phone IS NULL; -- phone为空
SELECT * FROM student WHERE phone IS NOT NULL; -- phone不为空
-- 3. ORDER BY排序
SELECT * FROM student ORDER BY score DESC; -- 成绩降序
SELECT * FROM student ORDER BY age ASC, score DESC; -- 年龄升序,成绩降序
-- 4. LIMIT分页
SELECT * FROM student LIMIT 3; -- 查询前3条
SELECT * FROM student LIMIT 2,3; -- 跳过2条,取3条
SELECT * FROM student ORDER BY score DESC LIMIT 3; -- 成绩前3名
-- 5. 聚合函数
SELECT COUNT(*) AS 总人数 FROM student; -- 统计总人数
SELECT COUNT(score) AS 有成绩人数 FROM student; -- 统计有成绩人数
SELECT SUM(score) 总成绩, AVG(score) 平均分 FROM student; -- 统计成绩相关
-- 6. GROUP BY分组+HAVING过滤
SELECT class_id 班级ID, COUNT(*) 人数, AVG(score) 平均分 FROM student GROUP BY class_id; -- 按班级分组统计
SELECT class_id 班级ID, AVG(score) 平均分 FROM student GROUP BY class_id HAVING AVG(score) > 80; -- 平均分>80的班级
SELECT class_id 班级ID, COUNT(*) 及格人数 FROM student WHERE score >= 60 GROUP BY class_id; -- 先筛选再分组
-- 7. 别名用法(简化语句)
SELECT s.name 姓名, s.age 年龄 FROM student s; -- 表别名s
SELECT name AS 姓名, age AS 年龄 FROM student; -- 字段别名
3. UPDATE:修改数据(改)
-- 修改单个字段(id=1的学生年龄改为19)
UPDATE student SET age=19 WHERE id=1;
-- 修改多个字段(id=2的学生姓名和成绩)
UPDATE student SET name='李思思', score=92.5 WHERE id=2;
-- 带条件批量修改(班级1的学生成绩+5)
UPDATE student SET score=score+5 WHERE class_id=1;
-- 无WHERE条件(谨慎!修改所有数据)
UPDATE student SET age=18;
4. DELETE:删除数据(删)
-- 带条件删除(id=3的学生)
DELETE FROM student WHERE id=3;
-- 批量删除(成绩<60的学生)
DELETE FROM student WHERE score < 60;
-- 无WHERE条件(谨慎!删除所有数据)
DELETE FROM student;
四、多表查询(核心进阶)
-- 1. 内连接(查询有对应班级的学生信息)
SELECT s.name 学生姓名, c.class_name 班级名称 FROM student s INNER JOIN class c ON s.class_id = c.id;
-- 2. 左连接(查询所有学生,无班级则显示NULL)
SELECT s.name 学生姓名, c.class_name 班级名称 FROM student s LEFT JOIN class c ON s.class_id = c.id;
-- 3. 右连接(查询所有班级,无学生则显示NULL)
SELECT s.name 学生姓名, c.class_name 班级名称 FROM student s RIGHT JOIN class c ON s.class_id = c.id;
-- 4. 子查询(查询成绩大于平均分的学生)
SELECT * FROM student WHERE score > (SELECT AVG(score) FROM student);
-- 5. 子查询(查询班级1的所有学生)
SELECT * FROM student WHERE class_id = (SELECT id FROM class WHERE class_name='高一1班');
五、其他常用指令
-- 1. 事务操作(保证原子性)
START TRANSACTION; -- 开启事务
UPDATE student SET score=85 WHERE id=1;
COMMIT; -- 提交事务(生效)
-- ROLLBACK; -- 回滚事务(取消操作)
-- 2. 索引操作(提升查询效率)
CREATE INDEX idx_student_name ON student(name); -- 给name字段建普通索引
DROP INDEX idx_student_name ON student; -- 删除索引
-- 3. 查看表索引
SHOW INDEX FROM student;
-- 4. 去重查询(补充)
SELECT DISTINCT name, class_id FROM student; -- 多字段去重