数据库是用于存储和管理数据的系统,我们日常使用的购物平台、视频应用等所产生的信息,本质上都是以数据形式存入数据库中的。高效的数据存储与管理能力,是现代软件系统的核心组成部分。
要使用MySQL数据库,首先需要完成下载与安装。操作该数据库主要依赖SQL语言,并需掌握事务处理、索引机制、存储引擎、SQL性能优化以及锁机制等相关技术知识。此外,在运维层面还需了解日志管理、主从复制、读写分离、分库分表等高级功能。
基础篇:MySQL入门知识
本部分内容涵盖MySQL的基本概念、SQL语句的使用方法、数据库内置函数及其应用场景、数据约束规则、多表联合查询方式,以及为保障数据一致性和完整性而设计的事务机制。
关于MySQL数据库
MySQL是一种关系型数据库管理系统(RDBMS),常被简称为“数据库”。用户通过SQL语言向数据库管理系统发出指令,由系统负责对底层数据库及其中的数据进行实际操作。
当前主流的关系型数据库产品包括:Oracle、MySQL、SQL Server 和 PostgreSQL 等。
本课程聚焦于MySQL的学习。尽管不同数据库在细节上有所差异,但它们大多遵循标准SQL语法,因此掌握一种后可快速迁移到其他系统。
总结如下:
MySQL的下载与版本选择
推荐使用的版本为 MySQL 社区版 8.0.44,适用于学习和开发场景。
官方下载地址:
MySQL :: Download MySQL Installer
安装包示意图:
MySQL默认监听端口为 3306。
示例密码设置为:123456(实际环境中应使用强密码)
启动与停止MySQL服务
方法一:通过Windows服务管理器
在命令提示符中输入 services.msc,打开系统服务列表,找到名为 MySQL80 的服务项,手动启动或停止服务。
方法二:使用命令行控制
以管理员权限运行命令提示符:
启动命令:net start mysql80
停止命令:net stop mysql80
客户端连接MySQL
可通过MySQL自带的命令行客户端工具连接并操作数据库。
前提条件:确保MySQL服务已启动,输入正确密码后即可建立客户端连接。
另一种连接方式:使用Windows命令行执行以下命令:
mysql -h 127.0.0.1 -P 3306 -u root -p
此命令表示以root用户身份连接本地IP(127.0.0.1)、端口3306上的MySQL服务器,随后将提示输入密码,验证成功后进入MySQL命令行界面。
执行路径位于:
C:\Program Files\MySQL\MySQL Server 8.0\bin
为方便全局调用,建议配置环境变量:
右键“此电脑” → “属性” → “高级系统设置” → “环境变量”,在“系统变量”中找到PATH,点击“编辑” → “新建”,添加MySQL的bin目录路径:
C:\Program Files\MySQL\MySQL Server 8.0\bin
保存所有更改后即可在任意位置使用mysql命令。
操作MySQL数据库
客户端工具的作用就是让我们能够与MySQL交互,进而实现对数据库的操作。
DBMS即数据库管理系统,它是一个独立运行的软件程序,可用于创建和管理数据库实例。图中红色框内部分代表实际存储的数据内容。
关系型数据库概述
MySQL属于关系型数据库管理系统(RDBMS)。这类数据库基于关系模型构建,由多个相互关联的二维表格组成。
二维表结构示意:
各表之间可通过某一列字段与其他表建立联系,体现“关系”的特性。
主要特点包括:
除关系型数据库外,还存在非关系型数据库(NoSQL),如MongoDB、Redis等。
数据模型结构
在一个MySQL服务器实例中,可以创建多个独立的数据库;每个数据库内部又可包含多张数据表;每张表则用于存储若干条具体记录。
总结:
SQL语言基础
SQL(Structured Query Language)是操作关系型数据库的标准语言,主要包括通用语法规范和多种语句类型:DDL、DML、DQl、DCL。
SQL通用语法说明:
SQL语句分类:
DDL(Data Definition Language):数据定义语言,用于定义数据库对象,如数据库、表、索引等。
DML(Data Manipulation Language):数据操纵语言,用于增删改表中数据。
DQL(Data Query Language):数据查询语言,主要用于检索数据。
DCL(Data Control Language):数据控制语言,用于创建用户账户及管理数据库访问权限。
DDL操作:数据库管理
常见操作包括查询、创建、删除和使用数据库。
查询现有数据库列表:
创建新数据库:
若重复创建同名数据库会报错:
解决方法:使用 IF NOT EXISTS 条件判断,仅当数据库不存在时才创建,避免错误发生。
字符集建议使用 utf8mb4 而非 utf8,因为 utf8 在MySQL中最多支持3字节字符,无法完整存储某些特殊字符(如emoji),而 utf8mb4 支持4字节,兼容性更好。
删除数据库时也推荐加上 IF EXISTS 判断,防止因数据库不存在而导致删除失败。
使用某个数据库(切换当前操作上下文):
例如切换到 itcast 数据库:
查询当前正在使用的数据库:
DDL操作:表的管理
查看表相关信息:
查看当前数据库下所有表的列表:
创建数据表:
按照指定结构创建一张新表:
注意:注释内容应使用英文单引号包裹,否则可能引发语法错误。
创建完成后,可通过查看表列表验证是否成功。
查看表的具体结构(字段定义、类型、约束等):

