MySQL 基础与实战操作
MySQL 基础与实战操作
一、数据库基础概念
1. 数据库定义
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
简言之,数据库就是“存储数据的仓库”,核心作用是高效管理海量结构化数据,支持数据的增删改查与关联分析。
2. 数据库分类
(1)按数据模型分类
- 网络数据库:是指把数据库技术引入到计算机网络系统中,借助于网络技术将存储于数据库中的大量信息及时发布出去;而计算机网络借助于成熟的数据库技术对网络中的各种数据进行有效管理,并实现用户与网络中的数据库进行实时动态数据交互。
- 层级数据库:层次结构模型实质上是一种有根结点的定向有序树(在数学中"树"被定义为一个无回的连通图),数据以层级关系存储,父子关联明确。
- 关系数据库:是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,以二维表形式组织数据,是目前主流的数据库类型。
(2)按存储介质分类
存储介质分为两种:磁盘和内存
- 关系型数据库:存储在磁盘中,数据持久化,支持复杂查询与事务,如 MySQL、Oracle;
- 非关系型数据库:存储在内存中(部分支持持久化到磁盘),读写速度快,适合高并发场景,如 Redis、MongoDB。
二、关系型数据库核心知识
1. 关系型数据库基本概念
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
(1)关系数据结构
指的数据以什么方式来存储,是一种二维表的形式存储,本质就是“二维表”。
示例:
姓名 | 年龄 | 身高 | 体重 |
---|---|---|---|
张三 | 30 | 187 | 70 |
李四 | 40 | - | - |
(2)关系操作集合
指如何关联和管理对应的存储数据,核心是通过 SQL 指令 实现。
示例:获取张三的年纪(已知条件为姓名)
Select 年龄 from 二维表 where 姓名 = 张三;
(3)关系完整性约束
指数据内部有对应的关联关系,以及数据与数据之间也有对应的关联关系,分为“表内约束”和“表间约束”:
- 表内约束:对应的具体列只能放对应的数据(不能乱放),如“年龄”列只能存储数字,“姓名”列不能为空;
- 表间约束:自然界各实体都是有着对应的关联关系(通过“外键”实现),如“学生表”的“课程ID”需关联“课程表”的“ID”,确保数据一致性。
2. 典型关系型数据库
类型 | 产品名称 | 适用场景 |
---|---|---|
小型关系型数据库 | Microsoft Access、SQLite | 个人项目、轻量级应用,数据量较小 |
中型关系型数据库 | Microsoft SQL Server、MySQL | 企业内部系统、Web应用,数据量中等 |
大型关系型数据库 | Oracle、DB2 | 金融、电商等核心业务系统,海量数据与高并发场景 |
注:MySQL 原由瑞典 MySQL AB 公司开发,后被 Sun 公司收购,最终 Oracle 公司收购 Sun 公司,因此 MySQL 当前隶属于 Oracle 旗下。
三、SQL 介绍
1. SQL 基本介绍
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名(.sql
)。
SQL 就是专门为关系型数据库而设计出来的,所有关系型数据库都支持 SQL 语法(存在少量方言差异)。
2. SQL 分类
(1)数据查询语言(DQL:Data Query Language)
- 功能:也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序中呈现。
- 核心保留字:SELECT(最常用)、WHERE、ORDER BY、GROUP BY、HAVING。
- 作用:专门用于查询数据,代表指令为
select
、show
。
(2)数据操作语言(DML:Data Manipulation Language)
- 功能:用于添加、修改和删除表中的行,也称为“动作查询语言”。
- 核心保留字:INSERT(新增)、UPDATE(修改)、DELETE(删除)。
- 作用:专门用于“写数据”(增删改),代表指令为
insert
、update
、delete
。
(3)事务处理语言(TPL)
- 功能:确保被 DML 语句影响的表的所有行及时得以更新,保证数据一致性。
- 核心保留字:BEGIN TRANSACTION(开始事务)、COMMIT(提交事务)、ROLLBACK(回滚事务)。
- 注意:不是所有的关系型数据库都提供事务安全处理,如 MySQL 的 MyISAM 引擎不支持事务。
- 作用:专门用于事务安全处理,代表指令为
transaction
、COMMIT
、ROLLBACK
。
(4)数据控制语言(DCL)
- 功能:通过 GRANT 或 REVOKE 获得/取消许可,确定单个用户和用户组对数据库对象的访问权限,部分数据库支持控制对表单个列的访问。
- 核心保留字:GRANT(授权)、REVOKE(回收权限)。
- 作用:专门用于权限管理,代表指令为
grant
、revoke
。
(5)数据定义语言(DDL)
- 功能:用于创建或删除数据库对象(如表、索引),包括许多与数据库目录中获取数据有关的保留字,也是动作查询的一部分。
- 核心保留字:CREATE(创建)、DROP(删除)、ALTER(修改)。
- 作用:专门用于结构管理(数据库、表、索引等),代表指令为
create
、drop
、alter
。
四、MySQL 基本介绍
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
发展历程:AB 公司被 Sun 公司收购 → Oracle 公司又收购了 Sun 公司,因此 MySQL 现归 Oracle 所有。
核心特点:
- Mysql 是一种开源免费的数据库产品,降低企业使用成本;
- Mysql 对 PHP 的支持是最好的,是 LAMP(Linux+Apache+MySQL+PHP)或 WAMP(Windows+Apache+MySQL+PHP)架构的核心组件。
指令说明:Mysql 中用到的操作指令就是 SQL 指令,语法与标准 SQL 高度兼容。
五、关系型数据库的常见组件
关系型数据库的常见组件有:
- 数据库(database):存储表的容器,一个 MySQL 实例可包含多个数据库,不同数据库相互独立;
- 表(table):由行(row,代表一条记录)和列(column,代表一个字段)组成的二维结构,是数据存储的基本单元;
- 索引(index):类似书籍目录,用于加速数据查询,减少磁盘 I/O 次数;
- 视图(view):虚拟表,由一条查询语句的结果生成,不存储实际数据,简化复杂查询;
- 用户(user):访问数据库的账号,格式为
'USERNAME'@'HOST'
,HOST
限制登录主机; - 权限(privilege):用户操作数据库的权限,如 SELECT(读)、INSERT(写)、ALL(所有权限);
- 存储过程(procedure):预编译的 SQL 语句集合,可接收参数、循环执行,实现复杂业务逻辑;
- 存储函数(function):与存储过程类似,但有返回值,用于计算并返回结果;
- 触发器(trigger):表数据发生变化(INSERT/UPDATE/DELETE)时自动执行的 SQL 指令,确保数据完整性;
- 事件调度器(event scheduler):类似定时任务,按预设时间自动执行 SQL 语句。
六、mysql 安装与配置
mysql 安装(在前面 lamp 中已讲解安装),此处不再赘述,如需回顾可参考 LAMP 架构部署流程,核心是通过源码编译或 yum 安装,确保 MySQL 服务正常启动(systemctl start mysqld
)。
七、mysql 数据库操作
1. DDL 操作(数据定义语言)
DDL 操作主要用于管理数据库和表的结构,包括创建、删除、查看等。
(1)数据库操作
-
创建数据库
语法:create database 数据库名字;
示例:创建数据库zhang3
mysql> create database zhang3; Query OK, 1 row affected (0.00 sec)
-
查看当前实例有哪些数据库
语法:show databases;
示例:mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | # 系统库:存储数据库元数据 | mysql | # 系统库:存储用户、权限信息 | performance_schema | # 系统库:存储性能监控数据 | sys | # 系统库:简化性能分析 | zhang3 | # 自定义数据库 +--------------------+ 5 rows in set (0.01 sec)
- **删除数据库** 语法:`drop database 数据库名;` 示例:删除数据库 `zhang3` ```sqlmysql> drop database zhang3;Query OK, 1 row affected (0.12 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+4 rows in set (0.00 sec)
(2)表操作
① 表约束说明
约束(constraint)是向数据表提供的数据要遵守的限制,确保数据有效性和一致性,常见约束如下:
- 主键约束:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行,且必须提供数据(不能为空,NOT NULL),一个表只能存在一个主键;
- 唯一键约束:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行,但允许为空(NULL),一个表可以存在多个唯一键;
- 外键约束:一个表中的某字段可填入数据取决于另一个表的主键已有的数据,用于关联表与表;
- 检查性约束(CHECK):限制字段值的范围(如年龄>0),部分数据库支持;
- 默认值(DEFAULT):字段未赋值时使用的默认数据;
- 非空约束(NOT NULL):字段必须填入数据,不能为 NULL。
② 表操作示例
-
创建表
语法:create table table_name (col1 datatype [约束], col2 datatype [约束]) ENGINE='存储引擎类型';
示例:在数据库zhang3
里创建表zhangsan
mysql> create database zhang3; // 先创建数据库 zhang3 Query OK, 1 row affected (0.00 sec)mysql> use zhang3; // 进入 zhang3 数据库 Database changedQuery OK, 0 rows affected (0.09 sec) ysql> create table zhangsan (-> id int not null, // 非空约束-> name varchar(100) not null,-> age tinyint // 可空,无约束-> ); // 创建 zhangsan 表 Query OK, 0 rows affected (0.02 sec)
-
查看当前数据库有哪些表
语法:show tables;
示例:mysql> show tables; +------------------+ | Tables_in_zhang3 | +------------------+ | zhangsan | +------------------+ 1 row in set (0.00 sec) ``
-
删除表
语法:drop table 表名;
示例:删除表zhangsan
mysql> drop table zhangsan; Query OK, 0 rows affected (0.01 sec)mysql> show tables; Empty set (0.00 sec) # 再创建一次以便后续操作 mysql> create table zhangsan ( id int not null, name varchar(100) not null, age tinyint ); Query OK, 0 rows affected (0.01 sec)
(3)用户操作
mysql 用户帐号由两部分组成,格式为 'USERNAME'@'HOST'
,表示此 USERNAME
只能从此 HOST
上远程登录,其中 HOST
用于限制登录主机,取值规则如下:
- IP 地址:如
192.168.100.20
,仅允许从该 IP 登录; - 通配符:
%
:匹配任意长度的任意字符,常用于设置允许从任何主机登录;_
:匹配任意单个字符,如192.168.100._
允许从192.168.100
网段的任意主机登录。
-
创建数据库用户
语法:create user 'username'@'host' [identified by 'password'];
示例:创建用户zhangsan
,仅允许从192.168.100.20
登录,密码为123456
mysql> create user 'zhangsan'@'192.168.100.20' identified by '123456'; Query OK, 0 rows affected (0.01 sec)
-
使用新创建的用户和密码登录
语法:mysql -u用户名 -p密码 -h主机
示例:[root@zhangsan-2 yum.repos.d]# mysql -uzhangsan -p123456 -h192.168.100.10 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.37 MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
-
删除数据库用户
语法:drop user 'username'@'host';
示例:删除用户chenyu
@127.0.0.1
mysql> drop user 'zhangsan'@'192.168.100.20'; Query OK, 0 rows affected (0.00 sec)
(4)查看命令 SHOW
SHOW
命令是 DQL 的重要组成部分,用于查看数据库、表、字符集、存储引擎等元数据信息。
-
查看支持的所有字符集
语法:show character set;
示例:mysql> show character set; +----------+---------------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 |****** 省略 ****** | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.01 sec)
-
查看当前数据库支持的所有存储引擎
语法:show engines;
示例:mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | # 默认引擎 | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.00 sec)
-
查看数据库信息
语法:show databases;
示例:mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | zhang3 | +--------------------+ 5 rows in set (0.00 sec)
-
不进入某数据库而列出其包含的所有表
语法:show tables from 数据库名;
示例:查看zhang3
数据库的表mysql> show tables from zhang3; +------------------+ | Tables_in_zhang3 | +------------------+ | zhangsan | +------------------+ 1 row in set (0.00 sec)
-
查看表结构
语法:desc [db_name.]table_name;
(desc
是describe
的缩写)
示例:查看zhang3.zhangsan
表结构mysql> desc zhang3.zhangsan; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(100) | NO | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.05 sec)
-
查看某表的创建命令
语法:SHOW CREATE TABLE table_name;
示例:查看cy.chenyu
表的创建语句mysql> show create table zhang3.zhangsan; +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | zhangsan | CREATE TABLE `zhangsan` (`id` int(11) NOT NULL,`name` varchar(100) NOT NULL,`age` tinyint(4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
-
查看某表的状态
语法:show table status like 'table_name'\G
(\G
用于竖排显示,适合长内容)
示例:查看zhang3
数据库中zhangsan
表的状态mysql> use zhang3; // 进入数据库 zhang3 mysql> show table status like 'zhangsan'\G //查看zhangsan表的状态 *************************** 1. row ***************************Name: zhangsanEngine: InnoDBVersion: 10Row_format: DynamicRows: 0Avg_row_length: 0Data_length: 16384 Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2025-09-16 19:14:29Update_time: NULLCheck_time: NULLCollation: latin1_swedish_ciChecksum: NULLCreate_options: Comment: 1 row in set (0.00 sec)
2. DML 操作(数据操作语言)
DML 操作包括增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT),均针对表中的数据进行操作,不修改表结构。
(1)INSERT 语句(新增数据)
语法:insert [into] table_name [(column_name,...)] {values | value} (value1,...),(...),...
into
可省略;- 可指定字段顺序,未指定的字段需符合约束(如允许 NULL 或有默认值);
values
和value
均可,values
支持批量插入。
示例1:一次插入一条记录
mysql> use zhang3;
Database changedmysql> insert into zhangsan (id,name,age) value (1,'hina',18);
Query OK, 1 row affected (0.00 sec)示例2:一次插入多条记录
```sql
mysql> insert into zhangsan (id,name,age) values
(2,'mika',19),
(3,'zhang3',21),
(4,'seia',17),
(5,'lisi',28),
(6,'ravinia',26),
(7,'kelsey',25);
uery OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
(2)SELECT 语句(查询数据)
SELECT 是最常用的 DML 命令,用于从表中提取数据,支持条件筛选、排序、限制结果等。
① 字段表示法
表示符 | 代表含义 | 示例 |
---|---|---|
* | 所有字段 | SELECT * FROM chenyu; (查询所有字段) |
as | 字段别名 | SELECT name AS 姓名 FROM chenyu; (给 name 起别名“姓名”) |
② 条件判断语句 WHERE
用于筛选符合条件的记录,支持多种操作符:
操作类型 | 常用操作符 | 说明 |
---|---|---|
比较操作符 | > ,< ,>= ,<= ,= ,!= | 比较字段值大小,如 age >= 20 |
范围操作符 | BETWEEN column# AND column# | 字段值在指定范围内,如 age BETWEEN 20 AND 30 |
模糊匹配 | LIKE | 配合通配符 % (任意字符)、_ (单个字符),如 name LIKE 'zhang%' |
空值判断 | IS NOT NULL / IS NULL | 判断字段是否为空,如 age IS NOT NULL |
条件逻辑操作 | AND / OR / NOT | 多条件组合,AND (同时满足)、OR (满足其一)、NOT (取反) |
③ ORDER BY 排序
用于对查询结果按指定字段排序,默认为升序(ASC),可指定降序(DESC):
ORDER BY 语句 | 意义 |
---|---|
ORDER BY 'column_name' | 根据 column_name 进行升序排序 |
ORDER BY 'column_name' DESC | 根据 column_name 进行降序排序 |
ORDER BY ’column_name' LIMIT 2 | 根据 column_name 升序排序,仅取前 2 个结果 |
ORDER BY ’column_name' LIMIT 1,2 | 根据 column_name 升序排序,跳过第 1 个结果,取后面 2 个 |
④ SELECT 完整语法
SELECT column1,column2,... FROM table_name [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
m
:起始位置(从 0 开始,省略则从第 0 行开始);n
:获取的记录数。
⑤ SELECT 操作示例
示例1:查询所有字段
select * from zhangsan;
示例2:查询指定字段(仅姓名)
mysql> select * from zhangsan;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 5 | lisi | NULL |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
7 rows in set (0.00 sec)
示例3:按年龄升序排序(NULL 排在最前)
mysql> select * from zhangsan order by age;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 5 | lisi | NULL |
| 4 | seia | 17 |
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 7 | kelsey | 25 |
| 6 | ravinia | 26 |
+----+---------+------+
7 rows in set (0.00 sec)
示例4:按年龄降序排序
mysql> select * from zhangsan order by age desc;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
| 3 | zhang3 | 21 |
| 2 | mika | 19 |
| 1 | hina | 18 |
| 4 | seia | 17 |
| 5 | lisi | NULL |
+----+---------+------+
7 rows in set (0.00 sec)
示例5:按年龄排序,取前 2 条结果
mysql> select * from zhangsan order by age limit 2;
+----+------+------+
| id | name | age |
+----+------+------+
| 5 | lisi | NULL |
| 4 | seia | 17 |
+----+------+------+
2 rows in set (0.00 sec)
示例6:按年龄排序,跳过第 1 条,取后 2 条
mysql> select * from zhangsan order by age limit 1,2;
+----+------+------+
| id | name | age |
+----+------+------+
| 4 | seia | 17 |
| 1 | hina | 18 |
+----+------+------+
2 rows in set (0.00 sec)
示例7:条件查询(年龄 ≥25)
mysql> select * from zhangsan where age >= 25;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
2 rows in set (0.00 sec)
示例8:多条件查询(年龄 ≥25 且 姓名=kelsey)
mysql> select * from zhangsan where age >= 25 and name = 'kelsey';
+----+--------+------+
| id | name | age |
+----+--------+------+
| 7 | kelsey | 25 |
+----+--------+------+
1 row in set (0.00 sec)
示例9:范围查询(年龄在 23 到 28 之间)
mysql> select * from zhangsan where age between 23 and 28;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
2 rows in set (0.00 sec)
示例10:非空查询(年龄不为空)
mysql> select * from zhangsan where age is not null;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
6 rows in set (0.00 sec)
示例11:空值查询(年龄为空)
mysql> select * from zhangsan where age is null;
+----+------+------+
| id | name | age |
+----+------+------+
| 5 | lisi | NULL |
+----+------+------+
1 row in set (0.00 sec)
(3)UPDATE 语句(修改数据)
语法:UPDATE table_name SET column1 = new_value1[,column2 = new_value2,...] [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
- 必须加
WHERE
条件(除非修改所有记录),否则会更新表中所有行; - 可结合
ORDER BY
和LIMIT
限制更新范围。
示例1:修改 lisi 的年龄为 30
mysql> select * from zhangsan; //修改前查看
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 5 | lisi | NULL |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
7 rows in set (0.00 sec)mysql> update zhangsan set age = 30 where name = 'lisi'-> ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from zhangsan;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 5 | lisi | 30 |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
7 rows in set (0.00 sec)mysql> select * from zhangsan where name = 'lisi'; // 修改后验证
+----+------+------+
| id | name | age |
+----+------+------+
| 7 | lisi | 30 |
+----+------+------+
1 row in set (0.00 sec)
(4)DELETE 语句(删除数据)
语法:DELETE FROM table_name [WHERE clause] [ORDER BY 'column_name' [DESC]] [LIMIT [m,]n];
- 必须加
WHERE
条件(除非删除所有记录),否则会删除表中所有行; - 仅删除数据,保留表结构,可通过事务回滚恢复(需支持事务的引擎,如 InnoDB)。
示例1:删除某条记录(id=7 的行)
mysql> select * from zhangsan; //删除前查看
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 5 | lisi | 30 |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
7 rows in set (0.00 sec)mysql> delete from zhangsan where id = 5; // 删除 id=7 的记录
Query OK, 1 row affected (0.00 sec)mysql> select * from chenyu; // 删除后验证
+----+---------+------+
| id | name | age |
+----+---------+------+
| 1 | hina | 18 |
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
6 rows in set (0.01 sec)
示例2:删除整张表的内容(保留表结构)
mysql> delete from zhangsan; // 删除所有记录
Query OK, 6 rows affected (0.00 sec)mysql> select * from zhangsan; // 验证,表为空但结构保留
Empty set (0.00 sec)mysql> desc zhangsan; // 查看表结构,无变化
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
(5)TRUNCATE 语句(清空表)
TRUNCATE 与 DELETE 都可删除表中数据,但存在本质区别:
语句类型 | 特点 |
---|---|
DELETE | 1. 仅删除内容,保留表结构; 2. 每次删除一行,在事务日志中为所删除的每行记录一项; 3. 可以通过回滚事务日志恢复数据; 4. 非常占用空间(日志记录); 5. 不重置自增计数器(如自增 ID 继续从上次值开始)。 |
TRUNCATE | 1. 删除表中所有数据,且无法恢复; 2. 表结构、约束和索引等保持不变,新添加的行计数值重置为初始值; 3. 执行速度比 DELETE 快,且使用的系统和事务日志资源少; 4. 通过释放存储表数据所用的数据页来删除数据,仅在事务日志中记录页的释放; 5. 对于有外键约束引用的表,不能使用 TRUNCATE TABLE 删除数据; 6. 不能用于加入了索引视图的表。 |
语法:TRUNCATE table_name;
示例:
mysql> insert into zhangsan (id,name,age) values (2,'mika',19), (3,'zhang3',21), (4,'seia',17), (5,'lisi',null), (6,'ravinia',26), (7,'kelsey',25);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0mysql> select * from zhangsan; // 清空前查看
+----+---------+------+
| id | name | age |
+----+---------+------+
| 2 | mika | 19 |
| 3 | zhang3 | 21 |
| 4 | seia | 17 |
| 5 | lisi | NULL |
| 6 | ravinia | 26 |
| 7 | kelsey | 25 |
+----+---------+------+
6 rows in set (0.00 sec)mysql> truncate zhangsan;
Query OK, 0 rows affected (0.01 sec)mysql> select * from zhangsan; // 清空后验证,表为空
Empty set (0.00 sec)mysql> desc zhangsan; // 表结构保留
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
3. DCL 操作(数据控制语言)
DCL 操作主要用于管理用户权限,包括授权(GRANT)、查看授权(SHOW GRANTS)、取消授权(REVOKE)。
(1)创建授权 GRANT
语法:GRANT priv_type,... ON [object_type] db_name.table_name TO ‘username'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
priv_type
:权限类型,如 ALL(所有权限)、SELECT、INSERT 等;db_name.table_name
:授权的操作对象,如*.*
(所有库所有表)、cy.*
(cy 库所有表);IDENTIFIED BY 'password'
:给新用户设置密码(若用户已存在,可省略);WITH GRANT OPTION
:允许被授权用户将自己的权限转赠给其他用户,不建议使用。
① 权限类型(priv_type)说明
权限类型 | 代表含义 |
---|---|
ALL | 所有权限(除 GRANT OPTION 外) |
SELECT | 读取表内容的权限 |
INSERT | 插入数据到表的权限 |
UPDATE | 更新表数据的权限 |
DELETE | 删除表数据的权限 |
② 操作对象(db_name.table_name)表示方式
表示方式 | 意义 |
---|---|
*.* | 所有数据库的所有表 |
db_name | 指定数据库的所有表(等价于 db_name.* ) |
db_name.table_name | 指定数据库的指定表 |
③ GRANT 示例
示例1:授权 root 用户在数据库本机(localhost)登录,访问所有数据库
mysql> GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
示例2:授权 root 用户在 192.168.100.10 登录,访问所有数据库
mysql> GRANT ALL ON *.* TO 'root'@'192.168.100.10' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
示例3:授权 root用户在 192.168.100.20 远程登录,访问 zhang3 数据库
mysql> GRANT ALL ON zhang3.* TO 'root'@'192.168.100.20' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
示例4:授权 root 用户在所有位置(%)远程登录,访问所有数据库
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
(2)查看授权
① 查看当前登录用户的授权信息
语法:SHOW GRANTS;
示例:
mysql> SHOW GRANTS;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
② 查看指定用户的授权信息
语法:SHOW GRANTS FOR 'username'@'host';
(若省略 host
,默认 %
)
示例1:查看 root@% 的授权
mysql> SHOW GRANTS FOR root;
+-------------------------------------------+
| Grants for root@% |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)
示例2:查看 root@localhost 的授权
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
示例3:查看 root@192.168.100.20 的授权
mysql> SHOW GRANTS FOR 'root'@'192.168.100.20';
+---------------------------------------------------------------+
| Grants for root@192.168.100.20 |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'root'@'192.168.100.20' |
| GRANT ALL PRIVILEGES ON `zhang3`.* TO 'root'@'192.168.100.20' |
+---------------------------------------------------------------+
2 rows in set (0.00 sec)
(3)取消授权 REVOKE
语法:REVOKE priv_type,... ON db_name.table_name FROM 'username'@'host';
- 取消的权限类型和操作对象需与授权时一致;
- 取消后需刷新权限(部分版本自动刷新,保险起见手动刷新)。
示例1:取消 chenyu@192.168.100.20 的所有权限
mysql> REVOKE ALL ON *.* FROM 'root'@'192.168.100.20';
Query OK, 0 rows affected (0.00 sec)
示例2:刷新权限(确保生效)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
注意:mysql 服务进程启动时会读取 mysql 库中的所有授权表至内存中;GRANT 或 REVOKE 等执行权限操作会保存于表中,mysql 的服务进程会自动重读授权表,并更新至内存中;对于不能够或不能及时重读授权表的命令,可手动执行 FLUSH PRIVILEGES;
让 mysql 的服务进程重读授权表。
八、实战案例
1. 基础实战:学生表操作
(1)环境准备:搭建 mysql 服务
已通过 LAMP 架构完成 MySQL 安装,确保服务正常运行(systemctl status mysqld
显示 active (running)
)。
(2)创建数据库与表
- 创建以自己名字为名的数据库(以“zyw”为例),并创建
student
表,表结构如下:mysql> create database zyw; Query OK, 1 row affected (0.00 sec)mysql> use zyw; Database changedmysql> create table student (-> id int(11) not null auto_increment,-> name varchar(100) not null,-> age tinyint(4) default null,-> primary key(id)-> ); Query OK, 0 rows affected (0.00 sec)mysql> desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
(3)查看新建表的内容(初始为空)
mysql> select * from student;
Empty set (0.00 sec)
(4)往 student 表中插入指定数据
mysql> insert into student (id,name, age) -> values -> (1, 'tom', 20),-> (2, 'jerry', 23),-> (3, 'chenyu', 25),-> (4, 'sean', 28),-> (5, 'zhangshan', 26),-> (6, 'zhangshan', 20),-> (7, 'lisi', null),-> (8, 'chenshuo', 10),-> (9, 'wangwu', 3),-> (10, 'qiuyi', 15),-> (11, 'qiuxiaotian', 20);
Query OK, 11 rows affected (0.00 sec)
Records: 11 Duplicates: 0 Warnings: 0mysql> select * from student;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 1 | tom | 20 |
| 2 | jerry | 23 |
| 3 | chenyu | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
| 7 | lisi | NULL |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
| 10 | qiuyi | 15 |
| 11 | qiuxiaotian | 20 |
+----+-------------+------+
11 rows in set (0.00 sec)
(5)修改 lisi 的年龄为 50
mysql> update student set age = 50 where name = 'lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from student where name = 'lisi';
+----+------+------+
| id | name | age |
+----+------+------+
| 7 | lisi | 50 |
+----+------+------+
1 row in set (0.00 sec)
(6)以 age 字段降序排序
mysql> select * from student order by age desc;
+----+-------------+------+
| id | name | age |
+----+-------------+------+
| 7 | lisi | 50 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 3 | chenyu | 25 |
| 2 | jerry | 23 |
| 1 | tom | 20 |
| 6 | zhangshan | 20 |
| 11 | qiuxiaotian | 20 |
| 10 | qiuyi | 15 |
| 8 | chenshuo | 10 |
| 9 | wangwu | 3 |
+----+-------------+------+
11 rows in set (0.00 sec)
(7)查询 student 表中年龄最小的 3 位同学,跳过前 2 位
mysql> select * from student where age is not null order by age asc limit 2, 1;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 10 | qiuyi | 15 |
+----+-------+------+
1 row in set (0.00 sec)
(8)查询 student 表中年龄最大的 4 位同学
mysql> select * from student where age is not null order by age desc limit 4;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 7 | lisi | 50 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
| 3 | chenyu | 25 |
+----+-----------+------+
4 rows in set (0.00 sec)
(9)查询 student 表中名字叫 zhangshan 的记录
mysql> select * from student where name = 'zhangshan';
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | zhangshan | 26 |
| 6 | zhangshan | 20 |
+----+-----------+------+
2 rows in set (0.00 sec)
(10)查询 student 表中名字叫 zhangshan 且年龄大于 20 岁的记录
mysql> select * from student where name = 'zhangshan' and age > 20;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | zhangshan | 26 |
+----+-----------+------+
1 row in set (0.00 sec)
(11)查询 student 表中年龄在 23 到 30 之间的记录
mysql> select * from student where age between 23 and 30;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 2 | jerry | 23 |
| 3 | chenyu | 25 |
| 4 | sean | 28 |
| 5 | zhangshan | 26 |
+----+-----------+------+
4 rows in set (0.00 sec)
(12)修改 wangwu 的年龄为 100
mysql> update student set age = 100 where name = 'wangwu';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0mysql> select * from student where name = 'wangwu';
+----+--------+------+
| id | name | age |
+----+--------+------+
| 9 | wangwu | 100 |
+----+--------+------+
1 row in set (0.00 sec)
(13)删除 student 中名字叫 zhangshan 且年龄小于等于 20 的记录
mysql> delete from student where name = 'zhangshan' and age <= 20;
Query OK, 1 row affected (0.00 sec)mysql> select * from student where name = 'zhangshan';
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 5 | zhangshan | 26 |
+----+-----------+------+
1 row in set (0.00 sec)
2. 多表关联操作
(14)创建 course 表
mysql> create table course (-> id int(3) not null,-> course_name varchar(100),-> primary key (id)-> );
Query OK, 0 rows affected (0.00 sec)mysql> desc course;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id | int(3) | NO | PRI | NULL | |
| course_name | varchar(100) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
(15)为 course 表插入数据
mysql> insert into course (id, course_name) -> values -> (1, 'Java'),-> (2, 'MySQL'),-> (3, 'Python'),-> (4, 'Go'),-> (5, 'C++');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | Java |
| 2 | MySQL |
| 3 | Python |
| 4 | Go |
| 5 | C++ |
+----+-------------+
5 rows in set (0.00 sec)
(16)创建 student123 表(含外键)
要求:
id
字段:int(3),主键;name
字段:varchar(100);age
字段:int(3);sex
字段:varchar(10);height
字段:int(3);course_id
字段:int(3),外键,参照 course 表中的主键。
mysql> create table student123 (-> id int(3) not null,-> name varchar(100),-> age int(3),-> sex varchar(10),-> height int(3),-> course_id int(3),-> primary key (id),-> foreign key (course_id) references course(id) -> );
Query OK, 0 rows affected (0.01 sec)mysql> desc student123;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id | int(3) | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
| height | int(3) | YES | | NULL | |
| course_id | int(3) | YES | MUL | NULL | | # MUL 表示外键
+-----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
(17)为 student123 表插入数据
mysql> insert into student123 (id, name, age, sex, height, course_id) -> values -> (1, 'Dany', 25, 'man', 160, 1),-> (2, 'Green', 23, 'man', 158, 2),-> (3, 'Henry', 23, 'woman', 185, 1),-> (4, 'Jane', 22, 'man', 162, 3),-> (5, 'Jim', 24, 'woman', 175, 2),-> (6, 'John', 21, 'woman', 172, 4),-> (7, 'Lily', 22, 'man', 165, 4),-> (8, 'Susan', 23, 'man', 170, 5),-> (9, 'Thomas', 22, 'woman', 178, 5),-> (10, 'Tom', 23, 'woman', 165, 5);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0mysql> select * from student123;
+----+--------+------+-------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+--------+------+-------+--------+-----------+
| 1 | Dany | 25 | man | 160 | 1 |
| 2 | Green | 23 | man | 158 | 2 |
| 3 | Henry | 23 | woman | 185 | 1 |
| 4 | Jane | 22 | man | 162 | 3 |
| 5 | Jim | 24 | woman | 175 | 2 |
| 6 | John | 21 | woman | 172 | 4 |
| 7 | Lily | 22 | man | 165 | 4 |
| 8 | Susan | 23 | man | 170 | 5 |
| 9 | Thomas | 22 | woman | 178 | 5 |
| 10 | Tom | 23 | woman | 165 | 5 |
+----+--------+------+-------+--------+-----------+
10 rows in set (0.00 sec)