数据库(DataBase)存储数据的仓库,是按照数据结构来组织、存储和管理数据的仓库。实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库也是一个长久存储、有组织、可共享的大容量仓库
采用数据库存储的优点为:
1. 冗余较少
2. 避免不一致
3. 效率
4. 数据完整性
5. 机密性
该资料来自百度百科
关系型数据库管理系统
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公司(甲骨文)是全球最大的信息管理软件及服务供应商,成立于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是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
运行平台
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB
适应场景
网站数据、缓存、大尺寸低价值的数据、高伸缩性的场景、用于对象及JSON 数据的存储
名词 | 解释说明 |
---|---|
数据库 | 数据库是一些关联表的集合 |
数据表 | 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格 |
列 | 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据 |
行 | 一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据 |
冗余 | 存储两倍数据,冗余降低了性能,但提高了数据的安全性 |
主键 | 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据 |
外键 | 存外键用于关联两个表 |
复合键 | 复合键(组合键)将多个列作为一个索引键,一般用于复合索引 |
索引 | 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录 |
完整性 | 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性 |
数据库当中最基本的单元是表:table;数据库当中是以表格的形式表示数据的,任何一张表都有行和列
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的”关系型”可以理解为”表格”的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
存储在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。它们的区别如下表所示:
整数类型 | 字节 | 有符号数取值范围 | 无符号数取值范围 |
---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 |
SMALLINT | 2 | -32768~32767 | 0~65535 |
MEDIUMINT | 3 | -8388608~8388607 | 0~16777215 |
INT、INTEGER | 4 | -2147483648~2147483647 | 0~4294967295 |
BIGINT | 8 | -9223372036854775808 ~9223372036854775807 | 0~18446744073709551615 |
浮点类型
浮点数和定点数类型的特点是可以 处理小数 ,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT
、DOUBLE
、REAL
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,NUMERIC | M+2字节 | 有效范围由M和D决定 |
定点数在MySQL内部是以字符串的形式进行存储,这就决定了它一定是精准的。
当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0)。当数据的精度超出了定点数类型的精度范围时,则MySQL同样会进行四舍五入处理。
定点数与浮点数各自的使用场景和优势:
浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)
定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景(比如涉及金额计算的场景)
位类型
BIT类型中存储的是二进制值,类似010110
二进制字符串类型 | 长度 | 长度范围 | 占用空间 |
---|---|---|---|
BIT(M) | M | 1<=M<=64 | 约为(M+7)/8个字节 |
BIT类型,如果没有指定(M),默认是1位。这个1位,表示只能存1位的二进制值,这里(M)是表示二进制的位数,位数最小值为1,最大值为 64
日期类型
一般日常使用中,用得最多的日期时间类型,就是DATETIME
数据类型 | 说明 | 字节长度 | 值类型 | 最小值 | 最大值 |
---|---|---|---|---|---|
year | 年 | 1 | YYYY或YY | 1901 | 2155 |
YEAR | 年 | 1 | YYYY或YY | 1901 | 2155 |
TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
DATE | 日期 | 3 | YYYY-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 | 日期 时间 | 4 | YYYY-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 <= 255 | M个字节 |
VARCHAR(M) | 可变长度 | M | 0 <= 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 | 小文本、可变长度 | L | 0 <= L <= 255 | L + 2 个字节 |
TEXT | 文本、可变长度 | L | 0 <= L <= 65535 | L + 2 个字节 |
MEDIUMTEXT | 中等文本、可变长度 | L | 0 <= L <= 16777215 | L + 3 个字节 |
LONGTEXT | 大文本、可变长度 | L | 0 <= L<= 4294967295(相当于4GB) | L + 4 个字节 |
枚举类型
ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值,其所需要的存储空间由定义ENUM类型时指定的成员个数决定
文本字符串类型 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|
ENUM | L | 1 <= L <= 65535 | 1或2个字节 |
集合类型
当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的,具体如下:
成员个数范围(L表示实际成员个数) | 占用的存储空间 |
---|---|
1 <= L <= 8 | 1个字节 |
9 <= L <= 16 | 2个字节 |
17 <= L <= 24 | 3个字节 |
25 <= L <= 32 | 4个字节 |
33 <= L <= 64 | 8个字节 |
SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。 |
SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同
二进制字符串类型
MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。
MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 类型
BINARY 和 VARBINARY 类似于CHAR
和VARCHAR
,只是它们存储的是二进制字符串
二进制字符串类型 | 特点 | 值的长度 | 占用空间 |
---|---|---|---|
BINARY(M) | 固定长度 | M | (0 <= M <= 255) |
VARBINARY(M) | 可变长度 | M | (0 <= M <= 65535) |
BLOB 是一个二进制大对象
,可以容纳可变数量的数据,MySQL中的BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如图片
、音频
和视频
等
二进制字符串类型 | 值的长度 | 长度范围 | 占用空间 |
---|---|---|---|
TINYBLOB | L | 0 <= L <= 255 | L + 1 个字节 |
BLOB | L | 0 <= L <= 65535(相当于64KB) | L + 2 个字节 |
MEDIUMBLOB | L | 0 <= L <= 16777215 (相当于16MB) | L + 3 个字节 |
LONGBLOB | L | 0 <= 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格式一致
几种常见的几何图形元素
多个同类或异类几何图形元素的组合
新建MySQL WorkBench 中的数据表的时候,对于部分名称的解释
上图中 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. 创建数据表
2. 设置->提交数据表头
3. 检阅确认操作 创建/修改 完成
1. 数据表右键选择 Select Rows – Limit 1000
// Select Rows – Limit 1000 翻译为 选择行 – 限制1000
2. 手动填入数据行的数据
* 其中,原存入数据时,已将 id 标识为 (AI)自增、(PK)主键、(NN)不为空、(UQ)值唯一,并已将 status 默认值设置为 0 (不填默认为0) *
3. 检阅确认操作 添加/修改 完成
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 、 and 和 or 运算符 、 order by 排序 、 count(*) 排序
用来查询数据表中指定表头的值的内容
语法解析:SELECT {内容,…} FROM {数据表}
— 选择指定 my_db_01.users 表
SELECT * FROM my_db_01.users;
— 通过 * 把 users 表中所有的数据查询出来
SELECT * FROM users
— 也可在指定表中查询多个表头的所有值内容,用英文逗号隔开
SELECT username, password FROM users
用来向对应的数据表中插入一个新的数据行
语法解析:INSERT INTO {数据表} (表头1,…) VALUES (‘内容1’,…);
— 向 users 表中,插入新数据 username 的值与 password 内容为 fm 和 1234444
INSERT INTO users (username,password) VALUES (‘fm’,’123444′);
— 效果同上,另一种插入对应数据的SQL写法
INSERT INTO user SET username=’fm’,password=’123444′;
用来修改对应数据表中where指定内容下的指定表头值的操作
语法解析:UPDATE {数据表} SET {表头=值} WHERE {指定表头值}
— 将 id 为 1 的用户修改多个列的值
UPDATE users SET password=’123123′,status=1 WHERE id=1
用来删除对应数据表中where指定内容下指定表头值的操作
语法解析:DELETE FROM {数据表} WHERE {指定表头值}
— 删除users 表中,id为 3 的用户
DELETE FROM users WHERE id=3
用于限定选择的标准,在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 可在 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 语句用于根据指定的列对结果集进行排序,默认为升序 ASC 进行排序
如若希望按照降序对记录进行排序,可以使用 DESC 关键词
— 对结果进行降序排序
select * from users order by id desc
ORDER BY 支持多重排序
对于需要将结果进行多次排序得到理想的顺序的排序操作,可以 {表头}{操作} 用逗号隔开
语法解析: … ORDER BY {表头} ASC,{表头} DESC
— ORDER BY 先把结果对应的bookid值进行升序排序 再username值的拼写升序排序
select * from booksreads order by bookid asc,userId desc
使用 COUNT(*) 作为指向的查询内容,得到查询到的结果的数据行条数
— count(*) 统计 users数据表 录入的所有数据的条数
select count(*) from users;
如果希望给查询出来的列名称设置别名,可以用 AS 关键字
在表头后面添加 AS 语句,设置查询结果中对应表头的别名
语法解析:{表头} AS {别名}
— 查询 users 数据表中所有数据行的 username 和 password
— 并使用 AS 赋予对应的别名为 名字 和 密码
select username as ‘名字’,password as ‘密码’ from users;