由于注释未显示,需通过命令查看表的创建语句:
表结构信息解析:
- 存储引擎:使用的是 InnoDB,作为 MySQL 默认的事务型存储引擎,支持事务处理、行级锁等关键特性。
- 字符集设置:DEFAULT CHARSET=utf8mb4,适用于存储包括 emoji 在内的四字节 UTF-8 字符。
- 排序规则:COLLATE=utf8mb4_0900_ai_ci,表示不区分大小写且忽略重音的比较方式。
数据类型分类
主要包括数值类型、字符串类型和日期时间类型三大类。
一、数值类型
整数类型:
tiniyint:占用 1 字节(byte),类似于 Java 中的 byte 类型,取值范围为 2^8 = 256。smallint:2 字节,对应 Java 的 short,最大可表示 65536(即 2^16)。mediumint:3 字节,介于 smallint 和 int 之间。int / integer:4 字节,与 Java 的 int 相当。bigint:8 字节,相当于 Java 的 long 类型。
浮点数类型:
float:单精度浮点数,占 4 字节,类似 Java 的 float。double:双精度浮点数,8 字节,对应 Java 的 double。decimal(M,D):用于精确表示小数。例如 decimal(5,2) 可表示如 123.45 这样的数值,其中“精度”M 表示总位数(共5位),“标度”D 表示小数部分长度(2位)。
实际应用建议:
- 年龄字段通常不会为负数,因此推荐使用
tinyint unsigned而非普通的int,节省空间。 - 成绩字段若要求保留一位小数且最高分为 100.0,则定义为
score double(4,1)更合理,确保数据规范性。
二、字符串类型
char(N):定长字符串。例如 char(10),即使只存一个字符,也会占用 10 个字符的空间,其余用空格填充。varchar(N):变长字符串。如 varchar(10),实际占用空间随内容变化,存储一个字符就只占一个字符位置。tinyblob / tinytext:分别用于存储不超过 255 字节的二进制或短文本数据。blob / text:适用于较长的二进制或文本内容。mediumblob / mediumtext:中等长度的二进制或文本数据。longblob / longtext:极大容量的数据类型,适合超大文本或文件内容。
性能对比:char 因长度固定,读写效率较高;而 varchar 需动态计算长度,性能略低。
使用场景建议:
- 用户名字段长度不定,最多限制 50 字符时,应使用
varchar(50),按需分配空间。 - 性别字段仅有“男”或“女”,建议使用
char(1),既节省空间又提升查询性能。
关于二进制数据:像视频、音频、安装包等资源虽然可通过 BLOB 类型存入数据库,但因性能开销大且管理不便,实践中多采用独立文件服务器存储,故 BLOB 使用频率较低。
三、日期时间类型
date:仅记录年月日,格式为 'YYYY-MM-DD'。time:表示时分秒,格式为 'HH:MM:SS'。year:只保存年份。datetime:包含完整的年月日及时分秒,常用作常规时间记录。timestamp:也记录完整时间,但其取值范围受限,最大到 2038 年(受 Unix 时间戳限制)。
示例说明:描述员工生日时,只需年月日即可,推荐使用 birthday date 类型。
建表示例
CREATE TABLE emp(
id INT COMMENT '编号',
workno VARCHAR(10) COMMENT '工号', -- 变长字符串
name VARCHAR(10) COMMENT '姓名', -- 变长字符串
gender CHAR(1) COMMENT '性别', -- 定长字符串
age TINYINT UNSIGNED COMMENT '年龄', -- 无符号整型,1字节足够
idcard CHAR(18) COMMENT '身份证号', -- 固定长度字符串
entrydate DATE COMMENT '入职时间' -- 仅需年月日
) COMMENT '员工表';
查看表结构命令:
DESC emp;
表结构操作 —— 修改
常见的表结构变更包括:添加字段、修改字段属性、删除字段以及重命名表名。
1. 添加字段
ALTER TABLE emp ADD nickname VARCHAR(20) COMMENT '昵称';
2. 修改字段
包含两种操作:修改字段的数据类型,或同时修改字段名称与类型。
修改数据类型:
修改字段名及类型:
ALTER TABLE emp CHANGE nickname username VARCHAR(30) COMMENT '昵称';
3. 删除字段
ALTER TABLE emp DROP username;
4. 修改表名

