目录
一. 对数据库的基本认识
1.1 数据库的概念
1.2 主流的数据库
1.3 数据存储逻辑
1.4 MySQL的架构
1.5 MySQL指令分类及运行登录
二. 对库的基本操作
2.1 库的创建、删除和查看
2.2 数据库的使用
2.3 数据库字符集和校验集
2.4 数据库的备份和恢复
三. 对表的基本操作
3.1 表的创建、删除和查看
3.2 向表中插入数据
3.3 对表的更改
四. 总结
数据库,是对数据进行存储、管理的一种工具,可以被视为一种电子化的文档柜,能够高效的支持数据的插入、删除、查询等操作。
在我们一般的认识中,数据是存储在文件中的,我们对文件进行操作就可以对数据进行管理,那么,既然有了文件为什么还要有数据库呢?
使用文件保存数据,具有以下缺陷:
针对文件管理数据的上述缺点,数据库作为一种高效、便捷的数据管理工具被开发了出来,用于对数据进行高效便捷的管理。
数据库是通过“表”的方式来对数据进行管理的,在每一个database中,可能存有若干张表,图1.1就是典型的数据库表结构,这是一张存储学生信息的表,其中包含学生学号、年龄、性别等信息。
如图1.2所示,MySQL数据库是一种网络服务,本地客户端通过网络连接到远端服务器上的MySQL服务进程进行操作,在一台服务器的MySQL服务中,可能存在多个库(database),每个database中有多张表,记录着不同的数据。
MySQL是一款可以在不同平台上进行移植的数据库,可以运行于Linux、Windows、Mac等多种操作系统中,不同系统中的MySQL底层实现略有不同,但是整体框架都符合图1.3的架构。
在MySQL中,最核心的是存储引擎,通过指令show engines,可以查看MySQL数据可所支持的存储引擎,如果1.4就是通过指令查看MySQL所支持的存储引擎的结果,其中最常用的存储引擎是InnoDB和MyISAM,这两种引擎的底层都是通过B树来实现检索的。
根据MySQL指令可以实现的不同功能,可以将指令分为四类:
如果当前的主机上安装有MySQL服务进程,那么通过下面的三条指令,可分别实现对MySQL服务进程的启动、停止和重新启动:
在启动MySQL服务进程后,就可以登录MySQL进行对应的操作。
MySQL登录指令为:mysql -h 主机IP -P 端口号 -u 用户 -p
如果是在本地主机进行登录,那么主机IP和端口号可以直接省略,相当于进行本地环回。
MySQL的登录和启动指令中,涉及到了mysqld和mysql,其中mysqld表示MySQL服务端,mysql表示客户端。
mysql> create database test1; -- 创建名为test1的数据库
Query OK, 1 row affected (0.00 sec)
mysql> show databases; -- 此时可以查看到新创建的test1数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
mysql> drop database test1; -- 删除test1数据库
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; -- 此时查不到test1数据库了
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
每当通过create database创建一个数据库后,都会在/var/lib/mysql路径下创建一个与数据库名称相同的文件夹,这个文件夹中就会存有这个数据库将来插入的数据。
注意:如果我们直接对/var/lib/mysql路径下的文件夹进行删除、创建等操作,也可以实现对数据库的创建和删除,但是这么做十分不推荐,通过mysql中的指令创建和删除数据库才是正确的。
显示创建语句:show create database 数据库名称;
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql> show create database test1;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| test1 | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
如果我们希望对特定的某个数据可进行操作,如创建表示、查询等,就需要确定所要进行操作的数据库,正是当前所使用的数据库。
mysql> use test1; -- 使用test1数据库
Database changed
mysql> select database(); -- 查看当前数据库,为test1
+------------+
| database() |
+------------+
| test1 |
+------------+
1 row in set (0.00 sec)
创建每一个数据库时,都有两个编码集:
在数据库中,对数据进行的任何操作,就必须要保证操作和编码一致,以防出现不可预知的错误。
下面两条指令,可以查看MySQL所支持的数据库字符集和数据库校验集:
以下两条指令,可以查看当前数据库所使用的字符集和校验集:
如果在创建数据库的时候不显示指出其使用的字符集和校验集,那么就采用默认的,MySQL数据库默认的字符集为utf8,默认的校验集为utf8_general_database。
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_database';
+--------------------+-----------------+
| Variable_name | Value |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)
创建数据库的时候可以显示给出字符集和校验集,下面两种语法都可以显示给定字符集:
显示给定校验集:create database 数据库名 collate 校验集
同时给出字符集和校验集:create database 数据库名 charset=字符集 character set 校验集;
mysql> create database test_database charset=gbk collate gbk_chinese_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use test_database;
Database changed
mysql> show variables like 'character_set_database'
-> ;
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | gbk |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_database';
+--------------------+----------------+
| Variable_name | Value |
+--------------------+----------------+
| collation_database | gbk_chinese_ci |
+--------------------+----------------+
1 row in set (0.01 sec)
还可以通过alter指令,来显示的修改数据库的字符集和校验集。
如下代码所示,原来数据的字符集和校验集分别为gbk和gbk_chinese_ci,将字符集更改为utf8,校验集随之变为了utf8_general_ci,这表明更改字符集操作,校验集也会随之改变,同理更改校验集,字符集也会随之改变。
mysql> alter database test_database charset=utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'collation_database';
+--------------------+-----------------+
| Variable_name | Value |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)
在实际项目中,删除数据库是十分不推荐的,如果要删除,那就必须预先进行备份,以便将来需要的时候将数据库恢复出来。
如何在数据库备份的时候不携带-B选项,那么在恢复数据库的时候,就必须预先创建空数据库,然后进行恢复。
数据库备份:
[root@VM-8-5-centos MySQL]# mysqldump -P3306 -uroot -p -B test_database > /root/MySQL/test.sql -- 将test_database数据库备份
Enter password:
[root@VM-8-5-centos MySQL]# ll
total 36
-rw-r--r-- 1 root root 25680 Dec 4 14:16 mysql57-community-release-el7.rpm
-rw-r--r-- 1 root root 1418 Dec 12 22:08 test.sql -- test_database数据库备份文件
-rw-r--r-- 1 root root 2036 Dec 12 08:58 users.sql
[root@VM-8-5-centos MySQL]#
数据库恢复:
mysql> source /root/MySQL/test.sql;
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, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (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>
在MySQL数据库中,有效数据是存储在表中的,那么我们在向数据库中插入数据前,就必须保证数据库中有表的存在。
删除表语法:drop table 表名称;
创建表的语法:
create table 表名称 {
成员名1 成员类型1 comment 'XXX1',
成员名2 成员类型2 comment 'XXX2',
.... ....
} charset=字符集 collate 校验集 engine 存储引擎;
在上述创建表的语法中,comment 'XXX'和编码集的指定可以省略,如果省略编码集,那么字符集和校验集,都会采用默认的。
下面是创建表的案例,创建名为student的表,成员包括name、age、id、gender。
mysql> create table student (
-> name varchar(20) comment '学生姓名',
-> age tinyint comment '学生年龄',
-> id varchar(15) comment '学生学号',
-> gender char(2) comment '学生性别'
-> )charset=utf8 collate utf8_general_ci;
Query OK, 0 rows affected (0.11 sec)
mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| student |
+-------------------------+
1 row in set (0.00 sec)
mysql> desc student; -- 查看表student的属性信息
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| id | varchar(15) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
下面两条指令可以查看表的创建语句:
用'\G'替换';',可以实现格式化的显示输出。
mysql> show create table student \G
*************************** 1. row ***************************
Table: student
Create Table: CREATE TABLE `student` (
`name` varchar(20) DEFAULT NULL COMMENT '学生姓名',
`age` tinyint(4) DEFAULT NULL COMMENT '学生年龄',
`id` varchar(15) DEFAULT NULL COMMENT '学生学号',
`gender` char(2) DEFAULT NULL COMMENT '学生性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
向表中插入数据是以行为单位的,如果要给每个成员都赋一个值,那么可以在插入语句中省略对于成员名的指定。在查看表中全部数据信息的语法中,*表示通配符。
mysql> insert into student values ('张三', 20, '1223', '男');
Query OK, 1 row affected (0.05 sec)
mysql> insert into student (name, age, gender) values ('王五', 22, '女');
Query OK, 1 row affected (0.03 sec)
mysql> select * from student;
+--------+------+------+--------+
| name | age | id | gender |
+--------+------+------+--------+
| 张三 | 20 | 1223 | 男 |
| 王五 | 22 | NULL | 女 |
+--------+------+------+--------+
2 rows in set (0.00 sec)
如果希望筛选出表中特定的信息,那么也可以通过select指令来进行,如下代码所示,筛选出表中age=20的学生信息,通过 select + where 可以实现。
mysql> select * from student where age=20;
+--------+------+------+--------+
| name | age | id | gender |
+--------+------+------+--------+
| 张三 | 20 | 1223 | 男 |
+--------+------+------+--------+
1 row in set (0.01 sec)
修改表的名称:alter table 表名称 rename to 新名称;
将原来数据库中的表student更改为Stu,在更改前后通过show tables指令查看全部的表,可以发现更名成功了。
mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| student |
+-------------------------+
1 row in set (0.00 sec)
mysql> alter table student rename to Stu;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| Stu |
+-------------------------+
1 row in set (0.00 sec)
在表中添加新的列:alter table 表名称 add 新列名 新列类型 comment 'XXX' after 添加位置;
在添加新列的语法中,comment和after可以省略,如果after,那么新列的位置默认会在原来的表的最后一列的后面。下面的代码在上面Stu表的id列后面添加address列,在最后添加sources列,并在添加新列前后通过desc Stu 查看表结构。
mysql> desc Stu;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| id | varchar(15) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table Stu add address varchar(20) comment '地址' after id;
Query OK, 0 rows affected (0.34 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table Stu add source int;
Query OK, 0 rows affected (0.38 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc Stu;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| id | varchar(15) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
| source | int(11) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
更改列名称:alter table 表名称 change 原列名 新列名 新类型;
更改列类型:alter table 表名称 modify 列名称 新类型;
mysql> alter table Stu change id stuId varchar(20); -- 将id更名为stuId并更改类型
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table Stu modify gender varchar(5); -- 更改gender的类型为varchar(5)
Query OK, 2 rows affected (0.50 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc Stu;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| stuId | varchar(20) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
| gender | varchar(5) | YES | | NULL | |
| source | int(11) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)