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+;语法中「[]」内为可选参数,「|」表示二选一,「...」表示可重复。
核心作用:在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 会直接报错。
核心作用:彻底删除指定的数据库,以及数据库内所有的数据表、数据,不可恢复,极其谨慎使用。
语法解释:
DROP DATABASE:固定关键字,标识“删除数据库”操作;
IF EXISTS:可选参数,“如果数据库存在,才删除”,避免删除不存在的数据库报错。
实战示例:
-- 直接删除 school 数据库(若不存在,报错)DROP DATABASE school;-- 安全删除:判断存在再删除DROP DATABASE IF EXISTS school;
注意事项:删除后所有数据丢失,无恢复余地,生产环境禁止随意使用,建议先备份数据。
核心作用:列出MySQL服务器中所有已创建的数据库,包括系统自带的数据库(如 information_schema、mysql、performance_schema)。
语法解释:两个指令完全等价,SHOW DATABASES 更常用,无需额外参数,直接执行即可。
实战示例:
-- 查看所有数据库(最常用)SHOW DATABASES;-- 等价写法,效果一致SHOW SCHEMAS;
补充说明:执行后会显示所有数据库名称,系统数据库建议不要修改或删除,避免MySQL无法正常运行。
核心作用:切换到指定的数据库,后续所有SQL操作(如建表、查数据),都会在这个数据库中执行,相当于“打开文件夹”。
语法解释:USE + 数据库名,无其他可选参数,执行后会提示“Database changed”,表示切换成功。
实战示例:
-- 切换到 school 数据库,后续操作都在 school 库中执行USE school;
注意事项:切换数据库前,必须确保该数据库已存在,否则会报错;每次只能切换到一个数据库,若要操作其他数据库,需再次执行 USE 指令。
核心作用:修改已创建数据库的字符集、排序规则等属性,最常用场景是修复数据库中文乱码(如初始未指定utf8mb4)。
语法解释:
ALTER DATABASE:固定关键字,标识“修改数据库”操作;
数据库名:指定要修改的数据库;
CHARACTER SET:指定新的字符集;
COLLATE:指定新的排序规则(需与字符集匹配)。
实战示例:
-- 将 school 数据库的字符集修改为 utf8mb4,解决中文乱码ALTER DATABASE school CHARACTER SET utf8mb4;-- 同时修改字符集和排序规则ALTER DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
补充说明:修改数据库字符集后,已存在的数据表字符集不会自动修改,需单独修改数据表的字符集。
核心作用:查看指定数据库的完整创建语句,包括字符集、排序规则等信息,便于复制、备份或排查问题(如忘记数据库字符集时)。
语法解释:SHOW CREATE DATABASE + 数据库名,执行后会显示数据库名称和完整的创建SQL语句。
实战示例:
-- 查看 school 数据库的创建语句SHOW CREATE DATABASE school;
补充说明:执行结果中,“Create Database” 后面的内容,就是该数据库的完整创建语法,可直接复制使用。
核心作用:在当前数据库中,新建一张数据表(相当于“文件夹中的文件”),定义表的字段、数据类型、约束(主键、非空等),是存储数据的基础。
语法解释(重点拆解):
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)必须先创建,否则会报错;字段名不能重复,数据类型和约束要根据业务需求选择。
核心作用:查看指定数据表的字段名、数据类型、是否允许为空(Null)、默认值、约束(主键、外键等),快速了解表结构。
语法解释:两个指令完全等价,DESC 是 DESCRIBE 的缩写,更简洁常用,语法为 DESC + 表名。
实战示例:
-- 查看 student 表的结构(常用)DESC student;-- 等价写法DESCRIBE student;
补充说明:执行后会显示5列信息:Field(字段名)、Type(数据类型)、Null(是否允许为空)、Key(约束类型,如 PRI 表示主键)、Default(默认值)、Extra(额外信息,如 auto_increment)。
核心作用:列出当前已切换(USE 指令选中)的数据库中,所有已创建的数据表,快速确认表是否存在。
语法解释:无额外参数,直接执行 SHOW TABLES 即可,若想查看其他数据库的表,需先执行 USE 切换数据库。
实战示例:
-- 查看当前数据库(school)所有数据表SHOW TABLES;
核心作用:查看指定数据表的完整创建语句,包括字段、数据类型、约束、存储引擎、字符集等所有信息,便于复制、备份或修改表结构。
语法解释:SHOW CREATE TABLE + 表名,执行后会显示表名和完整的创建SQL语句,比 DESC 更详细。
实战示例:
-- 查看 student 表的完整创建语句SHOW CREATE TABLE student;
核心作用:修改已创建数据表的结构,包括添加字段、删除字段、修改字段名/数据类型/约束、重命名表、添加/删除主键/外键等,是最常用的表操作指令之一。
语法核心:ALTER TABLE 表名 + 具体操作,不同操作的语法不同,以下分场景详细说明:
作用:给已有的表,新增一个或多个字段,可指定字段位置(如在某个字段后面)。
语法解释:
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();
作用:修改已有字段的数据类型、约束(如非空、默认值),但不修改字段名。
语法解释: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;
作用:修改已有字段的名称,可同时修改数据类型和约束(与 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;
作用:删除表中已有的某个字段,以及该字段对应的所有数据,不可恢复,谨慎使用。
语法解释:DROP COLUMN 字段名,COLUMN 可省略;删除字段后,表结构中该字段消失,对应的数据也会被删除,无法找回。
实战示例:
-- 删除 student 表中的 tel 字段(连带该字段所有数据一起删除)ALTER TABLE student DROP COLUMN tel;-- 批量删除多个字段ALTER TABLE student DROP COLUMN address,DROP COLUMN create_time;
作用:给没有主键的表,添加主键约束(一张表只能有一个主键,主键字段需非空且不重复)。
语法解释:ADD PRIMARY KEY (字段名),字段名需是表中已存在的字段,且该字段没有重复数据、没有 NULL 值。
实战示例:
-- 给 student 表的 id 字段添加主键(若之前未设置主键)ALTER TABLE student ADD PRIMARY KEY (id);
作用:删除表中的主键约束,但不会删除主键字段本身(只是取消“主键”属性);若主键字段有 AUTO_INCREMENT 自增属性,删除主键后,自增属性也会消失。
语法解释:DROP PRIMARY KEY,无需指定字段名(因为一张表只有一个主键)。
实战示例:
-- 删除 student 表的主键约束ALTER TABLE student DROP PRIMARY KEY;
作用:添加唯一约束,保证该字段的所有值不重复(可允许 NULL 值,且多个 NULL 值不视为重复),一张表可有多个唯一约束。
语法解释:ADD UNIQUE 索引名(字段名),索引名自定义(建议格式:uk_字段名,如 uk_phone),用于后续删除唯一约束时定位。
实战示例:
-- 给 phone 字段添加唯一约束,索引名 uk_phone(避免重复手机号)ALTER TABLE student ADD UNIQUE uk_phone(phone);
作用:删除表中的唯一约束,删除后该字段的值可重复。
语法解释:DROP INDEX 索引名 ON 表名,索引名是添加唯一约束时定义的名称(如 uk_phone),若忘记索引名,可通过 SHOW INDEX FROM 表名 查看。
实战示例:
-- 删除 student 表中 phone 字段的唯一约束(索引名 uk_phone)ALTER TABLE student DROP INDEX uk_phone;
作用:修改数据表的名称,不改变表的结构和数据。
语法解释:有两种写法,效果一致;新表名不能与当前数据库中其他表名重复。
实战示例:
-- 写法1:ALTER TABLE 旧表名 RENAME TO 新表名ALTER TABLE student RENAME TO stu;-- 写法2:RENAME TABLE 旧表名 TO 新表名(可批量重命名)RENAME TABLE stu TO student, class TO cls;
核心作用:彻底删除指定的数据表,以及表中的所有数据、表结构,不可恢复,谨慎使用。
语法解释:与 DROP DATABASE 类似,IF EXISTS 可选,用于避免删除不存在的表报错。
实战示例:
-- 直接删除 student 表(若不存在,报错)DROP TABLE student;-- 安全删除:判断存在再删除DROP TABLE IF EXISTS student;-- 批量删除多个表DROP TABLE IF EXISTS student, class;
注意事项:若表被其他表关联(作为外键的被关联表),需先删除关联表,或删除关联的外键约束,才能删除该表。
核心作用:删除表中所有数据,但保留表结构(与 DELETE 的区别:TRUNCATE 更快、不记录日志、重置自增,DELETE 可带条件、记录日志、不重置自增)。
语法解释:TRUNCATE TABLE 表名,TABLE 可省略;执行后,表结构不变,数据全部清空,主键自增会重置为1(若有自增)。
实战示例:
-- 清空 student 表所有数据,保留表结构,重置自增TRUNCATE TABLE student;-- 简写(省略 TABLE)TRUNCATE student;
与 DELETE 的区别(重点):
TRUNCATE:删除所有数据,不可恢复,不记录日志,速度快,重置自增,不能带 WHERE 条件;
DELETE:可带 WHERE 条件删除部分数据,可恢复(通过日志),记录日志,速度慢,不重置自增。
核心作用:复制已有的数据表,分为“复制表结构+数据”和“只复制表结构(不复制数据)”两种场景,用于快速创建相同结构的表。
语法解释:
CREATE TABLE 新表名 AS SELECT * FROM 旧表名:复制表结构+所有数据;
CREATE TABLE 新表名 LIKE 旧表名:只复制表结构(包括字段、数据类型、约束),不复制数据。
实战示例:
-- 1. 复制 student 表的结构+所有数据,新表名 stu_copyCREATE TABLE stu_copy AS SELECT * FROM student;-- 2. 只复制 student 表的结构,不复制数据,新表名 stu_emptyCREATE TABLE stu_empty LIKE student;-- 3. 复制指定字段的结构+数据(只复制 name、age、score 字段)CREATE TABLE stu_part AS SELECT name,age,score FROM student;
DML(Data Manipulation Language):数据操作语言,用于对表中的数据进行添加、修改、删除、查询,是日常使用最频繁的SQL指令,核心是「增删改查四件套」。
核心作用:向数据表中插入新的一行或多行数据,插入的数据需符合表的字段类型、约束(如非空字段必须填写)。
常用语法分类(4种场景,覆盖所有插入需求):
语法:INSERT INTO 表名 VALUES(值1, 值2, 值3, ...)
解释:值的顺序必须与表中字段的顺序完全一致(可通过 DESC 表名 查看字段顺序);非空字段必须填写值,允许为空的字段可填 NULL;自增字段(如 id)可填 NULL 或不填(自动生成)。
实战示例:
-- 按 student 表字段顺序(id, name, age, gender, class_id, score)插入数据-- id 是自增,可填 NULL,自动生成1INSERT INTO student VALUES(NULL, '张三', 18, '男', 1, 90.5);
语法:INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...)
解释:无需按表字段顺序,只需保证“字段名”与“值”一一对应;未指定的字段,若有默认值则用默认值,若无默认值且允许为空,则为 NULL;非空字段必须包含在指定字段中并填写值。
实战示例:
-- 只插入 name、age、gender、score 字段,class_id 允许为空,自动为 NULLINSERT INTO student(name, age, gender, score)VALUES('李四', 17, '女', 88.0);语法:INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...), (值1, 值2, ...), ...
解释:在 VALUES 后用逗号分隔多个括号,每个括号代表一行数据;批量插入比单次插入效率更高,适合一次性导入大量数据。
实战示例:
-- 批量插入3行数据,指定 name、age 字段,其他字段用默认值/NULLINSERT INTO student(name, age)VALUES('王五', 18), ('赵六', 17), ('孙七', 18);语法:INSERT INTO 新表名 SELECT 字段1, 字段2, ... FROM 旧表名 [WHERE 条件]
解释:从旧表中查询数据,将查询结果直接插入到新表中;新表必须已存在,且字段类型、数量与查询的字段一致;可通过 WHERE 条件筛选要导入的数据。
实战示例:
-- 从 student 表中,查询所有18岁的学生,导入到 stu_copy 表中INSERT INTO stu_copy SELECT * FROM student WHERE age=18;-- 只导入 name、score 字段,且成绩>=80INSERT INTO stu_copy(name, score) SELECT name, score FROM student WHERE score>=80;
注意事项:插入数据时,值的类型必须与字段类型匹配(如 score 是小数,不能插入字符串);非空字段必须填写,否则报错;自增字段无需手动填写,自动递增。
核心作用:从一张或多张表中,查询指定的数据,可通过条件筛选、排序、分页、分组等操作,获取需要的结果,是SQL中使用频率最高的指令。
完整语法:SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 字段] [HAVING 条件] [ORDER BY 字段] [LIMIT 数量]
语法拆解:
SELECT 字段:指定要查询的字段(* 代表所有字段,不推荐,效率低);
FROM 表名:指定要查询的表(多表查询可写多个表名);
WHERE 条件:可选,筛选符合条件的行(如 age>17);
GROUP BY 字段:可选,按指定字段分组(如按班级分组);
HAVING 条件:可选,对分组后的结果进行筛选(如平均分>80);
ORDER BY 字段:可选,对查询结果排序(ASC 升序,DESC 降序);
LIMIT 数量:可选,限制查询结果的条数(用于分页)。
常用查询场景(含详细解释):
-- 1. 查询 student 表所有字段(* 代表所有,不推荐,字段多的时候效率低)SELECT * FROM student;-- 2. 查询指定字段(推荐,只查需要的字段,效率高)SELECT name, age, score FROM student;-- 3. 去重查询(DISTINCT):查询所有不重复的班级ID(避免重复显示同一个班级)SELECT DISTINCT class_id FROM student;
解释:DISTINCT 用于去除查询结果中的重复数据,只保留唯一值;若查询多个字段,只有所有字段的值都完全相同,才会被视为重复。
常用运算符(必须掌握):
比较运算符:=(等于)、!=/<>(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于);
逻辑运算符: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;
语法:ORDER BY 字段1 [ASC/DESC], 字段2 [ASC/DESC]
解释:
ASC:升序(默认,可省略),从大到小(如 1、2、3);
DESC:降序,从大到小(如 3、2、1);
多字段排序:先按字段1排序,字段1值相同时,再按字段2排序。
实战示例:
-- 1. 按成绩降序排序(从高到低),默认升序,需显式写 DESCSELECT * FROM student ORDER BY score DESC;-- 2. 多字段排序:先按年龄升序,年龄相同再按成绩降序SELECT * FROM student ORDER BY age ASC, score DESC;
语法:有两种写法,适用于不同分页场景:
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;
常用聚合函数(必须掌握):
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(*) 总人数)。
核心区别:
WHERE:行过滤,在分组之前筛选数据(筛选的是单个行);
HAVING:分组过滤,在分组之后筛选数据(筛选的是整个分组),必须配合 GROUP BY 使用。
语法:SELECT 分组字段, 聚合函数 FROM 表名 GROUP BY 分组字段 HAVING 过滤条件
实战示例:
-- 1. 按班级分组,查询每个班级的人数和平均分SELECT class_id 班级ID, COUNT(*) 人数, AVG(score) 平均分FROM studentGROUP BY class_id;-- 2. 按班级分组,查询平均分>80的班级(分组后过滤)SELECT class_id 班级ID, AVG(score) 平均分FROM studentGROUP BY class_idHAVING AVG(score) > 80;-- 3. 先筛选成绩>=60的学生,再按班级分组,查询人数(先WHERE,后分组)SELECT class_id 班级ID, COUNT(*) 及格人数FROM studentWHERE score >= 60GROUP BY class_id;
作用:给表、字段起别名,简化SQL语句,尤其是多表查询时,避免字段名重复。
语法:表名 AS 表别名、字段名 AS 字段别名,AS 可省略。
合理使用别名,能大幅简化复杂SQL语句,尤其是多表关联查询时,可避免字段名冲突,同时让SQL语句更简洁、可读性更强。以下结合简单示例,帮助快速掌握别名的实用用法,为后续多表查询打下基础。