目录
前言
我们都知道文件可以用来保存数据,那为什么还需要数据库呢?
首先文件保存数据有以下几个缺点:
- 文件安全性问题
- 文件不利于数据的查找和管理
- 文件在程序中控制不方便
于是专家们为了更有利于管理数据,设计出了数据库。下面重点介绍现在主流的数据库,MySQL。
一.数据库概念
1.1 什么是数据库
数据库是一个管理数据的软件。
数据库存储的介质有两种:磁盘和内存。
1.2 什么是MySQL
MySQL是数据库的一种。MySQL是一个网络服务,具有客户端和服务器端。底层用的TCP协议。应用层的协议是MySQL自己的协议。
我们安装了MySQL后,就连着服务器端和客户端一起安装了。如下:
而我们连接的MySQL就是客户端。
MySQL是一个网络服务,底层用的是TCP协议,默认端口号绑定的是3306。
由于是网络服务,说明我们在连接时,跨网络连接服务器端。
连接MySQL服务器端的指令:
mysql -h [IP地址] -P [端口号] -u root -p
如果不加-h个-P默认连接的本机的服务器
连接本机的MySQL服务器。
如果想跨网络连接MySQL,在连接时加上IP地址和端口号即可,如下:
mysql -h 150.158.195.106 -P 3306 -u root -p
MySQL管理数据的本质:
客户端数据MySQL语句,相当于MySQL请求,发送到网络中。服务器收到请求,解析请求,然后做出对应的操作(增,删,改)。
1.3 客户端,服务器,数据库和表的关系
-
安装一个数据库服务器,只是在机器上安装了一个数据管理系统的软件,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
-
为了保存引用中的实体数据,一般会在数据库中创建多个表,以保存程序中的实体数据。
MySQL保存数据:
将服务器端对应路径下建立文件夹(数据库),在文件夹下创建文件(表),数据保存在文件中。
数据库的优势在于更好的管理数据,并且安全性高。
1.4 MySQL架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
1.5.1SQL语句分类
- DDL(data definition language):数据定义语言,用来维护存储数据的结构。代表指令:create,drop,alter...
- DML(data manipulation language):数据操作语言,用来对数据进行操作。代表指令:insert,delete,update...
- DML中有单独分了一个DQL,数据查询语句。代表指令:select
- DCL(Data Control Language):数据控制语句,主要负责权限管理和事务。代表指令:grant,revoke,commit...
1.5.2 存储引擎
存储引擎:数据库管理系统如何存储数据,如何让为存储的数据建立索引和如何更新,查询数据等技术的实现方法。
MySQL的核心就是插件式的存储引擎,支持多种存储引擎。
查看存储引擎:
二.数据类型
2.1 数据类型分类
2.2 数值类型
2.2.1 tinyint类型
数值越界测试:
在编写C/C++程序时,一般出现越界的情况,是不会直接报错的,可能会因为截断导致结果不对,这是需要程序员来控制的。
但是在MySQL中,出现越界的情况为了保证数据的正确性,会直接报错,这是一种约束。约束使用者必须输入对的值。
说明:
- 在MySQL中,整形可以指定是有符号和无符号的,默认是有符号的。
- 可以通过unsigned来说明某个字段是无符号的。
案例:
但是在实际中,一般不使用unsigned,对于整形可能放不下的数据,无符号整形一般也放不下。
2.2.2 bit类型
bit(M):位段类型。M表示使用的位数,范围1~64。如果不填M,默认为1。
举例:
- 如果保存的数据只有两态,我梦可以定义成bit(1),节省空间。比如:男女。
越界:
2.2.3 float类型
语法:float [m,d] [unsigned]:表示小数类型,M表示显示长度,d表示小数点的位置,占用空间4字节
案例:
- float(4,2)表示的范围为-99.99~99.99,MySQL在保存值是会四舍五入。因为4位最大的数位9999,小数点在第二位。
float(4,2)无符号的范围在0~99.99。写法 float(4,2) unsigned,但是在实际编写是不常使用,因为有符号数也包括了无符号数的范围。
2.2.4 decimal类型
语法:decimal(m,d)[unsigned]:表示小数类型,m指定长度,d表示小数点位置。
使用和float相同。
decimal和float的区别在于:精度不一样。
- float表示精度大约7位。
- decimal整数最大位数m为65,支持小数点最大位数d是30。如果d被省略,默认为0。如果m被省略,默认为10。
建议小数字段,字段类型设置为decimal。
2.3 字符串类型
2.3.1 char类型
语法:char(L):固定长度字符串,L是可以存储的字符长度,单位为字符,最大长度值可以是255。
- 说明char长度是固定长度的。超过固定长度,会报错,小于固定长度,仍然会开辟L大小的空间。
案例:
字母在utf8下占1字节,中文字符在utf8下占3字节。
但是。har 长度是以字符为单位的,不论汉字还是字符'a'都被看作成了字符。所以下面长度的中文也可以存入。
char固定长度的最大值为255。
2.3.2 varchar类型
语法:varchar(L):可变长度字符串。L表示字符最大长度。最大长度65535字节。
- 说明:可变长度意思是,如果字符长度M小于L,只会申请M大小的空间。但是大于L会报错。
说明:
- varchar是可变长度的,那怎么知道超过了总长度呢?
- varchar的有效字节是65535,但是会有1~3字节用于记录实际数据的字符长度,所以有效字节是65532。
- 实际varchar的字符长度,需要需要看在这个编码下一个字符占多少字节,再用varchar有效字节数除以一字符占多少字节,就是最大字符长度。比如:utf8下,一字符占3字节,于是varchar的最大长度为65532/3=21844。
char和varchar对比:
- 在数据确定长度的情况下,使用定长
- 在数据长度不确定的情况下,是用变长
- 定长磁盘空间比较浪费,但是效率高
- 变长磁盘空间节省,效率低。
- 定长的意思是,直接开辟对应大小空间。
- 变长的意思是,在不超过最大长度的情况下,用多少,开辟多少空间。
2.4 日期和时间类型
常见的日期有如下三个:
- date:日期,格式'yyyy - mm - dd',占用3字节。
- datetime:时间日期格式:'yyyy- mm - dd HH : ii : ss',表示范围从1000到9999,占用8字节。
- timestamp:时间戳,从1970年1月1日开始计算,显示格式'yyyy- mm - dd HH : ii : ss',占用4字节。不需要用户输入。
创建一个带时间的表并插入时间
更新数据:
2.5 enum和set
- enum:枚举,单选类型。语法:enum('选项1','选项2','选项3'...)
改设定提供了若干个选项值,最终一个单元格中,实际值存储选项中的一个值;出于效率考虑,这些值实际存储的是"数字",因为这些选项值依次对应数字:1,2,3,4...最多65535个;当我们添加枚举值时,也可以添加数字编号。
- set:集合。多选类型。语法:set('选项1','选项2','选项3'...)
改设定中提供了多个选项值,最中单元格中,其中任意多个选项值,于效率考虑,这些值实际存储的是"数字",因为这些选项值依次对应数字:1,2,4,8,16...最多64个.
说明:不建议在添加枚举值和集合值时,采用数字方式,不利于阅读。
案例:
建立一个表,来调查人的喜好。
插入一些值:
使用数字插入:
查找喜欢登山的人:
由于用上面语句找是严格匹配,找到的是爱好仅仅是登山的人。
项要找出所有喜欢登山的人,利用集合查询函数find_in_set函数。
介绍find_in_set函数:
find_in_set(sub,str_list):如果sub在str_list中返回下标,如果不在返回0。
查询所有爱好登山的人:
三.MySQL的操作
MySQL语句没有进行大小写字母的严格区分。
/etc/my.cnf路径下的文件,为MySQL的配置文件:
3.1 库的操作
3.1.1 创建数据库
语法:create database [if not exists] 数据库名
"[]"里的为可选项,可加,可不加。加上的意思就是:如果不存在就创建库。
案例:
- 创建名字为db1的数据库
说明:当我们创建数据库时,没有加指定字符集和校验规则,默认字符集使用:utf8,校验规则是:utf8_general_ci。
- 创建数据库,自定义字符集
- 创建数据库,自定义字符集和校验规则
3.1.2 校验规则和字符集
查看默认字符集和校验规则:
查看数据库支持的字符集:
字符集:主要是控制用什么语言。比如utf8可以使用中文。
命令:show charset;
查看数据库支持的校验规则:
校验规则:两字符集之间的比较规则。
命令:show collation;
校验规则对数据规则:
- 不区分大小
创建一个库,检验方式不区分大小写:
进入改数据库,创建表,并插入数据
显示表单:
- 区分大小写
创建一个库,检验方式区分大小写。
创建一个表格,插入和上面一样的值。进行一样的操作。
- 进行查询
不区分大小写的查询结果:
区分大小写的查询结果:
不区分大小写结果排序:
区分大小写结果排序:
3.1.3 查看数据库
- 查看所有数据库
- 查看某个数据库
show create database 数据库名
说明:
- MySQL建议关键字用大写,区分字符,但是并不是必须的。
- 数据库名字的反引号'',是为了反之使用的数据库名刚好是关键字。
- /* ...... */ 这个并不是注释,而是为了兼容更多版本。
- 显示当前在哪个数据库中
- 显示数据库中的表单
3.1.4 修改数据库
主要是修改数据库的字符集和校验规则。
将test数据库的字符集改为gbk
3.1.5 删除数据库
语法:drop database [if exists] 数据库名;
作用:对应数据库的文件夹被删除,级联删除,里面的数据表全部删除。
删除test1数据库
3.2 表的操作
3.2.1 创建表
语法:
create table 表名 (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
- field 表示列名
- datatype 表示列的类型
- character set 字符集,如果没有指定字符集,则以所在数据库的默认字符集为准
- collate 校验规则,如果没有指定校验规则,则以所在数据库的默认校验规则为准
案例:
说明:
- 不同的存储引擎,创建表的文件不一样
进入/ect/mt.cnf文件中的datadir文件中,可以查看数据库,进入数据库可以查看文件(表):
- 不同存储引擎,创建表的文件不一样。
上面存储引擎为MyISAM。表的文件为:
- user.MYD:表数据
- user.MYI:表索引
- 还要有一个user.frm:表结构
存储引擎为innodb的创建的文件:
- person.ibd:保存数据和索引
- person.frm:表结构
查看表结构:
3.2.2 查看表中的数据
select * from 表名;
3.2.3 往表中插入数据
- 针对某字段插入
select into 表名 (针对的字段) values (对应字段插入的数据);
- 针对每一个字段插入
- select into 表名 (输入所有字段) values (对应字段插入的数据);
- select into 表名 values (所有字段插入的数据);
3.2.4 修改表
alter table 表名 add (增加的字段名字+其它约束条件):在表中增加字段
alter table 表名 modify (要修改表字段的约束条件):修改表中的字段
alter table 表名 drop (要删除的字段)
案例:
创建一个表:插入几个值:
- 在表中增加字段
- 修改字段约束条件
- 删除字段
- 修改字段名
alter table 表名 change 要修改的字段 新字段 + 约束条件;
注意:新字段需要完整定义
- 修改表的名字
alter table 要修改的表名 rename to(可省略) 新表名;
3.2.5 删除表
语法:drop table [if exists](可省略) 表名;