数据库教程之基础知识
¶一、什么是数据库
¶1、数据库(database)
保存有组织的数据的容器(通常是一个文件或一组文件)。
¶2、数据库与数据库软件
- 数据库(database):数据库可以是保存在硬设备上的文件,但也可以不是。
- 数据库软件(DBMS数据库管理系统):数据库是通过DBMS创建和操纵的容器,使用DBMS来替你访问数据库。
¶3、表
在你将资料放入自己的文件柜时,并不是随便将它们扔进某个抽屉就完事了,而是在文件柜中创建文件,然后将相关的资料放入特定的文件中。
在数据库领域中,这种文件称为表。表是一种结构化的文件,可用来存储某种特定类型的数据。表可以保存顾客清单、产品目录,或者其他信息清单。
表(table): 某种特定类型数据的结构化清单。
¶表名
数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的,这表示数据库中没有其他表具有相同的名字。
表名的唯一性取决于多个因素,如数据库名和表名等的结合。这表示,虽然在相同数据库中不能两次使用相同的表名,但在不同的数据库中却可以使用相同的表名。
¶模式
表具有一些特性,这些特性定义了数据在表中如何存储,如可以存储什么样的数据,数据如何分解,各部分信息如何命名等等。描述表的这组信息就是所谓的模式,模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)。
模式(schema):关于数据库和表的布局及特性的信息。
¶4、列
表由列组成。列中存储着表中某部分的信息。
列(字段)定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为
NULL
。注意NULL
表示字段数据不存在。一个整型字段如果为NULL
不表示它的值为0
,同样的,一个字符串型字段为NULL
也不表示它的值为空串''
。通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
列(column) :表中的一个字段。所有表都是由一个或多个列组成的。
¶5、数据类型
数据类型(datatype): 所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
¶6、行
是记录还是行? 你可能听到用户在提到行(row)时称其为数据库记录(record)。在很大程度上,这两个术语是可以互相替代的,但从技术上说,行才是正确的术语。
行(row): 表中的一个记录。
¶7、主键
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很难,因为没有安全的方法保证只涉及相关的行。
关键点:对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
主键(primary key):一列(或一组列),其值能够唯一区分表中每个行。
¶7.1 可作为主键的条件:
- 任意两行都不具有相同的主键值;
- 每个行都必须具有一个主键值(主键列不允许NULL值)。
注意:主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
¶7.2 使用主键的好习惯
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值。
- 不使用任何业务相关的字段作为主键。(身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。会发生变更!)
¶7.3 主键id
作为主键最好是完全业务无关的字段,我们一般把这个字段命名为
id
。对于大部分应用来说,通常自增类型的主键就能满足需求。
如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。
可作为id字段的类型有:
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
- 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似
8f55d96b-8acc-4636-8cb8-76bf8abc2f57
。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
¶7.4 联合主键
关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。
没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。
¶8、外键
外键(FOREIGN KEY):外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
如下面的表格,
class_id
就将student表与class表之间形成了关联!我们就可以根据
class_id
这个列直接定位出一个students
表的记录应该对应到classes
的哪条记录。
id | class_id | name | other columns… |
---|---|---|---|
1 | 1 | 小明 | … |
2 | 1 | 小红 | … |
5 | 2 | 小白 | … |
¶外键的实现
外键并不是通过列名实现的,而是通过定义外键约束实现的:
外键约束的名称
fk_class_id
可以任意,FOREIGN KEY (class_id)
指定了class_id
作为外键,REFERENCES classes (id)
指定了这个外键将关联到classes
表的id
列(即classes
表的主键)。通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果
classes
表不存在id=99
的记录,students
表就无法插入class_id=99
的记录。由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,
class_id
仅仅是一个普通的列,只是它起到了外键的作用而已。
1 |
|
要删除一个外键约束,也是通过ALTER TABLE
实现的:
注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...
实现的。
1 |
|
¶两种关系
- 多对多
多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系!
三个表:teachers表、classes表、teacher_class表(存放teacher ID 与 class ID对应信息)
- 一对一
一对一关系是指,一个表的记录对应到另一个表的唯一一个记录。
有两个表:students表、contact表(存手机号)
实际上,一对一关系准确地说,是
contacts
表一对一对应students
表。因为有的学生没有手机号,如果都写道一个students表,会有空出现,写到另一个contact表则不会出现空。
还有一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能。例如,把一个大的用户表分拆为用户基本信息表
user_info
和用户详细信息表user_profiles
,大部分时候,只需要查询user_info
表,并不需要查询user_profiles
表,这样就提高了查询速度。
¶9、索引
在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如
gender
列,大约一半的记录值是M
,另一半是F
,因此,对该列创建索引就没有意义。可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
- 使用
ADD INDEX idx_score (score)
就创建了一个名称为idx_score
,使用列score
的索引。索引有多列直接括号里继续写。
1 |
|
¶唯一索引
在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。
但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。
- 例如name不能重复(通过
UNIQUE
关键字我们就添加了一个唯一索引。)
1 |
|
- 只对某一列添加一个唯一约束而不创建唯一索引。(
name
列没有索引,但仍然具有唯一性保证。)
1 |
|
总结:无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。
¶二、什么是SQL
¶1、什么是SQL
什么是SQL?(Structured Query Language),SQL是结构化查询语言的缩写,用来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,这样,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。
虽然SQL已经被ANSI组织定义为标准,不幸地是,各个不同的数据库对标准的SQL支持不太一致。并且,大部分数据库都在标准的SQL上做了扩展。也就是说,如果只使用标准SQL,理论上所有数据库都可以支持,但如果使用某个特定数据库的扩展SQL,换一个数据库就不能执行了。例如,Oracle把自己扩展的SQL称为
PL/SQL
,Microsoft把自己扩展的SQL称为T-SQL
。现实情况是,如果我们只使用标准SQL的核心功能,那么所有数据库通常都可以执行。不常用的SQL功能,不同的数据库支持的程度都不一样。而各个数据库支持的各自扩展的功能,通常我们把它们称之为“方言”。
¶2、SQL的优点
- SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库打交道。
- SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。
- SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
¶3、SQL语言的能力
- **DDL:Data Definition Language **:DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。
- **DML:Data Manipulation Language **:DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。
- **DQL:Data Query Language **:DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。
¶4、SQL语法特点
SQL语言关键字不区分大小写!!!但是,针对不同的数据库,对于表名和列名,有的数据库区分大小写,有的数据库不区分大小写。同一个数据库,有的在Linux上区分大小写,有的在Windows上不区分大小写。
所以,本教程约定:SQL关键字总是大写,以示突出,表名和列名均使用小写。
¶5、数据模型
数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:
随着时间的推移和市场竞争,最终,基于关系模型的
关系数据库
获得了绝对市场份额。
- 层次模型:层次模型就是以“上下级”的层次关系来组织数据的一种方式,层次模型的数据结构看起来就像一颗树
- 网状模型:网状模型把每个数据节点和其他很多节点都连接起来,它的数据结构看起来就像很多城市之间的路网
- 关系模型:关系模型把数据看作是一个二维表格,任何数据都可以通过行号+列号来唯一确定,它的数据模型看起来就是一个Excel表
¶6、数据类型
上面的表中列举了最常用的数据类型。很多数据类型还有别名,例如,
REAL
又可以写成FLOAT(24)
。还有一些不常用的数据类型,例如,TINYINT
(范围在0~255)。各数据库厂商还会支持特定的数据类型,例如JSON
。选择数据类型的时候,要根据业务规则选择合适的类型。通常来说,
BIGINT
能满足整数存储的需求,VARCHAR(N)
能满足字符串存储的需求,这两种类型是使用最广泛的。
名称 | 类型 | 说明 |
---|---|---|
INT | 整型 | 4字节整数类型,范围约+/-21亿 |
BIGINT | 长整型 | 8字节整数类型,范围约+/-922亿亿 |
REAL | 浮点型 | 4字节浮点数,范围约+/-1038 |
DOUBLE | 浮点型 | 8字节浮点数,范围约+/-10308 |
DECIMAL(M,N) | 高精度小数 | 由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算 |
CHAR(N) | 定长字符串 | 存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串 |
VARCHAR(N) | 变长字符串 | 存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串 |
BOOLEAN | 布尔类型 | 存储True或者False |
DATE | 日期类型 | 存储日期,例如,2020-06-22 |
TIME | 时间类型 | 存储时间,例如,12:20:59 |
DATETIME | 日期和时间类型 | 存储日期+时间,例如,2020-06-22 12:20:59 |
¶7、主流关系数据库
- 商用数据库,例如:Oracle,SQL Server,DB2等;
- 开源数据库,例如:MySQL,PostgreSQL等;
- 桌面数据库,以微软Access为代表,适合桌面应用程序使用;
- 嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。
¶三、什么是MySQL
¶1、MySQL那些事
MySQL是目前应用最广泛的开源关系数据库。MySQL最早是由瑞典的MySQL AB公司开发,该公司在2008年被SUN公司收购,紧接着,SUN公司在2009年被Oracle公司收购,所以MySQL最终就变成了Oracle旗下的产品。
MySQL是一种DBMS,即它是一种数据库软件。
¶2、MySQL的优点
- 成本——MySQL是开放源代码的,一般可以免费使用(甚至可以免费修改)。
- 性能——MySQL执行很快(非常快)。
- 可信赖——某些非常重要和声望很高的公司、站点使用MySQL,这些公司和站点都用MySQL来处理自己的重要数据。
- 简单——MySQL很容易安装和使用。
¶3、MySQL数据引擎
和其他关系数据库有所不同的是,MySQL本身实际上只是一个SQL接口,它的内部还包含了多种数据引擎!
MySQL接口和数据库引擎的关系就好比某某浏览器和浏览器引擎(IE引擎或Webkit引擎)的关系。对用户而言,切换浏览器引擎不影响浏览器界面,切换MySQL引擎不影响自己写的应用程序使用MySQL的接口。
使用MySQL时,不同的表还可以使用不同的数据库引擎。如果你不知道应该采用哪种引擎,记住总是选择
InnoDB
就好了。
- InnoDB:由Innobase Oy公司开发的一款支持事务的数据库引擎,2006年被Oracle收购;
- MyISAM:MySQL早期集成的默认数据库引擎,不支持事务。
¶4、MySQL衍生版本
因为MySQL一开始就是开源的,所以基于MySQL的开源版本,又衍生出了各种版本:
¶MariaDB
由MySQL
的创始人创建的一个开源分支版本,使用XtraDB
引擎。
¶Aurora
由Amazon
改进的一个MySQL版本,专门提供给在AWS托管MySQL用户,号称5倍的性能提升。
¶PolarDB
由Alibaba
改进的一个MySQL版本,专门提供给在阿里云托管的MySQL用户,号称6倍的性能提升。
¶MySQL官方版本
以下版本的功能依次递增,价格也依次递增。不过,功能增加的主要是监控、集群等管理功能,对于基本的SQL功能是完全一样的。
- Community Edition:社区开源版本,免费;
- Standard Edition:标准版;
- Enterprise Edition:企业版;
- Cluster Carrier Grade Edition:集群版。
¶5、MySQL版本
- 4——InnoDB引擎,增加事务处理、并、改进全文本搜索等的支持。
- 4.1——对函数库、子查询、集成帮助等的重要增加。
- 5——存储过程、触发器、游标、视图等。
¶6、安装MySQL
安装完MySQL后,除了MySQL Server,即真正的MySQL服务器外,还附赠一个MySQL Client程序。MySQL Client是一个命令行客户端,可以通过MySQL Client登录MySQL,然后,输入SQL语句并执行。
嗯。。网上找一篇教程安装即可!有时间我再写一下安装教程!
¶MySQL Client 与 MySQL Server:
MySQL Client的可执行程序是
mysql
,MySQL Server的可执行程序是mysqld
。在MySQL Client中输入的SQL语句通过TCP连接发送到MySQL Server。默认端口号是3306,即如果发送到本机MySQL Server,地址就是
127.0.0.1:3306
。
1 |
|
¶7、运行MySQL
- 管理员身份启动MySQL服务
- 使用命令登录MySQL
1 |
|
如下图:
-u
:指定用户名-p
:输入密码-h
:主机名 ,本地默认为localhost
,远程服务器为公网ip地址-P
:端口号
¶8、注意点
- 命令用
;
或\g
结束,Enter
键不执行操作。 - 输入
help
或\h
获得帮助,也可以输入help select
获取关于SELECT
语句的帮助 - 输入
quit
或exit
退出命令行程序(并没有关闭mysql服务)
¶9、管理MySQL
¶数据库相关命令:
¶9.1 列出数据库
1 |
|
其中,
information_schema
、mysql
、performance_schema
和sys
是系统库,不要去改动它们。其他的是用户创建的数据库。
¶9.2 创建数据库
1 |
|
¶9.3 删除数据库
1 |
|
¶9.4 使用数据库
对一个数据库进行操作时,要首先将其切换为当前数据库:
1 |
|
¶表相关命令:
¶9.5 列出表
列出当前数据库的所有表:
1 |
|
¶9.6 创建表
1 |
|
¶9.7 查看创建表的语句
1 |
|
¶9.7 查看表的结构
1 |
|
¶9.8 删除表
1 |
|
¶9.9 修改表
较为复杂,后续讲解!
¶退出MySQL
两种,大小写都可!
1 |
|
¶10、SHOW语句
¶10.1 SHOW TABLES;
1 |
|
¶10.2 SHOW COLUMNS FROM <表名>;
它对每个字段返回一行,行中包含字段名、数据类型、是否允许 NULL 、键信息、默认值以及其他信息。
DESCRIBE<表名>
语句SHOW COLUMNS FROM <表名>;
的快捷方式!简写:
DESC <表名>
1 |
|
¶10.3 SHOW STATUS;
SHOW STATUS ,用于显示广泛的服务器状态信息。
1 |
|
¶10.4 SHOW CREATE DATABASE <数据库名>;
显示创建数据库的语句:
1 |
|
¶10.5 SHOW CREATE TABLE <表名>;
显示创建表的语句:
1 |
|
¶10.6 SHOW GRANTS;
用来显示授予用户(所有用户或特定用户)的安全权限;
1 |
|
¶10.7 SHOW ERRORS ;
显示服务器错误信息:
1 |
|
¶SHOW WARNINGS;
显示服务器警告信息:
1 |
|
¶10.8 HELP SHOW;
用来显示允许SHOW语句的信息:
1 |
|