MySQL 完整SQL指令大全(含详细解释+实战示例)

本文覆盖 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)、默认值、约束(主键、外键等),快速了解表结构。

语法解释 :两个指令完全等价,DESCDESCRIBE 的缩写,更简洁常用,语法为 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语句更简洁、可读性更强。以下结合简单示例,帮助快速掌握别名的实用用法,为后续多表查询打下基础。

相关推荐
YL200404261 小时前
MySQL-进阶篇-SQL优化
数据库·sql·mysql
Irene19911 小时前
MySQL 函数速查表:快速通过在线SQL测试
mysql
Irissgwe1 小时前
redis之典型应用-缓存cache
数据库·redis·缓存·缓存击穿·缓存雪崩·redis淘汰策略
Shely20171 小时前
数据库索引
数据库·mysql
我也不曾来过12 小时前
Mysql
数据库·mysql
小陈工2 小时前
Python异步编程进阶:asyncio高级模式与性能调优
开发语言·前端·数据库·人工智能·python·flask·numpy
gQ85v10Db2 小时前
Redis分布式锁进阶第三十一篇
数据库·redis·分布式
身如柳絮随风扬2 小时前
购物车服务设计:基于 Redis Hash 的高效实现
数据库·redis
观测云2 小时前
观测云4月产品升级报告 | 统一目录、Obsy AI 全新上线,基础设施、场景、监控告警、管理多项能力升级
数据库·人工智能·可观测性·产品迭代·观测云