MySQL数据库从这里开始
关注【郑大钱呀
】【公】【众】【号】,我们一起交流,一起学习。
文章目录
1.1 为什么需要数据库?
在学习数据库之前,在脑海中不禁会产生几个问题:
- 什么是数据库?
- 到底是什么样的场景下才导致它的出现,它的出现是为了解决什么问题。
- 在没有数据库之前,那么数据又是如何存储的。
我拿起我的小键盘,在互联网的时间一顿搜索,嗷吼~,没找到,但是在知乎上有一个关于为什么需要数据库?
的问答,在里面答主举了不少例子,比如:假设现在要求你做一个简单的电影信息检索的网站,以供查询演员信息和电影信息,这些数据都存在普通文件中等待检索请求,如果你把所有的数据都存放在一个文件中,比如Excel或者csv文件中,在数据量少的时候,程序还能正常运行,当数据量变大的时候,比如文件大小达到几十个G或者上百个G的时候,程序读取、写入、修改文件的响应时间会变得异常缓慢,甚至会导致程序假死乃至崩溃,这种情况是任何应用都不能接受的
。
除以上问题外,如果那么当多个用户检索
、修改同一文件里的数据时怎么处理?多个线程并发写一个文件、甚至写同一条记录时如何处理?在并发写的情况下,如果像文件系统一样,没有任何保证机制,难以想象数据会被写成什么样子;当程序正在更新某条记录时,系统突然崩溃了,这条数据会怎么处理?
等等,数据存储面临的问题实在太多了,如果这些都要应用开发者去亲自处理,那工程就会显得复杂且巨大,这个时候,数据库的重要性就不言而喻了。
1.2 什么是数据库?
数据库,我们从字面上去理解,就是一个存放数据的库
,比如钱,在人们的生活,代表着财富,物品的交换媒介,但是对于银行的系统来说,它只是一个存放在数据库中的数据,一个数值
。在数据库的家族里,一般主要分为两大类:关系型数据库
和非关系型数据库
。
1.2.1 关系型数据库
关系数据库是由多个表组成的
。我们都用过Excel,就会知道Excel是一张一张的二维表。每个表都是由行和列组成的。同样的,关系数据库里存放的也是一张一张的表,只不过各个表之间可能是有联系的
。
所以,简单来说:关系数据库=多张表+各表之间的关系
,在数据库中存在这一张或多张表,每张表包含带有列名的列,和记录数据的行,有时表与表之间存在着相互的联系
。
比如有两张表,一张是学生表,记录着学生的信息,一张是成绩表记录着每个学生各科的成绩和信息,这两张表都有一个学号的字段,如果我们只知道一个学生的名字,但是我们想查询这个学生的成绩,此时我们就需要通过两张表查询,我们先通过学生名字在学生信息表中查询到对应学生的学号,然后再通过学号,在成绩表中查询出成绩。通过这个例子你应该对表之间的关系有了大概的了解。关系就是数据能够对应的匹配
,在关系数据库中正式名称叫联结
,对应的英文名称叫做join,联结是关系型数据库中的核心概念
。常用的关系型数据库有:MySQL、Oracle、SQL Server、sqlite等等。
1.2.1 非关系型数据库
非关系型的数据库,即NoSQL
,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSql数据库在特定的场景下可以发挥出难以想象的高效率和高性能
,它是作为对传统关系型数据库的一个有效的补充。
NoSQL(Not Only SQL ),意即不仅仅是SQL
,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入.非关系型数据库,主要有如下分类:
-
键值存储数据库(key-value):键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据库,因为
使用key主键访问,所以会获得很高的性能及扩展性
。键值数据库主要使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发
。此类数据库,典型的有:Memcached、Redis
、MemcacheDB -
列存储(Column-oriented)数据库:
列存储数据库将数据存储在列族中,一个列族存储经常被一起查询的相关数据
,比如人类,我们经常会查询某个人的姓名和年龄,而不是薪资。这种情况下姓名和年龄会被放到一个列族中,薪资会被放到另一个列族中。这种数据库通常用来应对分布式存储海量数据。此类数据库,典型的有:Cassandra、HBase。 -
面向文档(Document-Oriented)数据库:文档型数据库的灵感是来自于Lotus Notes办公软件,而且它同第一种键值数据库类似。
该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON
。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值
。而且文档型数据库比键值数据库的查询效率更高
。面向文档数据库会将数据以文档形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名词与对应值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储。
此类数据库,典型的有:MongoDB、CouchDB。 -
图形数据库:图形数据库允许
我们将数据以图的方式存储
。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个"Founded by"的边将Apple和Next连接到Steve Jobs。此类数据库,典型的有:Neo4J等
1.3 数据库的三个范式
什么是范式,按照定义来说,范式是符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度
。实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别
。就像家里装修买建材,建材有不同的标准,好一点是E0级,其次是E1级,还有E2级等等。
数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式
,例如符合2NF的关系模式,必定符合1NF。
1.3.1 第一范式(1NF)
第一范式(1NF)指在关系模型中,数据库表中的每一列都是不可再分的原子数据项
,不能是集合、数组等非原子数据项。例如字段:地址
,那么填写的时候,可能会填:中国上海浦东新区,这个是不符合第一范式的,应该要改成多个字段,比如:国家、城市、县、镇等。实际上,1NF是所有关系型数据库的最基本要求
。
比如有一张如下的表:
编号 | 品名 | 进货情况(数量、价格) | 销售情况(数量、价格) | 备注 |
---|---|---|---|---|
100001 | 铅笔 | 100*5.5 | 20*7.5 |
其中的"进货情况"和"销售情况",不是最小的原子数据项,不满足第一范式,此时我们需要对其进行拆分,使其满足第一范式,如下:
编号 | 品名 | 进货数量 | 进货价格 | 销售数量 | 销售价格 | 备注 |
---|---|---|---|---|---|---|
100001 | 铅笔 | 100 | 5.5 | 80 | 7.5 | |
100001 | 铅笔 | 120 | 4.5 | 100 | 7.5 | |
100002 | 圆规 | 20 | 7.5 | 100 | 15 | |
100002 | 圆规 | 20 | 5.5 | 100 | 15 | |
100003 | 尺子 | 200 | 2 | 100 | 3 | |
100003 | 尺子 | 200 | 2.5 | 120 | 3 |
1.3.2 第二范式(2NF)
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式
。第二范式要求数据库表中的每个实例或行必须可以被唯一的区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码
。
第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键
。
1.3.3 第三范式(3NF)
满足第三范式必须先满足第二范式。简而言之,第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性
。
1.4 数据库的连接
数据库的安装,网上参考的教程很多,不是本文的主要内容,就略过了,我们数据库安装完成后,打开终端,输入如下指令mysql -u用户名 -p密码
,连接上数据库:
[email protected] ~ % mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.25 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
上面的连接方式是数据库安装在本地,如果我们想连接到别人的数据库,我们可以使用--host
参数指定数据库服务器地址,如:mysql --host=192.169.20.11 --user=root --password=123456
。
连接上数据库后,我们就可以进行一些操作,比如使用show databases;
查询有哪些库,结果如下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| finance |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
连接数mysql后,如果我们想退出,可以输入quit
指令。我们在命令行的模式下操作数据库,并不是那么的方便,我们可以使用体验更好的,带有界面的数据库管理工具,比如Navicat、sqlyog、DataGrip,DBeaver(免费)等等。
1.5 SQL语句
所谓是SQL语句,就是操作数据库的语言,标准的定义为:用于访问和处理数据库的标准的计算机语言
,比如我们想要查询数据库里的数据,我们就需要使用SELECT
语句,想要删除数据就需要使用DELETE
,SQL是关系型数据库都要遵循的语言
,从某种意义上说,你学会了SQL语言,不管是MySQL、SQLServer还是Oracle,只要是关系型数据库,除了每个数据库特有的语法外,大部分的SQL语法都是通用的
。
1.6 SQL语言的分类
SQL语言我们主要分为四类:
-
数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象,数据库,表,列等,如:
create
,alter
,drop语句等
。 -
数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新,如:
insert
,delete
update语句等
。 -
数据控制语言:简称DCL(Data Control Language),用来定义
数据库的访问权限
和安全级别,及创建用户
等。 -
数据查询语言:简称(Data Query Language),用来查询数据库中表的记录,如:
select
、from
、where语句等
。
1.7 SQL注释和书写规范
SQL语句可以单行或多行书写,在书写的时候,我们也可以使用Tab
或者空格进行缩进以增强可读性,SQL写完之后需要用;
结束,示例代码如下:
select *
from person
where name='linlang';
在SQL的语法中,是不区分大小写的
,也就是说SELECT
和select
效果是一样的,从语法规范上来说,建议SQL语法中的关键字使用大写
,其他内容比如表名、列名使用小写
。我们写过代码都知道注释,在SQL语法中,也有注释的语法,主要有两种,单行注释和多行注释
,示例代码如下:
# 单行注释,方式一
-- 单行注释,方式二
/*
多行注释
*/
1.8 MySQL数据库数据类型
分类 | 数据类型 | 描述 |
---|---|---|
整数类型 | TINYINT | 值范围:-128 - 127 |
SAMLLINT | 值范围:-32768 - 32767 | |
MEDIUMINT | 值范围:-8388608 - 8388607 | |
INT | 值范围:-2147483648 -2147483647 | |
BIGINT | 值范围:-9223372036854775808 - 9223372036854775807 | |
小数类型 | FLOAT | 单精度浮点型 |
DOUBLE | 双精度浮点型 | |
DECIMAL(m,d) | 浮点型在数据库中存放的是近似值,m为有效位,d为小数位 | |
日期类型 | DATE | 日期,年月日 |
TIME | 时间,时分秒 | |
DATETIME | 日期+时间,年月日时分秒 | |
TIMESTAMP | 时间戳,自动存储记录修改时间 | |
字符串类型 | CHAR(n) | 固定长度,最多255个字符 |
VARCHAR(n) | 固定长度,最多65535个字符 | |
TINYTEXT | 可变长度,最多255个字符 | |
MEDIUMTEXT | 可变长度,最多2的24次方-1个字符 | |
LONGTEXT | 可变长度,最多2的32次方-1个字符 | |
二进制类型 | BLOB | Blob是以二进制方式存储 |
1.9结尾
本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注
、转发、收藏,谢谢。
2. 参考文档
- 知乎:https://www.zhihu.com/question/24088008/answer/1062822881
- 知乎:https://zhuanlan.zhihu.com/p/46334459
- 知乎:https://www.zhihu.com/question/24696366/answer/29189700
- 知乎:https://zhuanlan.zhihu.com/p/54165946
- CSDN:https://blog.csdn.net/qq_27565769/article/details/80731213
- XZC.Log:http://www.blogjava.net/xzclog/archive/2009/01/04/249711.html