将表 emp 重命名为 employee 的操作如下:
alter table emp rename to employee;
表操作:删除
在数据库管理中,删除表是常见的操作。有两种常用方式可以实现数据的清除。
删除指定表并重新创建该表 是一种彻底清空数据的方法,通常用于需要保留表结构但清空内容的场景。
使用以下语句可安全地删除一个表(如果存在):
drop table if exists tb_user;
若仅需清空表内所有数据而保留表结构,可使用:
truncate table employee;
执行上述命令后,employee 表将仅保留其结构,原有数据全部被清除。
需要注意的是,无论是使用 drop 还是 truncate,最终结果都会导致数据丢失,但两者机制不同:drop 删除整个表对象,truncate 则是高效清空数据并重置自增列等属性。
MySQL 图形化界面工具介绍
虽然可以通过命令行执行 SQL 语句,但在实际开发过程中,这种方式效率较低且不够直观。因此,开发者更倾向于使用图形化工具来提升工作效率和操作体验。
目前主流的 MySQL 图形化管理工具有:Sqlyog、Navicat 和 DataGrip。
其中,DataGrip 功能更为强大,支持多种数据库,具备智能提示、代码高亮、版本控制集成等特性,适合专业开发人员使用。
安装与配置 DataGrip
首先下载并安装 DataGrip 软件。
启动后创建新项目,例如命名为 mysql-base,然后进行数据库连接配置。
选择“添加数据源”以连接 MySQL 数据库:
在弹出的窗口中填写 MySQL 的连接信息,并自动或手动下载对应的数据库驱动程序。
配置完成后点击测试连接,若显示“连接成功”,则说明配置无误。
连接成功后,系统会列出当前 MySQL 实例中的所有数据库。
至此,MySQL 图形化环境已搭建完成,并成功连接到数据库服务。
在 DataGrip 中进行数据库与表的操作
可以在图形界面中轻松完成数据库和表的创建与维护。
创建数据库(也称为 schema):
create database test;
或者使用等效语句:
create schema test;
创建表:
定义表的列(columns)结构:
如需修改表结构,可通过右键菜单选择“修改”选项进行可视化编辑。
也可以直接编写 SQL 语句对 test 数据库进行操作,而不依赖图形化功能。
选中多条 SQL 命令后,可一键执行全部语句。
DML 语句:数据操作语言
DML(Data Manipulation Language)主要用于对数据库表中的数据进行增加、删除和修改操作。
DML - 插入数据
使用 insert 语句向表中添加记录。
注意事项:
示例一:插入指定字段的数据
insert into employee(id, workno, name, gender, age, idcard, entrydate) values (1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
查看表中数据的方式有两种:
- 双击 employee 表直接浏览内容
- 使用查询语句:
select * from employee;
尝试插入一条非法数据(age 为负数),由于 age 字段定义为 unsigned,将触发错误:
insert into employee(id, workno, name, gender, age, idcard, entrydate) values (1,'1','Itcast2','男',-1,'123456789012345678','2000-01-01'); # 报错,age不能为负
示例二:插入全部字段的数据(不指定字段名时,必须按表结构顺序提供所有值)
insert into employee values (2,'2','张无忌','男',18,'123456789012345670','2005-01-01');
批量插入多条记录:
insert into employee values (3,'3','韦一笑','男',38,'123456782312345670','2005-01-01'), (4,'4','赵敏','女',18,'123456712312345670','2005-01-01');
DML - 修改数据
使用 update 语句更新已有记录。
注意事项:
案例一:将 id 为 1 的员工姓名改为 itheima
update employee set name = 'itheima' where id = 1;
案例二:同时修改多个字段,如将 id 为 1 的员工姓名改为“小昭”,性别改为“女”
update employee set name = '小昭', gender = '女' where id = 1;
案例三:更新所有员工的入职日期
update employee set entrydate = '2008-01-01';
DML - 删除数据
使用 delete 语句从表中移除数据。
注意事项:
案例一:删除性别为女的员工记录
delete from employee where gender = '女';
案例二:删除表中所有数据
delete from employee;
DML 语句小结
通过 insert、update 和 delete 操作,我们可以灵活地管理数据库中的数据内容,完成基本的增删改功能。
DQL 语句:数据查询语言
DQL(Data Query Language)用于查询数据库表中的记录,核心关键字为 select,是数据分析和应用开发中最常用的 SQL 类型之一。
在日常开发过程中,数据查询的操作频率远高于插入、更新和删除操作。当用户访问官方网站时,系统通常会从数据库中提取所需信息,并将其展示在前端页面上。
DQL语法结构
主要包括:基本查询、条件查询、聚合函数应用、分组查询、排序查询以及分页查询等功能模块。
基本查询语句(DQL)
以下是一个关于员工信息表的构建与数据操作示例:
案例实现步骤
首先进行表结构的清理与重建:
# 删除employee表 drop table if exists employee; # 创建emp表 create table emp( id int comment '编号', workno varchar(10) comment '工号', -- 变长字符串 name varchar(10) comment '姓名', -- 变长字符串 gender char(1) comment '性别', -- 定长字符串 age tinyint unsigned comment '年龄', -- 无符号整型,占用1字节 idcard char(18) comment '身份证号', -- 定长字符串 workaddress varchar(50) comment '工作地址', -- 变长字符串 entrydate date comment '入职时间' -- 仅需年月日格式 ) comment '员工表';
向表中插入测试数据:
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate) values (1, '1', '柳岩', '女', 20, '123456789012345678', '北京', '2008-01-01'), (2, '2', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'), (3, '3', '韦一笑', '男', 38, '12345678912345670', '北京', '2005-08-01'), (4, '4', '赵敏', '女', 18, '12345675712345670', '上海', '2009-08-01'), (5, '5', '小昭', '女', 16, '123456759012345678', '上海', '2007-07-01'), (6, '6', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01'), (7, '7', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01'), (8, '8', '黛绮丝', '女', 38, '12345615712345670', '天津', '2015-05-01'), (9, '9', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'), (10, '10', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01'), (11, '11', '张士诚', '男', 55, '12356789512345670', '江苏', '2015-05-01'), (12, '12', '常遇春', '男', 32, '12344675712345670', '北京', '2004-02-01'), (13, '13', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'), (14, '14', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'), (15, '15', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'), (16, '16', '周芷若', '女', 18, null, '北京', '2012-06-01');
字段查询操作示例
查询指定列:name、workno 和 age 字段的信息。
select emp.name, emp.workno, emp.age from emp; -- 或者简写为: select name, workno, age from emp;
查询所有字段内容:
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp; -- 或使用通配符 *(不推荐) select * from emp;
建议避免使用星号(*),因为明确列出字段更有利于代码可读性,并能清晰表达出当前查询涉及的具体列。
对查询结果中的字段设置别名,例如将工作地址字段显示为“工作地址”:
select workaddress as '工作地址' from emp; -- 或者 select workaddress '工作地址' from emp;
查询公司员工的工作地址信息,获取所有上班地点记录:
select workaddress '工作地址' from emp;
若需去除重复项,仅查看不重复的上班地址,可使用 distinct 关键字:
select distinct workaddress from emp;
DQL语句 - 聚合函数应用
聚合函数用于对某一列数据进行纵向计算,将其视为一个整体进行统计分析。
统计企业中员工的总人数:
select count(*) from emp;
该查询返回结果为15,表示共有15条员工记录(注意:count(*) 不统计 null 值)。
若只统计身份证号非空的员工数量,则使用:
select count(idcard) from emp;
计算员工的平均年龄:
select avg(age) from emp;
查找员工中的最大年龄值:
select max(age) from emp;
查找员工中的最小年龄值:
select min(age) from emp;
统计工作地在西安的所有员工年龄总和:
select sum(age) from emp where workaddress = '西安';
DQL语句 - 分组查询操作
按照性别对员工进行分组,并统计每组的人数:
select gender, count(*) from emp group by gender;
按性别分组后,计算男、女员工各自的平均年龄:
select gender, avg(age) from emp group by gender;
筛选年龄小于45岁的员工,再根据工作地址进行分组,并进一步过滤出员工数量不少于3人的工作地:
第一步:先进行分组统计
select workaddress, count(*) from emp where age < 45 group by workaddress;
第二步:添加分组后的条件过滤
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >= 3;
此语句也可结合别名优化可读性。
DQL语句 - 条件查询语法
条件查询通过 where 子句实现,用于筛选满足特定条件的记录。
常见比较与逻辑条件如下:
查询年龄等于88岁的员工信息:
select * from emp where age = 88;
查找年龄小于20岁的员工全部信息:
select * from emp where age < 20;
获取年龄小于或等于20岁的员工数据:
select * from emp where age <= 20;
查询没有填写身份证号码的员工信息(即 idcard 字段为空):
select * from emp where idcard IS NULL;
相反地,查询已填写身份证号的员工信息:
select * from emp where idcard IS NOT NULL;
查找年龄不等于88岁的员工记录:
select * from emp where age != 88;
查询年龄在15到20岁之间(含边界)的员工信息,可通过两种方式实现:
select * from emp where age BETWEEN 15 AND 20;
select * from emp where age >= 15 AND age <= 20;
查询性别为女性且年龄低于25岁的员工信息:
select * from emp where gender = '女' AND age < 25;
查找年龄为18岁、20岁或40岁的员工信息,可用 OR 连接多个条件,也可使用 IN 简化表达:
select * from emp where age = 18 OR age = 20 OR age = 40;
select * from emp where age in (18, 20, 40);
查询姓名恰好为两个字符长度的员工信息。利用 LIKE 配合通配符 "_" 表示单个字符:
select * from emp where name like '__';
查找身份证号最后一位是 'X' 的员工信息,可以使用模糊匹配:
select * from emp where idcard like '%X';
或者通过固定长度匹配(假设身份证号共18位),前17位任意,第18位为X:
select * from emp where idcard like '_________________X';

