本文覆盖 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语句更简洁、可读性更强。以下结合简单示例,帮助快速掌握别名的实用用法,为后续多表查询打下基础。