文章目录
- 初识数据库
- 数据库相关基本概念
- 数据库的分类
- MySQL数据库
- 数据模型
- 基本操作
- 库操作
- 查看数据库
- 创建数据库
- 删除数据库
- 选中数据库
- 数据类型
- 数值类型
- 字符串类型
- 日期类型
- 表操作
- 查看所有表
- 查看表结构
- 创建表
- 删除表
- 其他操作
- 查看警告信息
- 查看编码集
这是我们 MySQL 学习的第一程,话不多说,直接开始吧!
初识数据库
数据库相关基本概念
【数据库(DataBase)】
数据库(DB)是一个按照数据结构来组织、存储和管理数据的仓库,通俗点,就是存储数据的仓库。
数据库与数据结构的关系:
数据库是一个用于存储、管理和操作大量数据的系统,而数据结构则提供了数据的组织和存储方式,使数据库能够高效地管理和操作这些数据。通俗的讲,数据库底层使用了合适的数据结构来组织存储数据。
为什么要使用数据库?
最简单的一点就是,为了保证数据的持久性。
我们在例如IDEA上编程并运行时,数据会存在内存中,这些数据会存在安全问题,断电或其他系统故障可能导致内存中的数据未能及时保存到磁盘而丢失,所以引出了数据库。
当然,我们要使用数据库还有其他的原因,例如:数据共享与协同合作、支持复杂数据分析。
为什么不使用文件呢?
因为文件系统通常面向某一特定应用程序,数据共享性差,冗余度大,并且数据独立性较差,同时不利于数据查询和管理,不利于存储海量数据。
综上所述,我们要学习使用数据库。
【数据库管理系统(DataBase Management System)】
数据库管理系统(DBMS)是建立、操作和管理数据库的大型软件,通俗地讲,就是操作数据库的工具
【数据库服务】
数据库服务是指提供数据库访问和管理功能的系统或软件。它通常包括数据库服务器、网络连接、存储设备等组件,用于存储、检索和管理数据。数据库服务可以由多个客户端应用程序共享,并提供数据的一致性、安全性和可靠性。常见的数据库服务包括MySQL、Oracle、Microsoft SQL Server等。
数据库服务与数据库管理系统的区别:
数据库服务是一个更广泛的概念,涵盖了数据库管理系统以及相关的硬件和软件组件;而数据库管理系统则是具体的软件产品,专注于管理和操作数据库的功能。
【SQL】
SQL(Structured Query Language)是一种特定于数据库的编程语言,用于管理、查询和操作关系型数据库。
SQL分类:
- 数据查询语言(DQL)
- DQL是SQL中最重要的部分,用于从数据库中检索数据。
- 主要命令是
SELECT
,用于选择表中的特定列和行。
- 数据定义语言(DDL)
- DDL用于定义和管理数据库的结构,包括创建、修改和删除表和其他数据库对象。
- 主要命令包括
CREATE
(创建数据库对象)、ALTER
(修改数据库对象)、DROP
(删除数据库对象)和TRUNCATE
(清空数据库对象)
- 数据操纵语言(DML)
- DML用于添加、修改和删除数据库中的数据。
- 主要命令包括
INSERT
(插入数据)、UPDATE
(更新数据)和DELETE
(删除数据)
- 数据控制语言(DCL)
- DCL用于控制对数据库的访问权限,确保数据的安全和完整。
- 主要命令包括
GRANT
(授予权限)和REVOKE
(撤销权限)
- 事务控制语言(TCL)
- TCL用于管理数据库中的事务,确保数据的一致性和完整性。
- 主要命令包括
COMMIT
(提交事务)和ROLLBACK
(回滚事务)
- 游标控制语言(CCL)
- CCL用于管理和操作数据库中的游标,游标是一个存储在DBMS服务器上的数据库查询。
- 主要命令包括
DECLARE
(声明游标)和FETCH
(获取游标中的数据)
所以,我们使用 SQL 操作 数据库管理系统(DBMS),再通过 数据库管理系统 操作 数据库以及数据库中的数据。
数据库的分类
数据库大体可分为关系型数据库 和 非关系型数据库
-
关系型数据库(Relational Database)
指采用了关系模型来组织数据的数据库。
使用表格来组织数据,每个表由行和列组成,具有固定的模式(schema),对数据的结构和关系进行严格定义。关系模型可以简单理解为二维表格模型,一个关系型数据库就是由这些二维表及其之间的关系组成的数据组织。
例如:Oracle、MySQL、SQL Server
-
非关系型数据库(NoSQL DataBase)
不使用传统关系模型的数据库系统,并且不基于SQL
它们通常以不同的方式存储和处理数据,旨在解决关系型数据库在某些应用场景下的局限性,如大规模数据、高并发访问和高可扩展性需求等。
例如:redis、mongodb、hbase
区别:
关系型数据库 | 非关系型数据库 | |
---|---|---|
使用SQL | 是 | 不强制要求,一般不基于SQL实现 |
事务支持 | 支持 | 不支持 |
复杂操作 | 支持 | 不支持 |
海量读写操作 | 效率低 | 效率高 |
基本结构 | 基于表和列,结构固定 | 灵活性比较高,例如键值对、文档 |
使用场景 | 业务方面的联机事务处理(OLTP)系统 | 用于数据的缓存、或基于统计分析的联机分析处理(OLAP)系统 |
主流数据库一览(2019年的,了解为主):
MySQL数据库
MySQL是一种流行的开源关系型数据库管理系统,用于有效地存储、管理和处理数据。它由瑞典MySQL AB公司开发,并现属于Oracle公司。作为一个关系型数据库,MySQL使用表格来存储数据,支持标准的SQL语言,并能够运行在多种系统和多语言环境下。
MySQL因其开源、高效和灵活的特点,成为广泛应用的数据库管理系统。无论是小型网站还是大型企业应用,MySQL都能提供强大的数据管理和处理能力。
数据模型
MySQL的数据模型指的是数据库中数据的组织结构和操作方式。数据模型是数据库系统的核心,它定义了如何存储、访问和管理数据。
MySQL的数据模型的类型有很多,最常用的就是关系模型,除关系模型外,还有网状模型和层次模型等,但关系模型因其简单性和强大的数学理论基础被广泛使用,我们后续讨论的就是关系模型。
我们的MySQL关系型数据库建立在关系模型的基础上,由多张相互连接的二维表及其关系组成。
我们只需要记住:一个MySQL数据库服务下,可以有多个数据库,而一个数据库中可以有多张表,一张表中可以有很多的数据行(或记录),每条记录由很多的属性(字段、列)构成。
二维表,可称为数据表,由行和列组成,一行代表一条记录,一列代表一个属性或字段
如下图就是两个二维表及其关系:
- 如员工表中
1 金庸 总裁 2
这一行就是一条记录(数据行) id、name、job、dept_id
分别是员工表这张二维表的四个属性- 一个关系型数据库就是由这些二维表及其之间的关系组成的数据组织
基本操作
了解了MySQL数据库是由一张张二维表组成等基本结构的知识后,我们学习一些最基本SQL语句来操作数据库,主要包括基本库操作,基本表操作,另外还有数据类型。其他的知识后序会不断发文介绍的,这只是我们的第一步!
库操作
查看数据库、创建数据库、删除数据库、选中数据库
查看数据库
语法:
SHOW DATABASES;
-
分号问题: MySQL分号是可选的,并且可以省略。每条语句默认以换行符作为结束标志。这意味着你可以在一行中编写多个SQL语句,而不需要使用分号分隔它们。
但为了确保你的SQL语句在不同的数据库系统中都能正确执行,建议在每个SQL语句的末尾添加分号。 这样可以提高代码的可移植性,并避免潜在的语法错误。
-
SHOW
是一个关键字,作用是显示某些信息 -
注意
DATABASES
是复数。 -
作用就是:查看当前服务器的所有数据库
例如:
创建数据库
语法:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name[create_option] ...create_option: [DEFAULT] {CHARACTER SET [=] charset_name| COLLATE [=] collation_name| ENCRYPTION [=] {'Y' | 'N'}
}
|
:表示"或"的意思,用于分隔不同的选项。例如,在CREATE
语句中,可以选择CREATE DATABASE
或者CREATE SCHEMA
来创建一个数据库(最常用的是DATABASE
)。[]
:表示可选的部分。例如,在CREATE DATABASE
语句中,IF NOT EXISTS
和create_option
都是可选的,不选也可以达到效果,不过会有差别,这要视情况而定。{}
:表示一组选项中的一个必须被选择。例如,用户选择创建数据库必须选择DATABASE | SCHEMA
=
:表示赋值操作符,用于给变量或参数赋值。例如,在CHARACTER SET [=] charset_name
中,等号左边的CHARACTER SET
是一个变量名,右边的charset_name
是要赋给它的值。- 大写显示的都是关键字,
db_name
是我们要创建的数据库的名称
【最简单的建库语法】
CREATE DATABASE db_name;
用对关键字并自定义一个数据库名,就可以创建成功;不过,以这种方式创建数据库,如果数据库已经存在(重名),就会报错,而一旦报错整个SQL就会终止
【加上IF NOT EXISTS
】
CREATE DATABASE IF NOT EXISTS db_name;
IF NOT EXISTS
翻译过来就是如果不存在,意味着只有db_name
这个数据库不存在时才会创建,相当于多了一层校验,如果数据库存在,最多只会警告(终端),有的甚至没有显式地展示警告(如 Navicat Premium Lite 17),这样的话,就不会出现一条语句的错误影响整个执行的情况了。
【加上可选选项】
可选项有三个,可多选,用于指定数据库的特性:
create_option: [DEFAULT] {CHARACTER SET [=] charset_name| COLLATE [=] collation_name| ENCRYPTION [=] {'Y' | 'N'}
}
CHARACTER SET
:指定数据库使用的字符编码方式,通常采用utf8mb4
COLLATE
:指定数据库中的字符排序规则,常用utf8mb4_0900_ai_ci
utf8mb4
是一种字符集,支持最多4个字节的UTF-8编码。与传统的utf8(实际上是utf8mb3,即最多3个字节)不同,utf8mb4能够存储更多的Unicode字符,包括所有的emoji表情符号和一些特殊字符。0900
表示使用Unicode的排序规则(collation),其中"0900"是该排序规则的编号。ai
代表“accent insensitive”(不区分重音符号),意味着在排序和比较时,带有重音符号的字符(如“á”和“a”)会被视为相等。ci
代表“case insensitive”(不区分大小写),意味着在排序和比较时,大写和小写字符(如“A”和“a”)会被视为相等,所以,当设定成功后,我们编写的所有SQL语句就不区分大小写了,将关键字大写只是方便区分而已。
ENCRTPTION
:用于指定数据库是否加密
例如:
CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
【以关键字为库名】
直接将关键字作为库名是不可以的,需要用``(反引号)`引起来:
CREATE DATABASE IF NOT EXISTS `create`;
- 以后若想将关键字作为名字,就得使用反引号引起来。
删除数据库
语法
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
- 不加
IF EXISTS
校验,如果删除不存在的库,就会报错,终止;如果需要删除建议加上校验 - 删库操作谨慎使用,误删后果十分严重
选中数据库
语法:
USE db_name;
-
选择了数据库才可以在选中数据库中执行建表等操作,如果想换数据库,那就再用
USE db_name
切换即可。 -
可以通过数据库的一个内置函数观察当前连接(选择)的数据库,语法如下:
SELECT DATABASE();
- 如果没有选择任何数据库,得到的结果就是
NULL
:
- 如果没有选择任何数据库,得到的结果就是
- 如果选择了某个数据库,就会显示该数据库的名字:
NULL
并不是空指针或空引用,SQL中的NULL
表示缺失值或未知值,具有很多特性,后序将在合适的位置介绍
数据类型
数值类型
类型 | 大小 | 作用 |
---|---|---|
TINYINT | 1 Bytes | TINYINT(1)用作BOOL类型,常用作表示性别 |
SMALLINT | 2 Bytes | 大整数值 |
MEDIUMINT | 3 Bytes | 大整数值 |
INT | 4 Bytes | 大整数值 |
BIGINT | 8 Bytes | 极大整数值,一般编号为此类型 |
FLOAT | 4 Bytes | 单精度浮点数值,存在精度损失(可以像DECIMAL一样使用M和D) |
DOUBLE | 8 Bytes | 双精度浮点数值,存在精度损失,但比FLOAT精度高(可以像DECIMAL一样使用M和D) |
DECIMAL(M, D) | 如果M>D,为M+2,否则D+2 | M表示位数(包括小数位),D指定小数位数,精度极高,一般用于表示金额 |
NUMERIC(M, D) | 如果M>D,为M+2,否则D+2 | 等同于DECIMAL |
-
数值类型默认为有符号类型,如果需要可以指定为无符号,做法如:
INT UNSIGNED、BIGINT UNSIGNED
,尽量不使用无符号,容量不足时,建议更换更大的类型(如int转为bigint),而不是有符号转无符号 -
对于整型类型范围(不必特意记忆):
-
有符号范围:-2^(类型字节数 * 8-1)到2^(类型字节数 * 8-1)-1,如int是4字节,就 是-231到231-1
-
无符号范围:0到2^(类型字节数 * 8)-1,如int就是2^32-1
-
字符串类型
类型 | 大小 | 作用 |
---|---|---|
CHAR(SIZE) | 0-255 bytes | 定长字符串,SIZE指定字符数,固定占用指定空间 |
VARCHAR(SIZE) | 0-65 535 bytes | 变长字符串,SIZE指定字符数,最多占用指定空间,根据实际存储字符串的长度来占用存储空间 |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
CHAR
类型占用固定长度的空间,当存储较短的字符串时会浪费存储空间,但这样的好处是提高了检索效率。定长字段的存取效率通常高于变长字段。适用于存储长度相近或固定长度的数据,如身份证号码、电话号码等。VARCHAR(SIZE)
是使用最多的字符串类型,按实际存储内容占用空间,适合存储长度变化较大的字符串,从而可以节省存储空间。但是在检索效率上通常低于CHAR
类型。适合用于存储长度不定的文本数据,如评论、文章内容等。
日期类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
YEAR | 1 bytes | 1901/2155 | YYYY | 年份值 |
DATE | 3 bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 bytes | ‘-838:59:59’ / ‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
DATETIME | 8 bytes | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 bytes | 从1970到2038年,自动检索当前时 区并进行转换。 | YYYYMMDDHHMMSS | 时间戳 |
- 最常用的就是
DATE
和DATETIME
,DATE
用于表示如生日,DATETIME
用于表示如创建xx的时间等
表操作
查看某个数据库的表,查看表结构,创建表,删除表
查看所有表
语法:
SHOW TABLES;
- 一定要选中数据库才可以查看该数据库的所有表
查看表结构
语法:
DESC tbl_name;
解释:(后四条有关约束,后面发文介绍)
- Field:属性(字段)名
- Type:属性(字段)类型
- NULL:是否允许为空
- Key:索引类型(键值的类型)
- Default:默认值
- Extra:拓展功能
查看的是结构,并不是数据。
创建表
语法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (field1 datatype [COMMENT 'string'],field2 datatype [COMMENT 'string'],field3 datatype [COMMENT 'string']
);
-
field1、field2… 均为自定义的字段名;datatype为该字段的数据类型;注意最后个字段后没有逗号
-
可以使用
COMMENT
关键字增加字段说明(注意 注释说明必须被单引号引起来,不论中文还是英文):
-
加上
TEMPORARY
意味着创建的是一个临时表(否则就是永久表),临时表通常以特定的命名约定(例如,以#
开头)来标识,是在数据库会话期间创建的,它们通常用于存储中间结果或临时数据。这些表只在当前会话中可见,并且在会话结束时会自动删除。-
临时表和真实的表(永久表)的区别:
- 生命周期:临时表只在当前会话期间存在,当会话结束时,临时表会自动删除。而真实的表是持久化的,它们存储在数据库中,并且可以在多个会话之间共享和使用。
- 可见性:临时表仅对创建它们的会话可见,其他会话无法访问或修改这些表。而真实的表可以被所有连接到数据库的用户访问和操作。
- 数据持久性:临时表的数据不是永久存储的,它们只存在于内存中,并且在会话结束后会被自动清除。真实的表则将数据存储在磁盘上,即使会话结束,数据仍然存在。
- 用途:临时表通常用于存储中间结果、临时计算或处理大量数据时使用。它们提供了一种快速且临时的方式来存储和操作数据,而不会对真实表造成影响。真实的表通常用于长期存储和管理数据,如用户信息、订单记录等。
- 性能:由于临时表存储在内存中,访问速度通常比真实表快,因为它们不需要从磁盘读取数据。然而,如果内存不足,临时表可能会被交换到磁盘上,导致性能下降。
-
SHOW TABLES;
不会显示临时表 -
DESC tmp_tbl_name;
可以查看临时表的结构
-
【拓展】
快速创建结构相等的表
上面例子我们已经创建好了一张表table1
,我们快速创建一个结构相等的表,语法如下:
CREATE TABLE [IF NOT EXISTS] tbl_name LIKE copyed_tbl_name;
- 只复制表的结构,不会复制表的数据!
删除表
语法:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...;
- 一条语句可以删除多个表,多个表的表名用
,(逗号)
连接,但注意一条语句只能删除一条数据库 TEMPORARY
用于显式地说明删除的是临时表,即使不加TEMPORARY
也可以删除临时表,因为临时表和永久表不能重名- 删除操作谨慎执行,不论是删表还是删库
其他操作
查看警告信息
语法:
SHOW WARNINGS;
- 目前我前已知的警告信息只有
IF NOT EXISTS
发现存在、IF EXISTS
发现不存在抛出的。
查看编码集
语句:
SHOW VARIABLES LIKE '%character%';
- 该语句用于显示MySQL数据库中所有与字符相关的系统变量。这些变量包括字符集、排序规则等设置。
完