从员工表中筛选年龄小于45岁的记录,按工作地址进行分组,并统计每个工作地的员工数量,仅保留人数大于等于3的地址信息:
select workaddress, count(*) as address_count from emp where age < 45 group by workaddress having address_count >= 3;
在执行分组查询时,若使用gender作为分组字段,配合count(*)聚合函数进行统计,则name字段在此类语句中不具备实际意义:
select name, gender, count(*) from emp group by gender;
DQL语句 - 排序查询
数据库支持对查询结果进行排序操作,可通过ORDER BY子句实现升序或降序排列。
系统允许基于多个字段进行排序,优先级由字段在语句中的顺序决定。
对员工按照年龄进行升序排序(默认为升序,ASC可省略):
select * from emp order by age asc;
根据入职时间对员工进行降序排序:
select * from emp order by entrydate desc;
先按年龄升序排列,若年龄相同,则按照入职时间降序排序:
select * from emp order by age asc, entrydate desc;
DQL语句 - 分页查询
在处理大量数据时,常使用LIMIT关键字实现分页功能,控制每页显示的数据条数。
查询第一页数据,每页展示10条记录:
select * from emp limit 0, 10;
或者简写为:
select * from emp limit 10;
查询第二页数据,每页仍为10条:
select * from emp limit 10, 10;
DQL语句 - 实际案例
查找年龄为20、21、22或23岁且性别为女性的员工信息。可使用OR连接多个条件,也可用IN简化表达:
select * from emp where age = 20 or age = 21 or age = 22 or age = 23 and gender = '女';
select * from emp where age in (20, 21, 22, 23) and gender = '女';
查询性别为男性、年龄在20至40岁之间(含边界),且姓名为三个字符长度的员工:
select * from emp where gender = '男' and age between 20 and 40 and name like '___';
建议将范围条件用括号包裹以增强逻辑清晰度:
select * from emp where gender = '男' and (age between 20 and 40) and name like '___';
统计年龄低于60岁的员工中,分别有多少名男性和女性:
select gender, count(*) from emp where age < 60 group by gender;
查询所有年龄不超过35岁的员工姓名与年龄,并按年龄升序排序;当年龄相同时,按入职时间倒序排列:
select name, age from emp where age <= 35 order by age asc, entrydate desc;
获取性别为男、年龄在20到40岁之间的前五位员工信息,排序规则为:先按年龄升序,再按入职时间升序:
select * from emp where gender = '男' and age between 20 and 40 order by age asc, entrydate asc limit 0, 5;
DQL语句 - 执行顺序解析
理解SQL语句的执行流程有助于编写正确的查询逻辑。例如以下语句用于查询年龄大于15岁的员工姓名和年龄,并按年龄升序输出:
select name, age from emp where age > 15 order by age asc;
执行过程如下:首先加载表数据(FROM),然后应用筛选条件(WHERE),接着选取指定字段(SELECT),最后执行排序(ORDER BY)。
select name, age from emp e where e.age > 15 order by age asc;
select e.name, e.age from emp e where e.age > 15 order by age asc;
注意:不能在WHERE子句中使用SELECT中定义的别名,因为WHERE执行早于SELECT。如下写法是错误的:
select e.name, e.age eage from emp e where eage > 15 order by age asc;
正确顺序应为:FROM → WHERE → SELECT → ORDER BY。

