MySQL 基础操作全汇总

58 阅读24分钟

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,需用UNIONUNION 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竖排显示,更清晰

注意

  • 全文索引仅支持charvarchartext类型字段;
  • MySQL 默认忽略太短的关键词(如长度 < 4 的词),且不支持中文(需借助插件或使用其他数据库如 Elasticsearch)。
5.5.语法要点总结
  1. 索引名在表中必须唯一,建议命名规范:idx_字段名(普通索引)、uk_字段名(唯一索引)、ft_字段名(全文索引)。
  2. 多列索引的字段顺序至关重要(最左前缀原则),需按查询频率排序(最常用的字段放左边)。
  3. 主索引和唯一索引会自动检查数据唯一性,插入重复值会报错;普通索引无此约束。

6.视图操作

视图(View)是基于 SQL 查询结果的虚拟表,它本身不存储实际数据,只保存查询逻辑(相当于 “预定义的查询语句”)。通过视图可以简化复杂查询、控制数据访问权限,或让数据展示更符合业务需求。


6.1. 视图的核心概念
  • 虚拟性:视图没有实际的物理存储,数据来源于 “底层表”(视图基于的表),底层表数据变化时,视图结果会自动同步。

  • 查询逻辑:视图本质是一条预存的SELECT语句,每次查询视图时,数据库会执行这条语句并返回结果。

  • 作用

    • 简化复杂查询(将多表连接、聚合计算等封装成视图,无需重复写复杂 SQL);
    • 控制数据访问(只向用户暴露部分字段,隐藏敏感信息,如隐藏 “学生表” 的 “身份证号”,只展示 “学号”“姓名”);
    • 保持查询一致性(多场景复用同一视图,避免重复编写相同逻辑)。
6.2. 创建视图(核心操作)
CREATE VIEW 视图名 [ (视图字段别名1, 视图字段别名2, ...) ]  
AS  
SELECT 查询语句;  -- 可以是单表查询、多表连接、聚合查询等

说明

  • 视图名:命名规则同表名(避免与表重名),建议加前缀(如v_)区分(如v_student_score)。
  • 视图字段别名:可选,若省略则默认使用SELECT语句中字段的名称(或字段别名)。
  • SELECT语句:可以包含WHEREJOINGROUP 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语句中无DISTINCTGROUP 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()(日期时间)