MySQL数据库

数据库简介

数据库(DataBase)存储数据的仓库,是按照数据结构来组织、存储和管理数据的仓库。实际上就是一堆文件。这些文件中存储了具有特定格式的数据。

数据库也是一个长久存储、有组织、可共享的大容量仓库

采用数据库存储的优点为

1. 冗余较少
2. 避免不一致
3. 效率
4. 数据完整性
5. 机密性

MySQL
%title插图%num

该资料来自百度百科

关系型数据库管理系统

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

运行平台

支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统

适应场景

个人使用者和中小型企业,与Linux作为操作系统,Apache 或Nginx作为 Web 服务器,三者可一起建立稳定、免费的网站系统。被业界称为“LAMP“或“LNMP”组合

Oracle
%title插图%num

该资料来自百度百科

关系型数据库管理系统

Oracle公司(甲骨文)是全球最大的信息管理软件及服务供应商,成立于1977年,总部位于美国加州Redwood shore,面向全球开放oracle认证。

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。

运行平台

AppleMac OS X Server:PowerPC、 HPHP-UX:PA-RISC,Itanium、HPTru64 UNIX:Alpha、HPOpenVMS: Alpha, Itanium、IBMAIX5L:IBM POWER、IBMz/OS:zSeries、Linux:x86,x86-64, PowerPC, zSeries, Itanium、MicrosoftWindows: x86, x86-64, Itanium、SunSolaris:SPARC, x86, x86-64

适应场景

适用于各类大、中、小微机环境

mongoDB
%title插图%num

该资料来自百度百科

分布式文件存储的数据库

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

运行平台

MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB

适应场景

网站数据、缓存、大尺寸低价值的数据、高伸缩性的场景、用于对象及JSON 数据的存储

MySQL 概念
术语及解释
名词 解释说明
数据库 数据库是一些关联表的集合
数据表 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据
一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据
冗余 存储两倍数据,冗余降低了性能,但提高了数据的安全性
主键 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据
外键 存外键用于关联两个表
复合键 复合键(组合键)将多个列作为一个索引键,一般用于复合索引
索引 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录
完整性 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性

数据库当中最基本的单元是表:table;数据库当中是以表格的形式表示数据的,任何一张表都有行和列

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的”关系型”可以理解为”表格”的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

%title插图%num
数据类型

存储在MySQL中的数据分为如下几大类

类型类型举例
整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT
浮点类型FLOAT、DOUBLE(存在精度损失)
定点数类型DECIMAL(推荐)
位类型BIT
日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP
文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型ENUM
集合类型SET
二进制字符串类型BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
JSON类型JSON对象、JSON数组
空间数据类型单值类型:GEOMETRY、POINT、LINESTRING、POLYGON;
集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION

整数类型

整数类型一共有5种,包括TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT。它们的区别如下表所示:

整数类型字节有符号数取值范围无符号数取值范围
TINYINT1-128~1270~255
SMALLINT2-32768~327670~65535
MEDIUMINT3-8388608~83886070~16777215
INT、INTEGER4-2147483648~21474836470~4294967295
BIGINT8-9223372036854775808
~9223372036854775807
0~18446744073709551615

浮点类型

浮点数和定点数类型的特点是可以 处理小数 ,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOATDOUBLEREAL

FLOAT 表示单精度浮点数;
DOUBLE 表示双精度浮点数;

对于浮点类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节,MySQL用4个字节存储FLOAT类型数据,用8个字节来存储DOUBLE类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如9.625,用二进制来表达,就是1001.101,或者表达成1.001101×2^3。如果尾数不是0或5(比如9.624),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入

 定点数类型

数据类型字节数含义
DECIMAL(M,D),DEC,NUMERICM+2字节有效范围由M和D决定

定点数在MySQL内部是以字符串的形式进行存储,这就决定了它一定是精准的。
当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。

定点数与浮点数各自的使用场景和优势
浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)
定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景(比如涉及金额计算的场景)

位类型

BIT类型中存储的是二进制值,类似010110

二进制字符串类型长度长度范围占用空间
BIT(M)M1<=M<=64约为(M+7)/8个字节

BIT类型,如果没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值,这里(M)是表示二进制的位数,位数最小值为1,最大值为 64

日期类型

一般日常使用中,用得最多的日期时间类型,就是DATETIME

