目录
什么是数据库
从软件角度出发
从网络角度出发
MySQL数据库的client端和sever端进程
mysql的client端进程连接sever端进程
mysql配置文件
MySql存储引擎
MySQL的sql语句的分类
数据库 库的操作
创建数据库
不同校验规则对查询的数据的影响
不区分大小写
区分大小写
查看数据库
编辑
查看数据库创建语句
修改数据库(强烈不建议)
编辑
删除数据库
编辑 查看连接状态
表的操作
创建表
查看表结构
对表的操作
向表中插入记录
向表中插入新的字段
修改表的某一个字段(强烈不建议)
修改表名(强烈不建议)
删除表的某一字段
删除表
在此之前,我们已经学习了C++,数据结构,操作系统和计算机网络的相关知识,本期开始,我们将进行MySQL数据库相关知识的学习。
什么是数据库
数据库是一个大家都耳熟能详的技术,但是数据库到底是什么呢?
要了解数据库是什么,我们可以从两个角度去探讨数据库是什么。
从软件角度出发
应用层的软件中的一些表的数据,其实都是持久化存储在磁盘之上的,我们要去磁盘上访问表中的数据,这是很麻烦的一件事,我们要自己在应用层软件之中写入大量的访问磁盘中表数据的接口,这样就会导致,应用层软件访问表资源的效率非常的慢,且应用层软件设计时非常的复杂。所以我们引入了数据库的概念,数据库其实就是基于应用层软件和磁盘中间的一个应用层软件,可以帮助用户进行复杂的表的各种增删查改操作,因为其里面封装了大量的增删查改接口。
图示如下。
从网络角度出发
数据库我们也可以称其为一款网络服务,但这其实并不是一个准确的说法,更准确的说法应该其实就是一款客户端进程和服务器端进程组合起来的一种进行数据存储技术。
图示如下。
我们通过netstat -nltp查看MySQL数据库的网络服务。
大家只需要记得, 数据库中包含了网络服务就行,这个网络服务是可以被多个client端进程访问的,所以数据库安全问题就此产生,不过这不是我们本期的重点。
数据库的种类有很多种,我们要学习的是一款应用最为广泛的数据库,即MySQL数据库。
MySQL数据库的client端和sever端进程
我们上文已经讲过了,数据库本质上其实就是两个进程,一个是client端mysql进程,一个是sever端mysql进程。
一般情况下,我们自己使用数据库时,client端数据库进程和sever端数据库进程都是处于同一台主机的,我个人的mysql进程和mysqld进程是出于同一服务器主机上的。对应的目录分别为。
- client端mysql进程(可执行程序)路径:/usr/bin/mysql
- sever端mysql进程(可执行程序)路径:/usr/sbin/mysqld
mysql的client端进程连接sever端进程
连接指令如下。
mysql -h 127.0.0.1 -P 3306 -u root -p
-h表示连接的主机的ip地址,-p表示连接的主机中对应的端口号,-u代表登录数据库的用户试是谁,-p代表着要输入密码。
mysql配置文件
在/etc目录下有一个my.cnf文件,这个文件为MySQL的client端进程mysql和sever端进程mysqld的配置文件。
MySql存储引擎
可以通过show engine查看mysql支持的存储引擎。
mysql中常用的存储引擎就是InnoDB和MyISAM。
说了这么多,那么这个存储引擎到底是个啥?
上文我们已经讲过了,client端mysql进程发送sql请求至sever端mysqld进程,然后mysqld进程处理sql语句创建数据库和数据库表,我们也说过了创建的数据库和数据库表会存储在主机中的特定的目录下,数据库和数据库表都是文件,也就意味着创建的数据库和数据库表最终会持久化在磁盘上。此时存储引擎就可以发挥出它的作用了,它可以采取一些高效的措施将生成的数据库和表文件持久化在磁盘上,将来从磁盘上访问数据库和数据库表也会有自己的检索策略,从而提高数据库文件和数据库表文件的存储效率,以及检索文件中数据的效率。
MySQL的sql语句的分类
上文已经说过了,在MySQL中我们使用sql语句进行数据库和数据库表的创建,所以sql语句也会被分类,在MySQL中sql语句被分了三类。
- DDL【Data Definition Language】:数据库定义语言,用来维护数据库数据的结构。相关的指令有create,drop,alter。
- DML【Data Manipulation Language】: 数据库操纵语言,用来对数据进行操作。相关的指令有insert,delete,select,update。
- DCL【Data Control Language】:数据控制语言,用来负责权限管理和事务。相关的指令有grant,revoke,commit。
数据库 库的操作
创建数据库
首先说明,在sql语句中,不区分大小写,一条sql语句以一个 ; 隔开。
create database [if not exists db_name [charset=utf8] [collate utf8_general_ci];
其中,charset表示创建的数据库的编码规则,collate表示数据库校验规则,校验规则可以通俗的理解为,在数据库中建表以后,采用相同的sql进行查询,但是可能因为校验规则的不同导致将来查询的结果不同。
括号中的sql语句都是可以省略的,但是要注意的是,编码规则和校验规则如果省略了,就是用数据库默认的编码规则和校验规则,可以在/etc/my.cnf中配置默认的编码规则和校验规则,默认情况下,数据库的编码和校验规则分别为utf8和utf8_general_ci。
上图我们创建了一个名为study的数据库,打开/var/lib/mysql目录。
我们不难发现,创建了一个study的数据库,本质就是在/var/lib/mysql目录下创建了一个study数据库目录,目录里就是数据库的配置文件。
可以使用 show charset 和 show collation 查看MySQL数据库支持的编码规则和校验规则。
不同校验规则对查询的数据的影响
不区分大小写
使用 utf8_general_ci 校验规则,查询出来的数据不区分大小写。
我们使用上述校验规则,创建了一个学生表,如果创建的表没有限定编码规则和校验规则,则继承数据库的编码规则和校验规则。
依次插入 'A','a','B','b' 字符。
查询性别为 'a' ,'B' 的学生记录。
我们发现,这两次查询没有区分大小写,将 'A','a','B','b'都查询了出来。
区分大小写
使用 utf8_bin 校验格式在将来查询数据时,是区分大小写的。
创建了一个student表,校验格式为 utf8_bin。
依次插入 'A','a','B','b' 字符。
查询性别为 'A' ,'b' 学生记录。
我们发现,最终查询出来的记录都是查询的大写 'A' 和 小写 'b' 。
由此不难发现,数据库表的校验规则的不同,想通条件查询出来的数据记录也是不同的。
查看数据库
show databases;
查看数据库创建语句
show create database db_name;
修改数据库(强烈不建议)
修改数据库的操作很有可能为上层应用代码造成很大的影响,所以数据库一旦创建好了就不建议再去修改。
alter dataebase db_name;
修改数据库study的编码规则为gbk。
修改数据库study1的名称为study2。
我们使用上述方法是改不了数据库名称的,因为MySQL为了避免更改数据库带来不必要的风险,一般情况下是不允许更改数据库名称的,但是有其它的方法更改,但是我们仍然强烈建议不要更改数据库, 不要更改数据库,不要更改数据库,重要的事情说三遍!!!
删除数据库
drop database db_name;
查看连接状态
可以通过下列sql语句查看有多少mysql客户端进程连接上了mysqld服务器端进程。
show processlist;
表的操作
创建表
CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype) character set 字符集 collate 校验规则 engine 存储引擎;
创建一个person表。
创建表其实也是在var/lib/mysql下的数据库目录中创建对应的表相关文件。
- person.frm:表结构
- person.MYD:表数据
- person.MYI:表索引
我们创建的person表的存储引擎为MyISAM,需要注意的是,不同的存储引擎在对应目录下生成的表文件是不一样的。
查看表结构
desc tb_name;
对表的操作
在数据库中,一列的标题我们就称之为一个字段,一行我们就称之为一条记录。
向表中插入记录
向表中插入新的字段
向person表中插入home字段。
修改表的某一个字段(强烈不建议)
修改name字段,数据类型为 char(20)。
修改name字段名称为user字段。强烈不建议修改字段名称,因为会对应用层代码造成不必要的影响。烈不建议 ,强烈不建议 ,强烈不建议 重要的事情说三遍!!!
需要注意的是,修改之后的新的user字段必须是完整定义的,也就是必须定义类型字段。
修改表名(强烈不建议)
修改person表的名称为people。
更改数据库表的名称时,rename to 中的to是可以省略的。同样的,修改表的名称可能会对应用层程序造成不必要的风险,所以强烈不建议,强烈不建议,强烈不建议!!!
删除表的某一字段
删除people表中的home字段。
删除字段时也要小心,因为删除字段会删除所有记录的该字段。
删除表
删除study数据库中的student表。
以上便是数据库以及MySQL数据库的基本概念。
本期内容到此结束^_^