MySQL 完整SQL指令大全(仅代码+备注)

默认示例表: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; -- 多字段去重
相关推荐
夕除1 小时前
spring boot 2
数据库
吠品1 小时前
Node.js谜团:fs.Stats废弃警告的侦探之旅与破局之道
linux·服务器·数据库
Mike117.1 小时前
GBase 8c 会话、锁等待和长 SQL 的日常巡检写法
java·数据库·sql
熊文豪1 小时前
表空间目录自动创建:国产数据库云原生存储管理的关键演进
数据库·电科金仓
承渊政道1 小时前
数据删了不等于销毁:KingbaseES敏感数据物理擦除实战指南
运维·服务器·数据库·数据仓库·安全·oracle·业界资讯
精益数智小屋1 小时前
什么是进销存库存表?进销存库存表包含哪些内容?
大数据·运维·数据库·人工智能·安全
重生之小比特1 小时前
【MySQL 数据库】索引特性
数据库·mysql
Elastic 中国社区官方博客1 小时前
为 Elasticsearch 带来火力:增加原生 Prometheus API 支持
大数据·数据库·elasticsearch·搜索引擎·信息可视化·prometheus
Andya_net1 小时前
MySQL | DBeaver Mac版下载、安装与使用指南
数据库·mysql·macos