数据类型说明字节长度值类型最小值最大值
year1YYYY或YY19012155
YEAR1YYYY或YY19012155
TIME时间3HH:MM:SS-838:59:59838:59:59
DATE日期3YYYY-MM-DD 1000-01-01 9999-12-03
DATETIME日期 时间8YYYY-MM-DD
HH:MM:SS
1000-01-01
00:00:00
9999-12-31
23:59:59
TIMESTAMP日期 时间4YYYY-MM-DD
HH:MM:SS
1970-01-01
00:00:00 UTC
2038-01-19
03:14:07UTC

YEAR 类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小,只需要1个字节的存储空间

DATE 类型表示日期,没有时间部分,格式为YYYY-MM-DD,其中,YYYY表示年份,MM表示月份,DD表示日期。需要3个字节的存储空间。在向DATE类型的字段插入数据时,同样需要满足一定的格式条件

TIME 类型用来表示时间,不包含日期部分。在MySQL中,需要3个字节的存储空间来存储TIME类型的数据,可以使用“HH:MM:SS”格式来表示TIME类型,其中,HH表示小时,MM表示分钟,SS表示秒

DATETIME 类型在所有的日期时间类型中占用的存储空间最大,总共需要8个字节的存储空间。在格式上为DATE类型和TIME类型的组合,可以表示为YYYY-MM-DDHH:MM:SS,其中YYYY表示年份,MM表示月份,DD表示日期,HH表示小时,MM表示分钟,SS表示秒

TIMESTAMP 类型也可以表示日期时间,其显示格式与DATETIME类型相同,都是YYYY-MM-DDHH:MM:SS,需要4个字节的存储空间。但是TIMESTAMP存储的时间范围比DATETIME要小很多,只能存储“1970-01-0100:00:01UTC”到“2038-01-1903:14:07UTC”之间的时间。其中,UTC表示世界统一时间,也叫作世界标准时间

文本字符串类型

CHAR和VARCHAR类型都可以存储比较短的字符串

字符串(文本)类型特点长度长度范围(字节)占用的存储空间
CHAR(M) 固定长度 M 0 <= M <= 255M个字节
VARCHAR(M) 可变长度 M0 <= M <= 65535(实际长度 + 1) 个字节

CHAR(M)类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符,如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格

VARCHAR(M)定义时,必须指定长度M,否则报错,检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节

哪些情况使用 CHAR 或 VARCHAR 更好

类型特点空间上时间上适用场景
CHAR(M)固定长度浪费存储空间效率高存储不大,速度要求高
VARCHAR(M)可变长度节省存储空间效率低非CHAR的情况

TEXT类型

在MySQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT类型。
在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
每种TEXT类型保存的数据长度和所占用的存储空间不同,如下

文本字符串类型特点长 度长度范围占用的存储空 间
TINYTEXT小文本、可变长度L0 <= L <= 255L + 2 个字节
TEXT文本、可变长度L0 <= L <= 65535L + 2 个字节
MEDIUMTEXT中等文本、可变长度L0 <= L <= 16777215L + 3 个字节
LONGTEXT大文本、可变长度L0 <= L<= 4294967295(相当于4GB)L + 4 个字节

枚举类型

ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值,其所需要的存储空间由定义ENUM类型时指定的成员个数决定

文本字符串类型长度长度范围占用的存储空间
ENUML1 <= L <= 655351或2个字节

集合类型

当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的,具体如下:

成员个数范围(L表示实际成员个数)占用的存储空间
1 <= L <= 81个字节
9 <= L <= 162个字节
17 <= L <= 243个字节
25 <= L <= 324个字节
33 <= L <= 648个字节
SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。

SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同

二进制字符串类型

MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。

MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOBLONGBLOB 类型

BINARYVARBINARY 类似于CHARVARCHAR,只是它们存储的是二进制字符串

二进制字符串类型特点值的长度占用空间
BINARY(M)固定长度M(0 <= M <= 255)
VARBINARY(M)可变长度M(0 <= M <= 65535)

BLOB 是一个二进制大对象,可以容纳可变数量的数据,MySQL中的BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如图片音频视频

二进制字符串类型值的长度长度范围占用空间
TINYBLOBL0 <= L <= 255L + 1 个字节
BLOBL0 <= L <= 65535(相当于64KB)L + 2 个字节
MEDIUMBLOBL0 <= L <= 16777215 (相当于16MB)L + 3 个字节
LONGBLOBL0 <= L <= 4294967295(相当于4GB)L + 4 个字节

需要注意的是,在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中

JSON类型

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

