MySQL 学习二:数据库的操作

1、创建数据库

首先,是创建数据库的语法:

sql 复制代码
create database [if not exists] db_name [create_specification [,create_specification] ...];

  • \] 代表可选项

    default\] character set charset_name / charset=charset_name ------ 指定数据库使用 *charset_name* 字符集 \[default\] collate collation_name ------ 指定数据库使用 *collation* 校验集

Extra:

这里展示一下如何查看当前版本的 MySQL 下有哪些字符集?

SQL 复制代码
show charset;

这里展示一下如何查看当前版本的 MySQL 下有哪些校验集?

SQL 复制代码
show collation;

当查看一种集的时候,也会自动给出其相对应匹配的集。


2、使用实例

eg:

SQL 复制代码
mysql> create database if not exists test1 charset=gbk collate gbk_chinese_ci;
Query OK, 1 row affected (0.02 sec)

此时我们已经创建好一个名为 test1 数据库了,用的字符集是 gbk ,用的校验集是 gbk_chinese_ci ,那么这时候该如何检查这个 test1 的字符集和校验集呢?


(1) 查看创建数据库时的选项

MySQL 复制代码
show create database db_name;

(2) 查看当前数据库的字符集

MySQL 复制代码
show variables like "character_set_database";

(3) 查看当前数据库的校验集

MySQL 复制代码
show variables like "collation_database";

(1)

MySQL 复制代码
mysql> show create database test1;

这里就可以看到字符集是 gbk ,虽然没有显示校验集,但是这里默认的就是 gbk 对应的校验集 gbk_chinese_ci

