前言
本文覆盖 mysql 所有常用sql指令,按「功能分类」整理,每个指令包含「核心作用+语法解释+实战示例+注意事项」,适配新手入门、进阶学习,所有示例可直接复制运行。
默认示例表说明(后续所有示例均基于这两张表,便于统一理解):
student(学生表):字段包括id(学号,唯一标识)、name(姓名)、age(年龄)、gender(性别)、class_id(班级id,关联班级表)、score(成绩)class(班级表):字段包括id(班级id,主键)、class_name(班级名称,如“高一1班”)
补充说明:所有指令适配 mysql 5.7+ / 8.0+,部分指令(如 check 约束)仅支持 mysql 8.0+;语法中「[]」内为可选参数,「|」表示二选一,「...」表示可重复。
一、数据库(库)操作指令(管理整个数据库,而非表或数据)
1. create database:创建数据库
核心作用:在mysql服务器中,新建一个独立的数据库(相当于“文件夹”,用于存放多张数据表),可指定字符集和排序规则,避免中文乱码。
语法解释:
create database:固定关键字,标识“创建数据库”操作;if not exists:可选参数,意思是“如果该数据库不存在,才创建”,避免重复创建报错;数据库名:自定义名称(如 school),命名规范:字母开头,可包含数字、下划线,不区分大小写,不能用关键字(如 database、table);character set utf8mb4:指定数据库字符集为 utf8mb4(支持所有中文、emoji表情,推荐使用);collate utf8mb4_unicode_ci:指定排序规则,utf8mb4_unicode_ci 是通用排序,适配多语言,不区分大小写。
实战示例:
-- 基础创建:创建名为 school 的数据库(使用默认字符集,可能出现中文乱码) create database school; -- 推荐创建:判断不存在再创建,指定字符集(避免乱码) create database if not exists school character set utf8mb4 collate utf8mb4_unicode_ci;
注意事项:数据库名称不能重复,若已存在,不加 if not exists 会直接报错。
2. drop database:删除数据库
核心作用:彻底删除指定的数据库,以及数据库内所有的数据表、数据,不可恢复,极其谨慎使用。
语法解释:
drop database:固定关键字,标识“删除数据库”操作;if exists:可选参数,“如果数据库存在,才删除”,避免删除不存在的数据库报错。
实战示例:
-- 直接删除 school 数据库(若不存在,报错) drop database school; -- 安全删除:判断存在再删除 drop database if exists school;
注意事项:删除后所有数据丢失,无恢复余地,生产环境禁止随意使用,建议先备份数据。
3. show databases / show schemas:查看所有数据库
核心作用:列出mysql服务器中所有已创建的数据库,包括系统自带的数据库(如 information_schema、mysql、performance_schema)。
语法解释:两个指令完全等价,show databases 更常用,无需额外参数,直接执行即可。
实战示例:
-- 查看所有数据库(最常用) show databases; -- 等价写法,效果一致 show schemas;
补充说明:执行后会显示所有数据库名称,系统数据库建议不要修改或删除,避免mysql无法正常运行。
4. use:选择/切换数据库
核心作用:切换到指定的数据库,后续所有sql操作(如建表、查数据),都会在这个数据库中执行,相当于“打开文件夹”。
语法解释:use + 数据库名,无其他可选参数,执行后会提示“database changed”,表示切换成功。
实战示例:
-- 切换到 school 数据库,后续操作都在 school 库中执行 use school;
注意事项:切换数据库前,必须确保该数据库已存在,否则会报错;每次只能切换到一个数据库,若要操作其他数据库,需再次执行 use 指令。
5. alter database:修改数据库属性
核心作用:修改已创建数据库的字符集、排序规则等属性,最常用场景是修复数据库中文乱码(如初始未指定utf8mb4)。
语法解释:
alter database:固定关键字,标识“修改数据库”操作;数据库名:指定要修改的数据库;character set:指定新的字符集;collate:指定新的排序规则(需与字符集匹配)。
实战示例:
-- 将 school 数据库的字符集修改为 utf8mb4,解决中文乱码 alter database school character set utf8mb4; -- 同时修改字符集和排序规则 alter database school character set utf8mb4 collate utf8mb4_unicode_ci;
补充说明:修改数据库字符集后,已存在的数据表字符集不会自动修改,需单独修改数据表的字符集。
6. show create database:查看数据库创建语句
核心作用:查看指定数据库的完整创建语句,包括字符集、排序规则等信息,便于复制、备份或排查问题(如忘记数据库字符集时)。
语法解释:show create database + 数据库名,执行后会显示数据库名称和完整的创建sql语句。
实战示例:
-- 查看 school 数据库的创建语句 show create database school;
补充说明:执行结果中,“create database” 后面的内容,就是该数据库的完整创建语法,可直接复制使用。
二、数据表(表)操作指令(管理数据库中的数据表,定义表结构)
1. create table:创建数据表
核心作用:在当前数据库中,新建一张数据表(相当于“文件夹中的文件”),定义表的字段、数据类型、约束(主键、非空等),是存储数据的基础。
语法解释(重点拆解):
create table:固定关键字,标识“创建数据表”;表名:自定义(如 student),命名规范同数据库,建议小写,与业务含义一致;括号内为「字段定义」,每个字段格式:
字段名 数据类型 约束 comment '字段说明',多个字段用逗号分隔;数据类型:指定字段存储的数据类型(如 int 整数、varchar 字符串、decimal 小数);约束:保证数据规范(如 primary key 主键、not null 非空、default 默认值);comment:可选参数,字段/表的说明文字,便于后续维护(如 comment '学号');engine=innodb:指定表的存储引擎(mysql默认,支持事务、外键,推荐使用);default charset=utf8mb4:指定表的字符集,与数据库字符集一致,避免中文乱码。
常用数据类型说明(新手必记):
int:整数类型(如 18、20),可搭配 auto_increment(自增);varchar(n):字符串类型,n 表示最大长度(如 varchar(20) 表示最多存20个字符,含中文);decimal(m,n):小数类型,m 是总长度,n 是小数点后位数(如 decimal(5,2) 表示 999.99);enum('值1','值2'):枚举类型,字段值只能从指定选项中选择(如 enum('男','女'));datetime:日期时间类型(如 2024-05-12 14:30:00)。
常用约束说明:
primary key:主键,唯一标识表中每一行数据,非空且不重复,一张表只能有一个主键;auto_increment:自增,搭配 int 类型使用,插入数据时无需手动填写,自动生成唯一递增的值(如 id 从1、2、3...依次递增);not null:非空约束,该字段必须填写数据,不能为 null(如姓名不能空);default:默认值,插入数据时若不填写该字段,自动使用默认值(如 age default 18,不填则为18);foreign key:外键,关联另一张表的主键,保证数据一致性(如 student.class_id 关联 class.id,确保班级id存在)。
实战示例:
-- 创建 student 学生表,完整字段+约束+说明
create table student (
id int primary key auto_increment comment '学号(主键,自增)',
name varchar(20) not null comment '姓名(非空,最多20个字符)',
age int default 18 comment '年龄(默认18,整数)',
gender enum('男','女') comment '性别(只能选男/女)',
class_id int comment '班级id(关联班级表的id)',
score decimal(5,2) comment '成绩(总长度5,小数点后2位)',
-- 外键约束:class_id 关联 class 表的 id
foreign key (class_id) references class(id)
) engine=innodb default charset=utf8mb4 comment='学生表(存储学生基本信息)';注意事项:创建带外键的表时,被关联的表(如 class)必须先创建,否则会报错;字段名不能重复,数据类型和约束要根据业务需求选择。
2. desc / describe:查看数据表结构
核心作用:查看指定数据表的字段名、数据类型、是否允许为空(null)、默认值、约束(主键、外键等),快速了解表结构。
语法解释:两个指令完全等价,desc 是 describe 的缩写,更简洁常用,语法为 desc + 表名。
实战示例:
-- 查看 student 表的结构(常用) desc student; -- 等价写法 describe student;
补充说明:执行后会显示5列信息:field(字段名)、type(数据类型)、null(是否允许为空)、key(约束类型,如 pri 表示主键)、default(默认值)、extra(额外信息,如 auto_increment)。
3. show tables:查看当前数据库所有数据表
核心作用:列出当前已切换(use 指令选中)的数据库中,所有已创建的数据表,快速确认表是否存在。
语法解释:无额外参数,直接执行 show tables 即可,若想查看其他数据库的表,需先执行 use 切换数据库。
实战示例:
-- 查看当前数据库(school)所有数据表 show tables;
4. show create table:查看数据表创建语句
核心作用:查看指定数据表的完整创建语句,包括字段、数据类型、约束、存储引擎、字符集等所有信息,便于复制、备份或修改表结构。
语法解释:show create table + 表名,执行后会显示表名和完整的创建sql语句,比 desc 更详细。
实战示例:
-- 查看 student 表的完整创建语句 show create table student;
5. alter table:修改数据表(最全用法)
核心作用:修改已创建数据表的结构,包括添加字段、删除字段、修改字段名/数据类型/约束、重命名表、添加/删除主键/外键等,是最常用的表操作指令之一。
语法核心:alter table 表名 + 具体操作,不同操作的语法不同,以下分场景详细说明:
5.1 添加字段(add column)
作用:给已有的表,新增一个或多个字段,可指定字段位置(如在某个字段后面)。
语法解释:
add column:固定关键字,标识“添加字段”,column 可省略;字段名 数据类型 约束:新增字段的定义,与 create table 时一致;after 字段名:可选参数,指定新增字段在某个已有字段的后面(如 after age,在age字段后);first:可选参数,指定新增字段为表的第一个字段。
实战示例:
-- 1. 给 student 表添加 phone 字段(字符串,11位,在 age 字段后面) alter table student add column phone varchar(11) after age; -- 2. 添加字段时,添加约束(非空),且放在第一个位置 alter table student add column id_card varchar(18) not null first; -- 3. 批量添加多个字段 alter table student add column address varchar(50), add column create_time datetime default now();
5.2 修改字段类型/约束(modify column)
作用:修改已有字段的数据类型、约束(如非空、默认值),但不修改字段名。
语法解释:modify column 字段名 新数据类型 新约束,column 可省略;修改时,需保证字段现有数据符合新的类型和约束(如把 varchar 改为 int,现有数据必须是数字)。
实战示例:
-- 1. 把 age 字段的类型从 int 改为 tinyint(更小的整数类型),并添加非空约束 alter table student modify column age tinyint not null; -- 2. 把 score 字段的默认值改为 0,取消非空约束(允许为空) alter table student modify column score decimal(5,2) default 0 null;
5.3 修改字段名(change column)
作用:修改已有字段的名称,可同时修改数据类型和约束(与 modify 的区别:change 能改字段名,modify 不能)。
语法解释:change column 旧字段名 新字段名 新数据类型 新约束,column 可省略;旧字段名必须是表中已存在的,新字段名不能与其他字段重复。
实战示例:
-- 1. 把 phone 字段改名为 tel,类型不变 alter table student change column phone tel varchar(11); -- 2. 改字段名的同时,修改类型和约束(tel 改为 phone,类型改为 varchar(13),非空) alter table student change column tel phone varchar(13) not null;
5.4 删除字段(drop column)
作用:删除表中已有的某个字段,以及该字段对应的所有数据,不可恢复,谨慎使用。
语法解释:drop column 字段名,column 可省略;删除字段后,表结构中该字段消失,对应的数据也会被删除,无法找回。
实战示例:
-- 删除 student 表中的 tel 字段(连带该字段所有数据一起删除) alter table student drop column tel; -- 批量删除多个字段 alter table student drop column address, drop column create_time;
5.5 添加主键(add primary key)
作用:给没有主键的表,添加主键约束(一张表只能有一个主键,主键字段需非空且不重复)。
语法解释:add primary key (字段名),字段名需是表中已存在的字段,且该字段没有重复数据、没有 null 值。
实战示例:
-- 给 student 表的 id 字段添加主键(若之前未设置主键) alter table student add primary key (id);
5.6 删除主键(drop primary key)
作用:删除表中的主键约束,但不会删除主键字段本身(只是取消“主键”属性);若主键字段有 auto_increment 自增属性,删除主键后,自增属性也会消失。
语法解释:drop primary key,无需指定字段名(因为一张表只有一个主键)。
实战示例:
-- 删除 student 表的主键约束 alter table student drop primary key;
5.7 添加唯一约束(add unique)
作用:添加唯一约束,保证该字段的所有值不重复(可允许 null 值,且多个 null 值不视为重复),一张表可有多个唯一约束。
语法解释:add unique 索引名(字段名),索引名自定义(建议格式:uk_字段名,如 uk_phone),用于后续删除唯一约束时定位。
实战示例:
-- 给 phone 字段添加唯一约束,索引名 uk_phone(避免重复手机号) alter table student add unique uk_phone(phone);
5.8 删除唯一约束(drop index)
作用:删除表中的唯一约束,删除后该字段的值可重复。
语法解释:drop index 索引名 on 表名,索引名是添加唯一约束时定义的名称(如 uk_phone),若忘记索引名,可通过 show index from 表名 查看。
实战示例:
-- 删除 student 表中 phone 字段的唯一约束(索引名 uk_phone) alter table student drop index uk_phone;
5.9 重命名表(rename to / rename table)
作用:修改数据表的名称,不改变表的结构和数据。
语法解释:有两种写法,效果一致;新表名不能与当前数据库中其他表名重复。
实战示例:
-- 写法1:alter table 旧表名 rename to 新表名 alter table student rename to stu; -- 写法2:rename table 旧表名 to 新表名(可批量重命名) rename table stu to student, class to cls;
6. drop table:删除数据表
核心作用:彻底删除指定的数据表,以及表中的所有数据、表结构,不可恢复,谨慎使用。
语法解释:与 drop database 类似,if exists 可选,用于避免删除不存在的表报错。
实战示例:
-- 直接删除 student 表(若不存在,报错) drop table student; -- 安全删除:判断存在再删除 drop table if exists student; -- 批量删除多个表 drop table if exists student, class;
注意事项:若表被其他表关联(作为外键的被关联表),需先删除关联表,或删除关联的外键约束,才能删除该表。
7. truncate table:清空表数据
核心作用:删除表中所有数据,但保留表结构(与 delete 的区别:truncate 更快、不记录日志、重置自增,delete 可带条件、记录日志、不重置自增)。
语法解释:truncate table 表名,table 可省略;执行后,表结构不变,数据全部清空,主键自增会重置为1(若有自增)。
实战示例:
-- 清空 student 表所有数据,保留表结构,重置自增 truncate table student; -- 简写(省略 table) truncate student;
与 delete 的区别(重点):
truncate:删除所有数据,不可恢复,不记录日志,速度快,重置自增,不能带 where 条件;
delete:可带 where 条件删除部分数据,可恢复(通过日志),记录日志,速度慢,不重置自增。
8. 复制数据表(create table ... as / like)
核心作用:复制已有的数据表,分为“复制表结构+数据”和“只复制表结构(不复制数据)”两种场景,用于快速创建相同结构的表。
语法解释:
create table 新表名 as select * from 旧表名:复制表结构+所有数据;create table 新表名 like 旧表名:只复制表结构(包括字段、数据类型、约束),不复制数据。
实战示例:
-- 1. 复制 student 表的结构+所有数据,新表名 stu_copy create table stu_copy as select * from student; -- 2. 只复制 student 表的结构,不复制数据,新表名 stu_empty create table stu_empty like student; -- 3. 复制指定字段的结构+数据(只复制 name、age、score 字段) create table stu_part as select name,age,score from student;
三、dml 数据操作指令(增删改查,核心,操作表中的数据)
dml(data manipulation language):数据操作语言,用于对表中的数据进行添加、修改、删除、查询,是日常使用最频繁的sql指令,核心是「增删改查四件套」。
1. insert into:插入数据(增)
核心作用:向数据表中插入新的一行或多行数据,插入的数据需符合表的字段类型、约束(如非空字段必须填写)。
常用语法分类(4种场景,覆盖所有插入需求):
1.1 完整插入(不指定字段,按表字段顺序插入)
语法:insert into 表名 values(值1, 值2, 值3, ...)
解释:值的顺序必须与表中字段的顺序完全一致(可通过 desc 表名 查看字段顺序);非空字段必须填写值,允许为空的字段可填 null;自增字段(如 id)可填 null 或不填(自动生成)。
实战示例:
-- 按 student 表字段顺序(id, name, age, gender, class_id, score)插入数据 -- id 是自增,可填 null,自动生成1 insert into student values(null, '张三', 18, '男', 1, 90.5);
1.2 指定字段插入(推荐,最安全)
语法:insert into 表名(字段1, 字段2, ...) values(值1, 值2, ...)
解释:无需按表字段顺序,只需保证“字段名”与“值”一一对应;未指定的字段,若有默认值则用默认值,若无默认值且允许为空,则为 null;非空字段必须包含在指定字段中并填写值。
实战示例:
-- 只插入 name、age、gender、score 字段,class_id 允许为空,自动为 null
insert into student(name, age, gender, score)
values('李四', 17, '女', 88.0);1.3 批量插入(一次性插入多行数据)
语法:insert into 表名(字段1, 字段2, ...) values(值1, 值2, ...), (值1, 值2, ...), ...
解释:在 values 后用逗号分隔多个括号,每个括号代表一行数据;批量插入比单次插入效率更高,适合一次性导入大量数据。
实战示例:
-- 批量插入3行数据,指定 name、age 字段,其他字段用默认值/null
insert into student(name, age)
values('王五', 18),
('赵六', 17),
('孙七', 18);1.4 从另一张表导入数据(批量插入)
语法:insert into 新表名 select 字段1, 字段2, ... from 旧表名 [where 条件]
解释:从旧表中查询数据,将查询结果直接插入到新表中;新表必须已存在,且字段类型、数量与查询的字段一致;可通过 where 条件筛选要导入的数据。
实战示例:
-- 从 student 表中,查询所有18岁的学生,导入到 stu_copy 表中 insert into stu_copy select * from student where age=18; -- 只导入 name、score 字段,且成绩>=80 insert into stu_copy(name, score) select name, score from student where score>=80;
注意事项:插入数据时,值的类型必须与字段类型匹配(如 score 是小数,不能插入字符串);非空字段必须填写,否则报错;自增字段无需手动填写,自动递增。
2. select:查询数据(查)⭐ 最常用
核心作用:从一张或多张表中,查询指定的数据,可通过条件筛选、排序、分页、分组等操作,获取需要的结果,是sql中使用频率最高的指令。
完整语法:select 字段 from 表名 [where 条件] [group by 字段] [having 条件] [order by 字段] [limit 数量]
语法拆解:
select 字段:指定要查询的字段(* 代表所有字段,不推荐,效率低);from 表名:指定要查询的表(多表查询可写多个表名);where 条件:可选,筛选符合条件的行(如 age>17);group by 字段:可选,按指定字段分组(如按班级分组);having 条件:可选,对分组后的结果进行筛选(如平均分>80);order by 字段:可选,对查询结果排序(asc 升序,desc 降序);limit 数量:可选,限制查询结果的条数(用于分页)。
常用查询场景(含详细解释):
2.1 基础查询(无条件,查询所有/指定字段)
-- 1. 查询 student 表所有字段(* 代表所有,不推荐,字段多的时候效率低) select * from student; -- 2. 查询指定字段(推荐,只查需要的字段,效率高) select name, age, score from student; -- 3. 去重查询(distinct):查询所有不重复的班级id(避免重复显示同一个班级) select distinct class_id from student;
解释:distinct 用于去除查询结果中的重复数据,只保留唯一值;若查询多个字段,只有所有字段的值都完全相同,才会被视为重复。
2.2 where 条件筛选(查询符合条件的行)
常用运算符(必须掌握):
比较运算符:
=(等于)、!=/<>(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于);逻辑运算符:
and(并且,同时满足多个条件)、or(或者,满足任意一个条件)、not(非,不满足条件);范围运算符:
between ... and ...(在某个范围内,含边界)、in(值1, 值2, ...)(在指定集合中);模糊匹配:
like(搭配通配符);空值判断:
is null(为空)、is not null(不为空)。
通配符说明(搭配 like 使用):
%:匹配任意长度的字符(包括0个字符),如'张%'匹配所有姓张的人;_:匹配任意一个字符,如'_三'匹配第二个字是“三”的人(如张三、李四三)。
实战示例:
-- 1. 比较运算符:查询年龄大于17,且成绩大于等于80的学生 select * from student where age>17 and score>=80; -- 2. 范围运算符:查询年龄在16到18之间的学生(含16和18) select * from student where age between 16 and 18; -- 3. in 运算符:查询班级id为1、2、3的学生 select * from student where class_id in(1,2,3); -- 4. 模糊查询:查询姓"张"的学生(张后面可以跟任意字符) select * from student where name like '张%'; -- 5. 模糊查询:查询第二个字是"三"的学生(第一个字任意,第二个字是三) select * from student where name like '_三'; -- 6. 空值判断:查询 phone 字段为空的学生 select * from student where phone is null; -- 7. 非空判断:查询 phone 字段不为空的学生 select * from student where phone is not null; -- 8. 逻辑运算符 not:查询成绩不小于60的学生(等价于 score>=60) select * from student where not score<60;
2.3 order by 排序(对查询结果排序)
语法:order by 字段1 [asc/desc], 字段2 [asc/desc]
解释:
asc:升序(默认,可省略),从大到小(如 1、2、3);desc:降序,从大到小(如 3、2、1);多字段排序:先按字段1排序,字段1值相同时,再按字段2排序。
实战示例:
-- 1. 按成绩降序排序(从高到低),默认升序,需显式写 desc select * from student order by score desc; -- 2. 多字段排序:先按年龄升序,年龄相同再按成绩降序 select * from student order by age asc, score desc;
2.4 limit 分页(限制查询结果条数)
语法:有两种写法,适用于不同分页场景:
limit n:查询前 n 条数据(如 limit 3,查询前3条);limit m, n:跳过前 m 条数据,查询后面 n 条数据(如 limit 2,3,跳过2条,取3条,即第3-5条)。
实战示例:
-- 1. 查询前3条学生数据 select * from student limit 3; -- 2. 分页查询:跳过2条,取3条(常用于第2页,每页3条) select * from student limit 2,3; -- 3. 结合排序:查询成绩前3名的学生(先排序,再取前3条) select * from student order by score desc limit 3;
2.5 聚合函数(统计数据,如计数、求和、求平均)
常用聚合函数(必须掌握):
count(*):统计总行数(包括 null 值,最常用);count(字段名):统计该字段非 null 值的行数;sum(字段名):计算该字段的总和(仅适用于数字类型);avg(字段名):计算该字段的平均值(仅适用于数字类型);max(字段名):查询该字段的最大值;min(字段名):查询该字段的最小值。
实战示例:
-- 统计 student 表的总人数(包括所有行,即使有字段为null)
select count(*) as 总人数 from student;
-- 统计成绩非空的学生人数(score 为 null 的不统计)
select count(score) as 有成绩人数 from student;
-- 统计所有学生的总成绩、平均成绩、最高分、最低分
select sum(score) 总成绩,
avg(score) 平均分,
max(score) 最高分,
min(score) 最低分
from student;解释:as 用于给查询结果的列起别名(如 as 总人数),使结果更易读,as 可省略(如 count(*) 总人数)。
2.6 group by 分组 + having 分组过滤
核心区别:
where:行过滤,在分组之前筛选数据(筛选的是单个行);having:分组过滤,在分组之后筛选数据(筛选的是整个分组),必须配合 group by 使用。
语法:select 分组字段, 聚合函数 from 表名 group by 分组字段 having 过滤条件
实战示例:
-- 1. 按班级分组,查询每个班级的人数和平均分
select class_id 班级id,
count(*) 人数,
avg(score) 平均分
from student
group by class_id;
-- 2. 按班级分组,查询平均分>80的班级(分组后过滤)
select class_id 班级id,
avg(score) 平均分
from student
group by class_id
having avg(score) > 80;
-- 3. 先筛选成绩>=60的学生,再按班级分组,查询人数(先where,后分组)
select class_id 班级id,
count(*) 及格人数
from student
where score >= 60
group by class_id;2.7 别名(as):简化查询,提升可读性
作用:给表、字段起别名,简化sql语句,尤其是多表查询时,避免字段名重复。
语法:表名 as 表别名、字段名 as 字段别名,as 可省略。
合理使用别名,能大幅简化复杂sql语句,尤其是多表关联查询时,可避免字段名冲突,同时让sql语句更简洁、可读性更强。以下结合简单示例,帮助快速掌握别名的实用用法,为后续多表查询打下基础。
到此这篇关于mysql完整sql指令实战示例的文章就介绍到这了,更多相关mysql完整sql指令内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论