在MySQL5.7中,就已经支持JSON数据类型。在MySQL8。x版本中,JSON类型提供了可以进行自动验证的JSON文档和优化的存储结构,使得在MySQL中存储和读取JSON类型的数据更加方便和高效

空间类型

MySQL空间类型扩展支持地理特征的生成、存储和分析。这里的地理特征表示世界上具有位置的任何东西,可以是一个实体,例如一座山;可以是空间,例如一座办公楼;也可以是一个可定义的位置,例如一个十字路口等等。MySQL中使用Geometry(几何)来表示所有地理特征。Geometry指一个点或点的集合,代表世界上任何具有位置的事物

MySQL的空间数据类型(SpatialDataType)对应于OpenGIS类,包括单值类型:GEOMETRY、POINT、LINESTRING、POLYGON以及集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION

Geometry是所有空间集合类型的基类,其他类型如POINT、LINESTRING、POLYGON都是Geometry的子类。Point,顾名思义就是点,有一个坐标值。例如POINT(121。21334231。234532),POINT(3010),坐标值支持DECIMAL类型,经度(longitude)在前,维度(latitude)在后,用空格分隔

LineString,线,由一系列点连接而成。如果线从头至尾没有交叉,那就是简单的(simple);如果起点和终点重叠,那就是封闭的(closed)。例如LINESTRING(3010,1030,4040),点与点之间用逗号分隔,一个点中的经纬度用空格分隔,与POINT格式一致

几种常见的几何图形元素

%title插图%num

多个同类或异类几何图形元素的组合

%title插图%num
WorkBench 操作
字段的特殊标识

新建MySQL WorkBench 中的数据表的时候,对于部分名称的解释

%title插图%num

上图中 DataType 数据类型 INT 为整数型,作为唯一标识id。varchar(45) 表示值为最大长度45的字符串,tinyint(1) 为布尔值,表头中的 status 作为用户状态,默认应该是可用状态,因此填入默认值 0

在使用MySQL的workbench建table时,有PK、NN、UQ、BIN、UN、ZF、AI、G,他们分别表示如下含义:

PK:Primary Key, 主键
NN:Not Null, 非空
UQ:Unique, 唯一索引,具有unique属性的列确保所有的记录的值都不同。
BIN:Binary
UN:无符号整数(unsigned) 只允许非负数和需要一个更大数字上限范围的字段
ZF:Zero Fil,用0填充所有剩余空间,例如,int(4),而值为1时,则内容显示为0001
AI:Auto Increment,自动增长
G:Generated Column,基于其它列的公式生成值的列
Default:默认值

可视化建立数据表

1. 创建数据表

%title插图%num

2. 设置->提交数据表头

%title插图%num

3. 检阅确认操作 创建/修改 完成

%title插图%num
可视化写入数据

1. 数据表右键选择 Select Rows – Limit 1000

// Select Rows – Limit 1000 翻译为 选择行 – 限制1000

%title插图%num

2. 手动填入数据行的数据

* 其中,原存入数据时,已将 id 标识为 (AI)自增、(PK)主键、(NN)不为空、(UQ)值唯一,并已将 status 默认值设置为 0 (不填默认为0) *

%title插图%num

3. 检阅确认操作 添加/修改 完成

%title插图%num
SQL 操作
简介
%title插图%num

SQL ( Structured Query Language ) 是结构化查询语言,专门用来访问和处理数据库的编程语言,能够让我们以编程的形式,操作数据库里面的数据

三个关键点
1. SQL 是一门数据库编程语言
2. 使用 SQL语言 编写出来的代码,叫做 SQL语句
3. SQL语言 只能再关系型数据库中使用 (例如 MySQL、Oracle、SQL Server)。非关系型数据库 (例如 Mongodb) 不支持 SQL语言

SQL 用途
1. 从数据库中查询数据
2. 向数据库中插入新的数据
3. 更新数据库中的数据
4. 从数据库中删除数据
5. 可以创建新数据库
6. 可在数据库中创建新表
7. 可在数据库中创建存储过程、视图
8.etc…

SQL 语法不区分大小写,它重点有 查询 select 、 插入 insert into 、 更新 update 、 删除 delete
其次还有 条件 where andor 运算符 、 order by 排序 、 count(*) 排序

select 查询

用来查询数据表中指定表头的值的内容
语法解析:SELECT {内容,…} FROM {数据表}

%title插图%num

