数据库服务器、数据库和表的关系如下:
mysqld
就是 MySQL 数据库服务器的守护进程程序,它是 MySQL 数据库系统的核心组件之一。mysqld
进程负责监听 MySQL 数据库服务器的端口,接受客户端连接请求,处理 SQL 查询请求,管理数据库文件、表、索引等对象,以及执行各种数据库操作,如备份、恢复、复制等。mysqld
进程在运行时会读取 MySQL 配置文件(通常是 /etc/my.cnf
文件),根据配置文件中的参数设置来决定 MySQL 数据库服务器的行为。
当在系统中安装 MySQL 数据库时,通常会同时安装 mysqld
进程。在 Linux 系统中,可以通过启动、停止、重启 mysqld
进程来控制 MySQL 数据库服务器的启停和重启,常见的命令是 systemctl start/stop/restart mysqld
。
查看配置文件
cat /etc/my.cnf
datadir 参数是指定 MySQL 数据库服务器存储数据库文件的目录路径。
建立一个数据库,本质是在 Linux 下建立了一个目录。也就是说,你不仅可以使用 SQL 指令创建数据库,也可以在 datadir 路径下直接新建目录来创建数据库,但是我们不建议这样做。
建立一个表,本质是在 Linux 下建立了一个文件。
MySQL 是一个关系型数据库管理系统(RDBMS),它是基于表的。
MySQL 中的表是由列(列名和列的数据类型)和行(具体的数据)组成的,每个表都有一个唯一的表名,并且可以在表中定义索引以提高查询效率。
例:
create
drop
alter
insert
delete
update
select
grant
revoke
commit
存储引擎是数据库管理系统存储数据,为存储的数据建立索引、更新、查询等技术的实现方法。
MySQL 的核心就是插件式存储引擎,支持多种存储引擎。
show engines; -- 查看支持的存储引擎
语法:
SHOW DATABASES;
该命令将返回所有可用的数据库列表,包括系统默认的数据库和用户创建的数据库。
例:
执行该命令将返回类似如下结果:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| stu |
+--------------------+
其中,information_schema
、mysql
和 performance_schema
是 MySQL 系统默认的数据库。
语法:
CREATE DATABASE [IF NOT EXISTS] database_name [CHARACTER SET charset_name] [COLLATE collation_name];
大写的表示关键字。实际上 SQL 语言对关键字的大小写不敏感,所以平时写 SQL 语句时关键字可大写也可小写。
[] 表示可选项。
CREATE DATABASE
用于创建一个新的数据库。
[IF NOT EXISTS]
表示如果该数据库不存在,才执行创建操作,否则将会抛出错误。
database_name
为要创建的数据库的名称,可以使用任意字符,但需要遵循 MySQL 标识符的命名规则。
[CHARACTER SET charset_name]
用于指定数据库的字符集。
[COLLATE collation_name]
用于指定数据库的排序规则。
例:
创建一个名为 mydb
的数据库:
CREATE DATABASE `mydb`;
如果该数据库不存在,则创建一个名为 mydb
的数据库。如果该数据库已经存在,则会返回一个错误。如果需要在创建数据库时指定字符集和排序规则,可以使用以下语句:
CREATE DATABASE IF NOT EXISTS `mydb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
该语句创建了一个名为 mydb
的数据库,并将其字符集设置为 utf8mb4
,排序规则设置为 utf8mb4_unicode_ci
。如果该数据库已经存在,则不会执行创建操作。
注:
database_name
通常使用反引号(`)括起来。
在 MySQL 中,使用反引号(`)将标识符括起来可以使其成为一个独立的标识符,即使标识符中包含了空格、关键字或其他特殊字符。
SHOW CREATE DATABASE
命令,用于显示指定数据库的创建语句。该语句包含了创建数据库时使用的所有参数和选项,包括数据库名、字符集、排序规则等。
例:
语法:
DROP DATABASE [IF EXISTS] database_name;
注意:
一旦数据库被删除,所有与之相关的数据都将永久删除。因此,在执行此操作之前,请确保已经备份好需要保留的数据。
语法:
USE database_name;
database_name
是要选择的数据库名称。该语句将使得后续的查询、插入、更新等操作默认在该数据库中进行。
使用 DATABASE()
函数
SELECT DATABASE();
该函数不需要任何参数,调用它将返回当前选择的数据库名称。如果当前没有选择任何数据库,则该命令返回 NULL
。
语法:
-- 修改数据库字符集和校验规则
ALTER DATABASE database_name CHARACTER SET character_set_name COLLATE collation_name;
old_database_name
是要修改名称的数据库名称,new_database_name
是新的数据库名称。
database_name
是要修改的数据库名称,character_set_name
是新的字符集名称,collation_name
是新的校验规则名称。
CHARACTER SET
也可以写成 CHARSET=
例:
将名为 test
的数据库的名称修改为 new_test
ALTER DATABASE test RENAME TO new_test;
将 test
数据库的字符集修改为 utf8mb4
,校验规则修改为 utf8mb4_general_ci
ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
注意:
修改数据库的字符集和校验规则会影响所有表格和列的字符集和校验规则。因此,在执行 ALTER DATABASE 命令之前,请确保已经备份了所有数据,并且了解修改操作可能带来的风险。
ALTER不支持修改数据库名:
MySQL 修改数据库名称比较麻烦,不支持直接修改,需要通过其它方式间接达到修改数据库名称的目的。
在 MySQL 5.1.23 之前的旧版本中,我们可以使用 RENAME DATABASE
来重命名数据库,但此后版本,因为安全考虑,删掉了这一条命令。
上面说过,可以通过在 datadir 下创建目录来创建数据库,那么当然也可以在 datadir 下直接修改目录名,但是我们不建议这样做。
要查看 MySQL 实例的默认字符集和排序规则,可以使用以下命令:
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
字符集和排序规则在 MySQL 中非常重要,因为它们直接影响到数据库中存储和处理的数据。
字符集决定了数据库中可以存储哪些字符以及如何存储这些字符。不同的字符集支持不同的字符,如 ASCII 字符集只支持英文字母和数字,而 UTF-8 字符集支持更广泛的字符范围,包括不同语言的文字和符号等。同时,字符集还定义了每个字符的编码方式,以确保数据可以在不同的系统和应用程序之间正确地传输和处理。
排序规则决定了在对数据库中的字符数据进行排序时使用哪种规则。这是因为不同的字符集和语言中,字符的排序方式可能是不同的。例如,在中文中,字符的排序方式是根据拼音排序,而在英文中则是按照字典序排序。如果没有正确地设置排序规则,就可能导致排序结果不准确或不符合预期。
因此,字符集和排序规则对于正确存储和处理数据库中的字符数据非常重要,尤其是在涉及多语言和多字符集的应用程序中。在 MySQL 中,通过设置合适的字符集和排序规则,可以确保数据库中的数据可以正确地存储、传输和处理。
注:
在“创建数据库”的语法中我们注意到,在创建数据库时可以指定字符集和排序规则,但是通常我们不这样做。因为不需要指定,它就会使用我们已经配置好的默认字符集和排序规则。
语法:
CREATE TABLE [IF NOT EXISTS] table_name (
column1 datatype constraints,
column2 datatype constraints,
...
columnN datatype constraints
) [CHARSET=字符集] [COLLATE=校验规则] [ENGINE=存储引擎];
table_name
是要创建的表格名称。
column1
到 columnN
是表格的列名。
datatype
是列数据类型。
constraints
是列的约束条件,如默认值、非空、唯一性等。
最后一行指定字符集,校验规则,存储引擎是可选项
例:
创建一个名为 students
的表格,包含 id
、name
和 gender
三个字段,可以使用以下命令:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender ENUM('M', 'F') DEFAULT 'M'
);
id
、name
和 gender
三个字段,分别使用了 INT
、VARCHAR
和 ENUM
三种数据类型。其中,id
是主键,name
不允许为空,gender
有默认值 ‘M’,且只能取值为 ‘M’ 或 ‘F’。
执行该命令后,如果创建成功,系统会提示 Query OK, 0 rows affected
,表示成功创建了一个名为 students
的表格。如果创建失败,系统会给出相应的错误提示信息。
注:使用 comment 注释表和列:
在 MySQL 中,可用 comment
注释表和列,可以用来记录该表或列的作用、用途、限制、注意事项等信息。
例如,在创建一个名为 employees
的表时,可以添加一个注释来描述该表的作用:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
hire_date DATE,
salary DECIMAL(10,2),
comment '员工信息表'
);
使用 SHOW CREATE TABLE
命令可以查看表的详细信息,包括注释信息。例如:
SHOW CREATE TABLE employees;
输出结果如下:
CREATE TABLE `employees` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`hire_date` date DEFAULT NULL,
`salary` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表'
在列中添加注释的方式与上面类似,只需要在列定义后面添加 COMMENT
关键字即可。
在选择了数据库后,使用
SHOW TABLES;
语法:
DESC table_name;
执行 DESC
命令后,MySQL 会返回该表格的列信息,如列名、数据类型、是否允许为空、默认值等。
例:
查询刚才创建的 students 表格
该输出表格中的每一行表示一个列的信息,包括 Field
(列名)、Type
(数据类型)、Null
(是否允许为空)、Key
(键类型)和 Default
(默认值),Extra
表示该列的一些额外信息,如自增长属性、虚拟列等。如果某个字段不允许为空,则其 Null
列显示 NO
;如果该字段为主键,则其 Key
列显示 PRI
。
语法:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
table_name
表示要插入数据的表格名称。
column1, column2, column3, ...
列出了要插入数据的列名称。
value1, value2, value3, ...
对应了这些列要插入的值。
例:
向 students
表格中插入一条记录,包括 id
、name
和 gender
三个列,可以使用以下语句:
INSERT INTO students (id, name, gender)
VALUES (1, 'Alice', 'F');
这条语句会向 students
表格中插入一条 id
为 1、name
为 'Alice'
、gender
为 'F'
的记录。如果不指定列名称,可以省略列名列表,如下所示:
INSERT INTO students
VALUES (1, 'Alice', 'F');
这条语句与上述语句等价,因为 students
表格中的列顺序与指定的值的顺序一致。不过不建议这样写,上面的写法不容易出错,同时可以使代码更加易于维护。
SELECT 语句用于从一个或多个表中检索数据。
语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column_name ASC|DESC;
column1, column2, ...
列出了要检索的列名称,可以使用通配符 *
表示所有列。
table_name
指定了要检索数据的表格名称。
WHERE condition
是可选的,表示用于筛选要检索的行的条件,可以使用比较运算符、逻辑运算符、通配符等进行筛选。
ORDER BY column_name ASC|DESC
是可选的,表示按照指定列进行升序或降序排列。
例:
从名为 student
的表格中检索所有列
只检索 name
和 gender
两列,并且只需要检索 gender
为 'F'
的记录
将 students
表格按照 id
列进行降序排列:
以上只是 SELECT 语句的一些基本用法,实际上 SELECT 语句有很多高级用法,如聚合函数、子查询、连接查询等,这些我们会在后面的章节中进行讲解。
-- 添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
-- 修改列的数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 修改列名
ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型;
-- 删除列
ALTER TABLE 表名 DROP 列名;
-- 添加主键
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
-- 添加唯一索引
ALTER TABLE 表名 ADD UNIQUE (列名);
-- 添加普通索引
ALTER TABLE 表名 ADD INDEX (列名);
-- 删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
-- 修改表名
ALTER TABLE 旧表名 RENAME TO 新表名; -- TO可省略
-- 修改存储引擎
ALTER TABLE 表名 ENGINE=存储引擎名称;
-- 修改表的字符集和校对规则
ALTER TABLE 表名 CONVERT TO CHARACTER SET 字符集名称 COLLATE 校对规则名称;
DROP TABLE [IF EXISTS] table_name [, table_name] ... [RESTRICT | CASCADE];
IF EXISTS
:可选项,表示在删除表时,如果表不存在则不会报错。table_name
:需要删除的表的名称,支持同时删除多个表,用逗号隔开。RESTRICT
:可选项,表示在删除表时,如果有其他对象依赖于该表,则不会删除该表。CASCADE
:可选项,表示在删除表时,同时删除依赖于该表的对象。使用 mysqldump 工具备份:
mysqldump 是一个命令行工具,可以用来备份 MySQL 数据库。
语法:
mysqldump -u [用户名] -p [密码] [数据库名] > [备份文件路径]
[用户名]
和 [密码]
分别是要使用的 MySQL 用户名和密码
[数据库名]
是要备份的数据库名称,[备份文件路径]
是备份文件的保存路径。
注:[数据库名]
可以带 -B
选项,这样在还原数据库时,不需要先创建空的数据库。
例:
备份名为 test
的数据库,可以使用以下命令:
mysqldump -u root -p test > /home/user/test_backup.sql
本质上
mysqldump 本质上是通过生成一组 SQL 语句来备份数据库中的数据和结构。备份时,mysqldump 会将数据库中所有的表结构和数据导出为一组 SQL 语句,并将这些语句保存到一个文本文件中。在需要恢复数据时,可以使用这个文本文件来重新创建数据库,并将数据导入到新创建的数据库中。
打开备份的文件,类似于这样:
注:
mysqldump
命令的 --tables
参数指定要备份的表名,语法如下:mysqldump -u username -p --tables database_name table1 table2 table3 > backup_file.sql
mysqldump -u username -p --databases db1 db2 db3 > backup_file.sql
-B
参数,在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用 source 来还原。source
命令是 MySQL 客户端工具中的一个命令,用于在当前 MySQL 连接中执行指定的 SQL 脚本文件。
基本步骤:
选择要执行脚本文件的数据库。
use database_name;
使用source
命令执行 SQL 脚本文件,也就是我们刚刚用 mysqldump 备份出来的 sql 文件。
source /path/to/script.sql;
/path/to/script.sql
是要执行的SQL脚本文件的路径。
例:
进入一个空的数据库
执行备份文件,会显示许多 Query OK
查询表,表结构,检索数据,发现数据还原成功
SHOW PROCESSLIST
命令用于显示当前 MySQL 服务器上正在执行的所有连接和相应的进程列表。
例:
上述结果中,每一行代表一个MySQL连接和进程的信息,其中Id
表示连接ID,User
表示连接的用户名,Host
表示连接的主机名,db
表示当前连接正在使用的数据库名,Command
表示当前连接正在执行的命令,Time
表示连接已经持续的时间(单位为秒),State
表示当前连接的状态,Info
表示当前连接正在执行的SQL语句或命令。