MySQL 基础操作全汇总
本文整理了 MySQL 核心操作:含服务连接、库表创建与增删改查、表关系与外键约束、多表连接查询(交叉 / 内 / 外连接)、索引管理(主索引 / 唯一索引等)、视图操作及用户权限配置。
1.MySQL 连接
net start mysql80 //启动mysql服务
mysql -u root -h 127.0.0.1 -P 3306 -p
123456 //等价于 `mysql -uroot -p123465`
-u 用户的意思 :root 超级管理员
-h hostname 主机名: localhost 本机 | 127.0.0.1 本机网卡
-P 端口号 : 3306
-p password: 密码
exit; //退出mysql
2.Databases核心操作
-
show databases;查看数据库
-
use 数据库名;打开数据库
-
\s==status;显示数据库的详细信息
-
show profiles;
显示SQL语句执行的资源消耗情况。可以用于SQL的调优测量。默认情况下,参数处于关闭状态,并保存最近 15 次的运行结果,需先 set profiling=1;
-
create 数据库名创建数据库
create database 数据库名 default charset gbk collate gbk_chinese_ci;create database 图书馆 default charset gbk collate gbk_bin;在建立数据库时,将数据库修改为支持中文的格式
- 若需数据库支持中文,
default charset gbk是基础配置(确保中文能正确存储)。 - 选择
collate gbk_chinese_ci适合大多数中文业务(常规比较,不区分英文大小写); - 选择
collate gbk_bin适合需要严格区分字符编码的场景(如区分英文大小写)。
(注:现在更推荐使用
utf8mb4字符集,它支持所有 Unicode 字符(包括中文、emoji 等),兼容性更好,可替代gbk。) - 若需数据库支持中文,
-
drop database if exists 数据库名;删除数据库,如选择了 if exists 命令,那么会先查找要删除的数据库,查找到了再删除
-
\q==quit;退出mysql
3.Table的操作
3.1 表的基本操作
表的基本操作,分别为建立表,显示表的结构,对表输入内容,检索表的内容,以及修改表的结构
- 创建表:
create table 表名(字段名 类型 约束...);(支持基于检索内容创建新表或空表)
-
查看表结构:
desc 表名;、show create table 表名 \G; -
修改表结构: ○ 添加字段:`alter table 表名 add 字段名 类型 约束 [first|after 字段];` ○ 删除字段:`alter table 表名 drop 字段名 [约束];` ○ 修改字段(类型 / 名称):`modify`(仅类型)、`change`(名称 + 类型)alter table 表名 add primary key (字段); // 添加主索引 alter table 旧名 rename to 新名; // 修改表的名称 alter table 表名 modify 原字段名 新类型 [新约束]; // 修改字段类型 alter table 表名 change change 原字段名 新字段名 新类型 [新约束] ; //修改字段的名称和类型
3.2 表记录操作(增删改查)
3.2.1 插入记录 (insert)
insert into 表名 (字段...) values (值...);(字段顺序匹配时可省略字段名)
3.2.2 删除记录 (delete)
delete from 表名 where 条件;、清空表:truncate 表名;
3.2.3 检索记录(SELECT 详解)
(1).基础查询:查询指定字段或所有字段
-- 查询指定字段
SELECT 字段1, 字段2, ... FROM 表名;
-- 查询所有字段(* 代表所有字段)
SELECT * FROM 表名;
(2). 别名机制:自定义字段或表的显示名称(AS)
-- 字段别名
SELECT 字段1 AS 别名1, 字段2 别名2 FROM 表名;
-- 表别名(多表查询时常用,简化表名书写)
SELECT 别名.字段1, 别名.字段2 FROM 表名 AS(可省略) 别名;
(3). 聚合函数:对数据进行计算
常用函数:
count(字段):统计非空值的行数(count(*)统计所有行数,包括空值);sum(字段):计算数值字段的总和;max(字段):求字段的最大值;min(字段):求字段的最小值;avg(字段):求字段的平均值;distinct(字段):去除字段中的重复值 (常与其他函数搭配)。
SELECT 聚合函数(字段) [AS 别名] FROM 表名;
(4). 分页查询:限制返回结果的行数(LIMIT)
-- 只返回前 n 条记录(从第 0 行开始取 n 行)
SELECT 字段 FROM 表名 LIMIT n;
-- 从第 m 行(起始行从 0 开始)开始,取 n 条记录
SELECT 字段 FROM 表名 LIMIT m, n;
(5). 条件查询:筛选符合条件的记录(WHERE)
常用条件运算符:
- 比较:
=(等于)、!=/<>(不等于)、>、<、>=、<=; - 逻辑:
AND(且)、OR(或)、NOT(非); - 范围:
IN(值1, 值2...)(在指定集合中)、BETWEEN 值1 AND 值2(在值 1 到值 2 之间,包含边界)。
SELECT 字段 FROM 表名 WHERE 条件;
(6). 模糊查询:匹配含特定字符的记录(LIKE)
通配符:
%:匹配任意数量的字符(包括 0 个);_:匹配恰好 1 个字符。
SELECT 字段 FROM 表名 WHERE 字段 LIKE '通配符表达式';
(7). 嵌套查询:用一个查询的结果作为另一个查询的条件(子查询)
SELECT 字段 FROM 表名 WHERE 字段 条件运算符 (子查询);
-- 条件 为‘=’时,子查询返回单个值时用 =;返回多个值时用 IN
(8). 分组查询:按字段分组统计(GROUP BY + HAVING)
GROUP BY 字段:指定分组的字段;HAVING 条件:筛选分组后的结果(类似WHERE,但HAVING可跟聚合函数,WHERE不行)。
SELECT 分组字段, 聚合函数(字段) FROM 表名 GROUP BY 分组字段 HAVING 分组条件;
(9). 排序查询:按字段升序 / 降序排列(ORDER BY)
ASC:升序(默认,从小到大,可省略);DESC:降序(从大到小);- 多字段排序:先按第一个字段排序,若有相同值,再按第二个字段排序。
SELECT 字段 FROM 表名 ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC];
(10). 检索辅助命令:分析查询性能
EXPLAIN + SELECT 语句:查看查询的执行计划(如是否使用索引、表连接顺序等),用于优化 SQL。
示例:
EXPLAIN SELECT * FROM 学籍表 WHERE 入学成绩 > 500;
show global status like 'com_______':查看各类 SQL 命令的执行次数(_______ 是 7 个下划线,匹配 7 个字符的命令,如 Com_select 表示查询次数)。
示例:
show global status like 'Com_select'; -- 查看SELECT命令执行的总次数
3.2.4 修改记录
- 修改记录:
update 表名 set 字段=值... where 条件;
3.3 表关系与外键(详细笔记)
(1). 外键的核心概念
外键(Foreign Key)是数据库中用于建立两个表之间关联的约束,其作用是保证数据的一致性和完整性(例如:子表中引用的字段值,必须在主表中存在)
- 主表:被引用的表
- 子表:引用主表的表
- 外键字段:子表中用于关联主表主键的字段
- 一共有 **primary(主索引) **、**fulltext(全文索引) **、unique(唯一索引)、index(普通索引) 四个索引
(2). 添加外键(3 种场景)
外键可以在 “表已存在” 或 “表未创建” 时添加,也支持为已有外键的字段添加新外键(需注意约束名唯一)。
场景 1:两个表已存在时,给子表添加外键
alter table 子表名
add constraint 外键约束名 -- 自定义外键的名称(唯一标识,方便后续删除/查看)
foreign key (子表中的外键字段) -- 子表中用于关联的字段
references 主表名(主表中的主键字段); -- 主表中被关联的主键字段
-- 注意:外键约束名:fk_子表_主表(建议命名规范,便于识别)
作用:在已存在的子表中,通过外键字段关联主表的主键,强制子表数据依赖主表。
注意:
- 子表的外键字段类型必须与主表的主键字段类型一致(如都是
varchar(10))。 - 主表的被关联字段必须是主键(
primary key)或唯一索引(unique),否则无法建立外键。
场景 2:两个表未创建时,创建子表时直接定义外键
-- 先创建主表(含主键)
create table 主表名(
主键字段 类型 primary key,
...其他字段...
);
-- 创建子表时,在字段后直接定义外键
create table 子表名(
子表主键字段 类型 primary key,
外键字段 类型, -- 与主表主键字段类型一致
...其他字段...,
constraint 外键约束名 -- 外键约束名
foreign key (外键字段) references 主表名(主键字段)
);
作用:在创建子表的同时建立与主表的关联,一步完成表结构和外键约束。
场景 3:子表的字段已有外键时,添加新的外键
语法:
alter table 子表名
add constraint 新外键约束名 -- 新约束名必须与已有外键约束名不同
foreign key (外键字段)
references 新主表名(新主表主键字段);
作用:一个字段可以关联多个主表(需满足类型匹配),添加新外键时需用新的约束名。
(3). 删除外键
语法:
alter table 子表名
drop foreign key 外键约束名; -- 必须使用添加外键时定义的约束名
注意:删除外键时,只需要外键约束名,不需要指定字段(因为约束名唯一对应一个外键)。
(4). 查看外键
语法:
show create table 子表名 \G; -- \G 用于将结果竖排显示,更易读
(5). 外键的核心约束规则(重要)
- 插入限制:子表插入数据时,外键字段的值必须在主表的主键字段中存在(否则插入失败)。
- 删除限制:主表删除记录时,若子表中存在关联该记录的外键值,删除会失败(需先删除子表的关联记录,或设置外键级联规则,如
ON DELETE CASCADE)。
4.多表查询
表与表之间连接查询的形式分为交叉连接、内连接、自连接、外连接(左外连接、右外连接、全连接)
4.1.交叉连接(Cross Join)
定义:将两个表的所有记录进行 “笛卡尔积” 组合(即表 1 的每条记录与表 2 的每条记录都匹配一次),结果行数 = 表 1 行数 × 表 2 行数。适用场景:几乎不直接使用(结果通常冗余),但可作为其他连接的基础。
语法:
-- 基础语法(表名直接并列)
SELECT 字段 FROM 表1 表2;
-- 用别名简化(多表查询常用,避免字段名冲突)
SELECT 别名1.字段, 别名2.字段 FROM 表1 别名1, 表2 别名2;
特点:
- 结果包含所有可能的组合,通常需要配合
WHERE子句筛选有效数据(否则无实际意义); - 等价于
SELECT ... FROM 表1 CROSS JOIN 表2;(CROSS JOIN是标准关键字,可省略)。
4.2.内连接(Inner Join)
定义:只保留两个表中 “满足连接条件” 的记录(即两表中匹配的记录),不匹配的记录会被过滤。
适用场景:查询两个表中存在关联关系的数据(如 “学生” 和 “他们选的课程”)。
语法:有两种写法(功能相同,推荐第二种标准写法):
-- 写法1:92年SQL标准(用WHERE子句指定连接条件)
SELECT [别名1].字段,[别名2].字段 FROM 表1 [别名1], 表2 [别名2]
WHERE 别名1.关联字段 = 别名2.关联字段; -- 核心:两表的关联字段相等
-- 写法2:99年SQL标准(用JOIN ... ON指定连接条件,更清晰)
-- //当有多个条件时使用 && 对多个条件进行整合
SELECT [[别名1].字段,[别名2].字段 FROM 表1 [别名1]
INNER JOIN 表2 [别名2] -- INNER可省略,简写为JOIN
ON 别名1.关联字段 = 别名2.关联字段; -- ON后是连接条件
特点:
- 只返回匹配的记录,不匹配的记录(如没有成绩的学生、没有对应学生的成绩)会被排除;
- 支持多条件连接(用
AND添加额外条件,如ON s.学号=sc.学号 AND sc.成绩>60)。
4.3. 自连接(Self Join)
定义:将同一张表视为 “两张表”(用别名区分),进行自身连接,用于查询表中 “记录之间的关联关系”(如层级关系、对比关系)。
适用场景:表中存在 “自关联字段”(如员工表中的 “上级 ID” 关联同表的 “员工 ID”)。
语法:
-- 写法1:92年SQL标准(用WHERE子句指定连接条件)
SELECT 别名1.字段, 别名2.字段
FROM 表名 别名1, 表名 别名2 -- 同一张表用不同别名(如a和b)
WHERE 别名1.关联字段 = 别名2.关联字段; -- 用表中自关联字段连接
-- 写法2:99年SQL标准(用JOIN ... ON指定连接条件,更清晰)
-- //当有多个条件时使用 && 对多个条件进行整合
SELECT [[别名1].字段,[别名2].字段 FROM 表1 [别名1]
INNER JOIN 表2 [别名2] -- INNER可省略,简写为JOIN
ON 别名1.关联字段 = 别名2.关联字段; -- ON后是连接条件
特点:
- 本质是特殊的内连接,只是连接的是同一张表;
- 必须用别名区分 “两个表”(否则无法识别字段归属);
- 常用于查询层级关系(如部门上下级、员工上下级)或同表内的对比数据(如同一学生的不同成绩)。
4.4. 外连接(Outer Join)
定义:不仅保留匹配的记录,还会保留其中一张表(或两张表)中 “不匹配的记录”,不匹配的字段用NULL填充。
分类:左外连接、右外连接、全外连接。
(1)左外连接(Left Outer Join)
定义:保留 “左表” 的所有记录,即使右表中没有匹配的记录(右表不匹配的字段用NULL填充)。
语法:
SELECT 字段 FROM 左表 别名1
LEFT JOIN 右表 别名2 -- LEFT OUTER JOIN的简写(OUTER可省略)
ON 别名1.关联字段 = 别名2.关联字段;
结果特点:
- 有成绩的学生:显示对应成绩;
- 没有成绩的学生:
成绩字段显示NULL(但学生信息仍会保留)。
(2)右外连接(Right Outer Join)
定义:保留 “右表” 的所有记录,即使左表中没有匹配的记录(左表不匹配的字段用NULL填充)。
语法:
SELECT 字段
FROM 左表 别名1
RIGHT JOIN 右表 别名2 -- RIGHT OUTER JOIN的简写
ON 别名1.关联字段 = 别名2.关联字段;
结果特点:
- 有对应学生的成绩:显示学生姓名;
- 无对应学生的成绩(如学号错误):
姓名字段显示NULL(但成绩记录仍会保留)。
(3)全外连接(Full Outer Join)
定义:保留左表和右表的所有记录,两表中不匹配的字段分别用NULL填充(MySQL 不直接支持FULL JOIN,需用UNION或UNION ALL模拟)。
语法:
-- 用UNION ALL合并左外连接和右外连接的结果(去重需用UNION)
SELECT 字段 FROM 左表 LEFT JOIN 右表 ON 关联条件
UNION ALL -- 合并结果(保留重复记录);UNION会自动去重
SELECT 字段 FROM 左表 RIGHT JOIN 右表 ON 关联条件;
注意事项:
UNION ALL要求两部分查询的 “字段数相同” 且 “字段类型一致”(否则报错);UNION会自动去重,UNION ALL保留所有记录(效率更高,推荐在确认无重复时使用)。
5.索引管理
索引是数据库中用于加速查询速度的特殊数据结构(类似书籍的目录),通过提前排序和存储字段值与记录位置的映射,避免全表扫描。
5.1. 主索引(Primary Key,主键索引)
定义:是表中唯一标识每条记录的索引,具有唯一性(字段值不可重复)和非空性(字段值不能为NULL)。一个表只能有一个主索引。
作用:
- 唯一标识记录(如 “学籍表” 的 “学号”,确保每个学生有唯一编号);
- 加速基于主键的查询(如
where 学号='32220120311'); - 作为外键关联的基础(子表通常关联主表的主键)。
-- 方式1:创建表时定义主索引(最常用)
CREATE TABLE 表名 (
字段名 数据类型 PRIMARY KEY, -- 字段同时作为主索引
其他字段 数据类型 [约束],
...
);
-- 单独声明(适合多字段主键,即联合主键,极少用)
CREATE TABLE 表名 (
字段1 数据类型,
字段2 数据类型,
PRIMARY KEY (字段1, 字段2) -- 多个字段联合作为主索引(需确保组合唯一)
);
-- -------------------------------------------------------------------
-- 方式2:表已存在时添加主索引(需确保字段无重复值且非空)
ALTER TABLE 表名
ADD PRIMARY KEY (字段名); -- 需确保字段值唯一且非空,否则报错
-- -------------------------------------------------------------------
-- 删除主索引
ALTER TABLE 表名
DROP PRIMARY KEY; -- 主索引唯一,无需指定名称
注意:
- 主索引字段默认会被 MySQL 自动排序,查询时效率极高;
- 若表中没有显式定义主键,MySQL 会隐式创建一个隐藏的主键(用于内部管理)。
5.2. 唯一索引(Unique Index)
定义:确保索引字段的值唯一(不允许重复),但允许为NULL(且多个NULL视为不重复)。一个表可以有多个唯一索引。
作用:
- 限制字段值的唯一性(如 “学生表” 的 “身份证号”,不允许重复但可暂为空);
- 加速基于该字段的查询(效率略低于主索引,但高于普通索引)。
语法:
-- (1)创建表时定义唯一索引
-- 方式1:字段后直接声明(隐式索引名)
CREATE TABLE 表名 (
字段名 数据类型 UNIQUE, -- 直接在字段后加unique(隐式创建唯一索引)
其他字段 数据类型 [约束],
...
);
-- 方式2:显式指定唯一索引名(推荐,便于管理)
CREATE TABLE 表名 (
字段名 数据类型,
其他字段 数据类型 [约束],
UNIQUE INDEX 索引名 (字段名 [ASC|DESC]) -- ASC/DESC指定排序(默认ASC)
);
-----------------------------------------------------------------------
-- (2)表已存在时添加唯一索引
-- 方式1:用CREATE INDEX
CREATE UNIQUE INDEX 索引名
ON 表名 (字段名 [ASC|DESC]);
-- 方式2:用ALTER TABLE
ALTER TABLE 表名
ADD UNIQUE INDEX 索引名 (字段名 [ASC|DESC]);
-- --------------------------------------------------------------------
-- (3)删除唯一索引
-- 方式1:用DROP INDEX
DROP INDEX 索引名 ON 表名;
-- 方式2:用ALTER TABLE
ALTER TABLE 表名
DROP INDEX 索引名;
与主索引的区别:
- 主索引:唯一且非空,一个表只能有一个;
- 唯一索引:唯一但可空,一个表可以有多个。
5.3. 普通索引(Normal Index)
定义:最基础的索引,无唯一性限制(字段值可重复),允许为NULL。主要用于加速查询,不影响数据本身的约束。
作用:无约束,仅加速查询(最常用)。
语法:
-- (1)创建表时定义普通索引
CREATE TABLE 表名 (
字段名 数据类型,
其他字段 数据类型 [约束],
INDEX 索引名 (字段名 [长度] [ASC|DESC]) -- 长度:如字段是varchar(20),可只索引前3位(字段名(3))
);
-- --------------------------------------------------------------------
-- (2)表已存在时添加普通索引
-- 方式1:用CREATE INDEX
CREATE INDEX 索引名
ON 表名 (字段名 [长度] [ASC|DESC]);
-- 方式2:用ALTER TABLE
ALTER TABLE 表名
ADD INDEX 索引名 (字段名 [长度] [ASC|DESC]);
-- --------------------------------------------------------------------
-- 删除 普通索引
-- 同唯一索引删除语法
DROP INDEX 索引名 ON 表名;
-- 或
ALTER TABLE 表名 DROP INDEX 索引名;
注意:
- 普通索引是 “查询加速工具”,但会占用额外存储空间,且会略微降低数据插入 / 更新的速度(因为索引需要同步维护);
- 可指定 “索引长度”(如
手机号(3)),只对字段的前 n 个字符建立索引(适合长字符串字段,节省空间)。
5.4. 索引类型(按字段数量划分)
根据索引包含的字段数量,可分为单列索引、多列索引、全文索引:
(1)单列索引
定义:基于单个字段创建的索引(主索引、唯一索引、普通索引都可以是单列索引)。
-- 为“姓名”单个字段创建普通单列索引
create index 索引名 on 表名(字段);
适用场景:查询条件只涉及单个字段
(2)多列索引(复合索引)
定义:加速多字段联合查询(遵循 “最左前缀原则”)。
创建多列索引(普通 / 唯一均可)
-- 普通多列索引
CREATE INDEX 索引名
ON 表名 (字段1 [长度], 字段2 [长度], ... [ASC|DESC]); -- 字段顺序影响生效性
-- 唯一多列索引(字段组合需唯一)
CREATE UNIQUE INDEX 索引名
ON 表名 (字段1 [长度], 字段2 [长度], ...);
删除多列索引
-- 同单列索引,按索引名删除
DROP INDEX 索引名 ON 表名;
最左前缀原则(关键):多列索引的生效顺序由左到右,只有查询条件包含 “最左字段” 时,索引才会生效。
- 示例中索引(性别, 籍贯):
- 有效查询:
where 性别='男'(包含最左字段)、where 性别='男' and 籍贯='北京'(包含所有字段); - 无效查询:
where 籍贯='北京'(不包含最左字段 “性别”,索引不生效)。
- 有效查询:
(3)全文索引(Fulltext Index)
定义:专门用于大文本字段(如text类型)的模糊查询,支持按关键词匹配(替代like '%关键词%',效率更高)。
作用:加速大文本字段(text/varchar)的关键词查询。
-- 方式1:创建表时定义全文索引
CREATE TABLE 表名 (
字段名 TEXT, -- 仅支持TEXT、VARCHAR、CHAR类型
FULLTEXT INDEX 索引名 (字段名)
);
-- 方式2:表已存在时添加
ALTER TABLE 表名
ADD FULLTEXT INDEX 索引名 (字段名);
使用方法:需用match...against语法查询,不能用普通like:
SELECT * FROM 表名
WHERE MATCH(字段名) AGAINST('关键词1 关键词2 ...'); -- 不能用LIKE,必须用MATCH...AGAINST
删除全文索引
DROP INDEX 索引名 ON 表名;
查看表中所有索引
-- 方式1:查看索引详情(推荐)
SHOW INDEX FROM 表名;
-- 方式2:查看表创建语句(包含索引定义)
SHOW CREATE TABLE 表名 \G; -- \G竖排显示,更清晰
注意:
- 全文索引仅支持
char、varchar、text类型字段; - MySQL 默认忽略太短的关键词(如长度 < 4 的词),且不支持中文(需借助插件或使用其他数据库如 Elasticsearch)。
5.5.语法要点总结
- 索引名在表中必须唯一,建议命名规范:
idx_字段名(普通索引)、uk_字段名(唯一索引)、ft_字段名(全文索引)。 - 多列索引的字段顺序至关重要(最左前缀原则),需按查询频率排序(最常用的字段放左边)。
- 主索引和唯一索引会自动检查数据唯一性,插入重复值会报错;普通索引无此约束。
6.视图操作
视图(View)是基于 SQL 查询结果的虚拟表,它本身不存储实际数据,只保存查询逻辑(相当于 “预定义的查询语句”)。通过视图可以简化复杂查询、控制数据访问权限,或让数据展示更符合业务需求。
6.1. 视图的核心概念
-
虚拟性:视图没有实际的物理存储,数据来源于 “底层表”(视图基于的表),底层表数据变化时,视图结果会自动同步。
-
查询逻辑:视图本质是一条预存的
SELECT语句,每次查询视图时,数据库会执行这条语句并返回结果。 -
作用:
- 简化复杂查询(将多表连接、聚合计算等封装成视图,无需重复写复杂 SQL);
- 控制数据访问(只向用户暴露部分字段,隐藏敏感信息,如隐藏 “学生表” 的 “身份证号”,只展示 “学号”“姓名”);
- 保持查询一致性(多场景复用同一视图,避免重复编写相同逻辑)。
6.2. 创建视图(核心操作)
CREATE VIEW 视图名 [ (视图字段别名1, 视图字段别名2, ...) ]
AS
SELECT 查询语句; -- 可以是单表查询、多表连接、聚合查询等
说明:
视图名:命名规则同表名(避免与表重名),建议加前缀(如v_)区分(如v_student_score)。视图字段别名:可选,若省略则默认使用SELECT语句中字段的名称(或字段别名)。SELECT语句:可以包含WHERE、JOIN、GROUP BY`、聚合函数等,几乎支持所有查询语法。
示例:
(1)基于单表创建视图(简化查询)
-- 场景:“学生表”包含学号、姓名、身份证号、性别、籍贯等字段,需创建一个只展示“非敏感信息”的视图
CREATE VIEW v_student_basic -- 视图名:v_前缀标识视图
AS
SELECT 学号, 姓名, 性别, 籍贯 -- 只包含非敏感字段
FROM 学生表; -- 底层表是“学生表”
查询视图:SELECT * FROM v_student_basic; 等价于执行视图中的SELECT语句,结果只显示学号、姓名、性别、籍贯。
(2)基于多表连接创建视图(简化跨表查询)
-- 场景:需频繁查询“学生姓名”和对应的“课程名”“成绩”,涉及“学生表”“选课表”“课程表”三表连接
CREATE VIEW v_student_course -- 视图名
(学生学号, 学生姓名, 课程名称, 考试成绩) -- 显式指定视图字段别名(可选)
AS
SELECT
s.学号,
s.姓名,
c.课程名,
sc.成绩
FROM 学生表 s
JOIN 选课表 sc ON s.学号 = sc.学号
JOIN 课程表 c ON sc.课程代码 = c.课程代码; -- 三表连接查询
查询视图:SELECT * FROM v_student_course WHERE 考试成绩 > 90; 直接得到 “90 分以上的学生及课程”,无需重复写三表连接逻辑。
(3)基于聚合查询创建视图(统计报表)
-- 场景:需统计“每个班级的男生、女生人数”,基于“学生表”的聚合查询
CREATE VIEW v_class_gender_count
AS
SELECT
班级号,
性别,
COUNT(*) AS 人数 -- 聚合函数:统计人数
FROM 学生表
GROUP BY 班级号, 性别; -- 按班级和性别分组
查询视图:SELECT * FROM v_class_gender_count; 直接得到各班性别分布统计,无需重复写GROUP BY逻辑。
6.3. 查看视图
-- 方式1:查看视图结构(类似查看表结构)
DESC 视图名;
-- 方式2:查看视图的创建语句(含查询逻辑)
SHOW CREATE VIEW 视图名 \G; -- \G竖排显示,更清晰
-- 方式3:查看数据库中所有视图(需查询系统表)
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '数据库名';
6.4. 修改视图
若需调整视图的查询逻辑,可直接修改视图定义(无需删除重建)。
-- 方式1:CREATE OR REPLACE(若视图存在则替换,不存在则创建)
CREATE OR REPLACE VIEW 视图名
AS
新的SELECT语句;
-- 方式2:ALTER VIEW(直接修改已有视图)
ALTER VIEW 视图名
AS
新的SELECT语句;
6.5. 删除视图
当视图不再需要时,可删除(不影响底层表数据)。
DROP VIEW [IF EXISTS] 视图名; -- IF EXISTS:避免视图不存在时报错
6. 6 视图的使用限制
更新限制:不是所有视图都能执行INSERT/UPDATE/DELETE修改视图数据会同步到底层表)。
-
可更新的视图:通常是单表视图,且
SELECT语句中无DISTINCT、GROUP BY、聚合函数等。 -
不可更新的视图:多表连接视图、含聚合函数的视图(如
v_class_gender_count),执行修改会报错。 -
性能注意:复杂视图(多表连接、聚合)的查询效率可能较低,需优化底层
SELECT语句。
总结:视图 vs 表
| 对比项 | 视图(View) | 表(Table) |
|---|---|---|
| 数据存储 | 不存储数据,依赖底层表 | 存储实际数据 |
| 本质 | 预定义的SELECT语句 | 物理存在的数据集 |
| 更新限制 | 受查询逻辑限制(多数不可更新) | 无特殊限制(符合约束即可) |
| 用途 | 简化查询、控制权限 | 存储原始数据 |
7.用户与权限管理
- 创建用户:
create user '用户名'@'主机' identified by '密码';(%表示所有主机) - 修改用户密码:
alter user '用户名'@'主机' identified by '新密码'; - 删除用户:
drop user '用户名'@'主机'; - 权限分配:
grant 权限 on 库.表 to '用户'@'主机';(all表示所有权限,*.*表示所有库表) - 查看权限:
show grants for '用户'@'主机'; - 回收权限:
revoke 权限 on 库.表 from '用户'@'主机';
8.常用函数
-
日期时间函数:
curdate()(日期)CURRENT_TIME(时间)CURRENT_TIMESTAMP()(日期时间)