— 选择指定 my_db_01.users 表
SELECT * FROM my_db_01.users;
— 通过 * 把 users 表中所有的数据查询出来
SELECT * FROM users
— 也可在指定表中查询多个表头的所有值内容,用英文逗号隔开
SELECT username, password FROM users

insert into 插入

用来向对应的数据表中插入一个新的数据行
语法解析:INSERT INTO {数据表} (表头1,…) VALUES (‘内容1’,…);

%title插图%num

— 向 users 表中,插入新数据 username 的值与 password 内容为 fm 和 1234444
INSERT INTO users (username,password) VALUES (‘fm’,’123444′);
— 效果同上,另一种插入对应数据的SQL写法
INSERT INTO user SET username=’fm’,password=’123444′;

update 更新

用来修改对应数据表中where指定内容下的指定表头值的操作
语法解析:UPDATE {数据表} SET {表头=值} WHERE {指定表头值}

— 将 id 为 1 的用户修改多个列的值
UPDATE users SET password=’123123′,status=1 WHERE id=1

delete 删除

用来删除对应数据表中where指定内容下指定表头值的操作
语法解析:DELETE FROM {数据表} WHERE {指定表头值}

— 删除users 表中,id为 3 的用户
DELETE FROM users WHERE id=3

where 子句

用于限定选择的标准,在SELECT、UPDATE、DELETE语句中,皆可使用 WHERE 子句来限定选择的标准
语法解析:SELECT * FROM {数据表名} WHERE {列} {运算符} {值}

对于SQL运算符,下面的运算符可在 WHERE 子句中使用,用来限定选择的标准

操作符 描述
= 等于
>< 不等于
< 大于
< 小于
<= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种方式

— 修改 user 数据表中 id 为 1005 的 status 表头中的值为 1
update users set status=1 where id=1005;

关于运算符中 BETWEEN操作方式
BETWEEN 作⽤是选取介于两个值之间的数据范围(包括两个值) 具体使用方法为
… where {目标表头} between {值} and {值}

关于运算符中 BETWEEN操作方式
LIKE (针对字符型字段) 它的作⽤是在⼀个字符型字段列中检索包含对应⼦串的。语法类似正则表

1. 查询name字段中包含有“明”字的
select * from table1 where name like ‘%明%’
2. 查询name字段中含有数字的
select * from table1 where name like ‘%[0-9]%’
3. 查询name字段中含有⼩写字母的
select * from table1 where name like ‘%[a-z]%’
4. 查询name字段中不含有数字的
select * from table1 where name like ‘%[!0-9]%’

— 查找指定范围 BEETWEEN 用法 [id的值在1004-1006之间的所有数据行]
SELECT * FROM my_db_01.users where id between 1004 and 1006;
— 查找表值中包含的指定内容的值 Like [包含23的所有密码]
elect * from users where password like ‘%23%’;

AND 与 OR 运算符

AND 和 OR 可在 where 子语句中把两个或者多个条件结合起来。(用途类似 && 与 ||)

— 显示所有 status 为 0,并且 id 小于 3 的用户
SELECT * FROM users WHERE status=0 AND id > 3
— 显示所有 status 为 1,或者username 为 zs 的用户
SELECT * FROM users WHERE status=1 OR id=’zs’

ORDER BY 排序

ORDER BY 语句用于根据指定的列对结果集进行排序,默认为升序 ASC 进行排序
如若希望按照降序对记录进行排序,可以使用 DESC 关键词

— 对结果进行降序排序
select * from users order by id desc

%title插图%num

ORDER BY 支持多重排序
对于需要将结果进行多次排序得到理想的顺序的排序操作,可以 {表头}{操作} 用逗号隔开
语法解析: … ORDER BY {表头} ASC,{表头} DESC

— ORDER BY 先把结果对应的bookid值进行升序排序 再username值的拼写升序排序
select * from booksreads order by bookid asc,userId desc

%title插图%num
COUNT(*) 函数

使用 COUNT(*) 作为指向的查询内容,得到查询到的结果的数据行条数

— count(*) 统计 users数据表 录入的所有数据的条数
select count(*) from users;

%title插图%num
AS 设置别名

如果希望给查询出来的列名称设置别名,可以用 AS 关键字

%title插图%num

在表头后面添加 AS 语句,设置查询结果中对应表头的别名
语法解析:{表头} AS {别名}

— 查询 users 数据表中所有数据行的 username 和 password
— 并使用 AS 赋予对应的别名为 名字 和 密码

select username as ‘名字’,password as ‘密码’ from users;

%title插图%num