后面 /*!40100.../ 中的 40100 指的是大于4.01版本的话就执行后面的字符集指定为 gbk 这句话。

(2) && (3)

MySQL 复制代码
mysql> show variables like "character_set_database";
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_database | gbk     |
+------------------------+---------+
1 row in set (0.01 sec)

mysql> show variables like "collation_database";
+--------------------+--------------------+
| Variable_name      | Value              |
+--------------------+--------------------+
| collation_database | gbk_chinese_ci     |
+--------------------+--------------------+
1 row in set (0.00 sec)

Extra:

查看当前数据库是哪个:

MySQL 复制代码
select database();

eg:

MySQL 复制代码
mysql> select database();
+------------+
| database() |
+------------+
| test1      |
+------------+
1 row in set (0.00 sec)

3、检验校验集的作用

字符集的作用就像两个不同国家的人进行对话,假如其中一个人使用中文对话,那么对方也需要使用中文才能理解对面说的话。

而校验集的作用就是在进行索引表格中的内容的方法。

下面就直接对校验集的作用进行检验:

utf8_general_ci,不区分大小写

utf8_bin,区分大小写

eg:

test1(使用 utf8_general_ci)

MySQL 复制代码
mysql> create database test1 collate utf8_general_ci;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> use test1;
Database changed
mysql> create table person(name varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into person values('a');
on values('b');
insert into person values('B');Query OK, 1 row affected (0.02 sec)

mysql> insert into person values('A');
Query OK, 1 row affected (0.00 sec)

mysql> insert into person values('b');
Query OK, 1 row affected (0.01 sec)

mysql> insert into person values('B');
Query OK, 1 row affected (0.01 sec)

mysql> select * from person;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
+------+
4 rows in set (0.00 sec)

mysql> select * from person where name="a";
+------+
| name |
+------+
| a    |
| A    |
+------+
2 rows in set (0.00 sec)

mysql> select * from person order by name;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
+------+
4 rows in set (0.00 sec)

:使用某个数据库之前都需要使用 use db_name 来改变当前数据库;

where 是用来寻找某一列中的某一行元素;

order by name 是用某一列的元素对表格进行排列后。

从这里就能看出来 utf8_general_ci 是不区分大小写的。

test2(使用 utf8_bin)

MySQL 复制代码
mysql> create database test2 charset=utf8 collate utf8_bin;
Query OK, 1 row affected, 2 warnings (0.01 sec)

mysql> use test2;
Database changed
mysql> create table person(name varchar(20));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into person values('a');
insert into person values('b');
insert into person values('B');Query OK, 1 row affected (0.02 sec)

mysql> insert into person values('A');
Query OK, 1 row affected (0.00 sec)

mysql> insert into person values('b');
Query OK, 1 row affected (0.01 sec)

mysql> insert into person values('B');
Query OK, 1 row affected (0.01 sec)

mysql> select * from person;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
+------+
4 rows in set (0.00 sec)

mysql> select * from person where name="a";
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.00 sec)

mysql> select * from person order by name;
+------+
| name |
+------+
| A    |
| B    |
| a    |
| b    |
+------+
4 rows in set (0.00 sec)

从这里就能看出来 utf8_bin 是区分大小写的。

这两个实例也证明了一个结论:校验集的作用就是在进行索引表格中的内容的方法。

4、操纵数据库

显示数据库

MySQL 复制代码
show databases;

eg:

MySQL 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
10 rows in set (0.03 sec)

修改数据库

MySQL 复制代码
alter database db_name [alter_spacification [,alter_spacification]...];

:alter_spacification:

​ [default] character set charset_name / charset=charset_name

​ [default] collate collation_name

eg:

MySQL 复制代码
mysql> select database(); #查看当前所使用的数据库
+------------+
| database() |
+------------+
| test2      |
+------------+
1 row in set (0.00 sec)

mysql> show variables like "character_set_database"; #查看未修改前数据库的字符集
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_database | utf8mb3 |
+------------------------+---------+
1 row in set (0.03 sec)

mysql> show variables like "collation_database"; #查看未修改前数据库的校验集
+--------------------+-------------+
| Variable_name      | Value       |
+--------------------+-------------+
| collation_database | utf8mb3_bin |
+--------------------+-------------+
1 row in set (0.01 sec)

mysql> alter database test2 charset=gbk collate gbk_chinese_ci; #修改该数据库的字符集和校验集
Query OK, 1 row affected (0.04 sec)

mysql> show variables like "character_set_database"; #查看修改后该数据库的校验集
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | gbk   |
+------------------------+-------+
1 row in set (0.01 sec)

mysql> show variables like "collation_database"; #查看修改后的校验集
+--------------------+----------------+
| Variable_name      | Value          |
+--------------------+----------------+
| collation_database | gbk_chinese_ci |
+--------------------+----------------+
1 row in set (0.00 sec)

删除数据库

MySQL 复制代码
drop database [if exists] db_name;

:删除数据库的本质就是将该数据库对应的文件夹删除,包括其子文件。------所以此时库中的表的数据也就全部没了,因此,不推荐删除数据库,或者是先对该数据库备份后再删除。

eg:

MySQL 复制代码
mysql> show databases; #展示未删除 test1 前所有的数据库
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
10 rows in set (0.00 sec)

mysql> drop database if exists test1; #删除 test1 数据库
Query OK, 1 row affected (0.05 sec)

mysql> show databases; #展示删除 test1 数据库后的所有数据库
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test2              |
+--------------------+
9 rows in set (0.00 sec)

对数据库进行备份和还原

最简单的方式就是直接手动的对需要备份的数据库进行打包,但是 MySQL 官方也提供了相应的备份数据库的方法:

MySQL 复制代码
mysqldump -P 端口号 -u 用户名 -p 密码 -B 数据库名称 > 数据库备份的文件路径 #备份方法

source 数据库备份的文件路径; #还原方法

eg:

MySQL 复制代码
mysql> create database test1; #创建 test1 数据库
Query OK, 1 row affected (0.03 sec)

mysql> use test1;
Database changed
mysql> create table person (name varchar(20)); #创建 person 表格
Query OK, 0 rows affected (0.06 sec)

#插入数据到 person 表格
mysql> insert into person(name) values("a");
Query OK, 1 row affected (0.02 sec)

mysql> insert into person(name) values("b");
Query OK, 1 row affected (0.00 sec)

mysql> insert into person(name) values("c");
Query OK, 1 row affected (0.00 sec)

mysql> select * from person; #获取 person 表格的信息
+------+
| name |
+------+
| a    |
| b    |
| c    |
+------+
3 rows in set (0.00 sec)

mysql> exit
Bye
root@LAPTOP-UVPN73B8:/home/wjy/MySQL# ls
#备份test1数据库
root@LAPTOP-UVPN73B8:/home/wjy/MySQL# mysqldump -uroot -B test1 > test1.sql 
root@LAPTOP-UVPN73B8:/home/wjy/MySQL# mysql -uroot
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
10 rows in set (0.00 sec)

mysql> drop database test1; #删除 test1 数据库
Query OK, 1 row affected (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test2              |
+--------------------+
9 rows in set (0.00 sec)

mysql> source test1.sql; #还原 test1 数据库
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected, 1 warning (0.02 sec)

Database changed
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.04 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| db3                |
| helloworld         |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
10 rows in set (0.00 sec)

mysql> use test1;
Database changed
mysql> select * from person; #确认 test1 数据库中表格是否一致
+------+
| name |
+------+
| a    |
| b    |
| c    |
+------+
3 rows in set (0.00 sec)

事实上 mysqldump 就是将数据库的操作复现一遍,这个我们可以看一下对应的备份文件:

MySQL 复制代码
root@LAPTOP-UVPN73B8:/home/wjy/MySQL# cat test1.sql
-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
--
-- Host: localhost    Database: test1
-- ------------------------------------------------------
-- Server version       8.0.43-0ubuntu0.22.04.1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `test1`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test1` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `test1`;

--
-- Table structure for table `person`
--

DROP TABLE IF EXISTS `person`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `person` (
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `person`
--

LOCK TABLES `person` WRITE;
/*!40000 ALTER TABLE `person` DISABLE KEYS */;
INSERT INTO `person` VALUES ('a'),('b'),('c');
/*!40000 ALTER TABLE `person` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2025-09-12 22:17:44

(1)、假如只是备份数据库中的表格,那么对应的语法是:

MySQL 复制代码
mysqldump -u 用户名 -p 密码 数据库名 表名1 表名2 > 数据库备份的文件路径

(2)、假如是要同时备份多个数据库,那么对应的语法是:

MySQL 复制代码
mysqldump -u 用户名 -p 密码 -B 数据库名1 数据库名2 ... > 数据库备份的文件路径

(3)、假如备份数据的时候没有带上 -B 选项,那么还原之前需要手动创建一个空的数据库,然后再使用这个数据库,才能进行还原。------原因:-B 选项对应的就是 create database db_name; use db_name; 没有这个建库语句和使用数据库语句后面的执行语句都会是当在前客户端所对应的数据库下执行,会影响别的数据库的数据。

(4)、阐述一下直接打包备份数据库和 mysqldump 备份数据库之间的区别:

5、查看数据库连接情况

语法:

MySQL 复制代码
show processlist;

eg

MySQL 复制代码
mysql> show processlist; 
相关推荐
Tony Bai1 小时前
【Go开发者的数据库设计之道】07 诊断篇:SQL 性能诊断与问题排查
开发语言·数据库·后端·sql·golang
cpsvps_net1 小时前
VPS服务器锁等待超时处理,如何有效解决数据库性能瓶颈
服务器·数据库·oracle
花花鱼2 小时前
spring boot项目使用tomcat发布,也可以使用Undertow(理论)
spring boot·后端·tomcat
叱咤少帅(少帅)2 小时前
DML语句
mysql
编码追梦人3 小时前
探索 Docker/K8s 部署 MySQL 的创新实践与优化技巧
mysql·docker·kubernetes
你的人类朋友4 小时前
快速搭建redis环境并使用redis客户端进行连接测试
前端·redis·后端
文火冰糖的硅基工坊4 小时前
[创业之路-653]:社会产品与服务的分类
大数据·数据库·人工智能
235164 小时前
【MySQL】数据库事务深度解析:从四大特性到隔离级别的实现逻辑
java·数据库·后端·mysql·java-ee
脚踏实地的大梦想家5 小时前
【LangChain】P7 对话记忆完全指南:从原理到实战(下)
数据库·langchain
conkl5 小时前
Flask 与 MySQL 数据库集成:完整的 RESTful API 实现指南
数据库·mysql·flask