DCL语句-权限控制
通过以下命令可以查看指定用户的权限信息:
# 查询权限
show grants for 'heima'@'%';
若需要赋予用户特定访问权限,可使用grant命令进行授权。例如,授予用户heima对itcast数据库中所有表的全部操作权限:
# 授予权限
grant all on itcast.* to 'heima'@'%';
再次查询权限,确认授权是否生效:
# 查询权限
show grants for 'heima'@'%';
如需回收已分配的权限,可通过revoke命令撤销对应权限:
# 撤销权限
revoke all on itcast.* from 'heima'@'%';
DQL语句-小结
SQL查询语句(DQL)的执行顺序并非按照书写顺序进行,而是遵循特定逻辑流程。以如下语句为例:
select e.name, e.age eage from emp e where e.age > 15 order by eage asc;
其实际执行步骤为:首先加载from子句中的表数据,接着根据where条件过滤记录,然后执行select选择字段,最后按orderby进行排序。
DCL语句
数据控制语言(DCL)主要用于管理数据库用户及控制数据库访问权限,确保数据的安全性和访问可控性。
DCL语句-管理用户
在MySQL中,Host表示允许登录的主机地址,User代表用户名。例如:
# 创建用户itcast,仅允许在本地主机localhost登录,密码为123456
create user 'itcast'@'localhost' identified by '123456';
虽然该用户可以使用命令行连接MySQL服务,但初始状态下并无操作权限。
此时用户只能看到系统自带的少量数据库,原因在于仅创建了账户而未分配任何权限。
另一种情况是创建可在任意主机访问的用户:
# 创建用户heima,允许从任意远程主机连接,密码为123456
create user 'heima'@'%' identified by '123456';
后续可根据需求修改用户密码或删除用户:
# 修改用户heima的密码为1234
alter user 'heima'@'%' identified with mysql_native_password by '1234';
# 删除用户itcast@localhost
drop user 'itcast'@'localhost';
DCL语句-小结



雷达卡


京公网安备 11010802022788号







