本文内容参考廖雪峰的官方网站SQL教程。
SQL:Structured Query Language. 结构化查询语言。
1. 安装MYSQL:
Debian和Ubuntu用户可以简单地通过命令apt-get install mysql-server
安装最新的MySQL版本。
2. 运行MySQL:
MySQL安装后会自动在后台运行。在命令提示符下输入mysql -u root -p
,然后输入口令,如果一切正确,就会连接到MySQL服务器,同时提示符变为mysql>
。输入exit
或\q
退出MySQL命令行。注意,MySQL服务器仍在后台运行。
2.1 数据类型
对于一个关系表,除了定义每一列的名称外,还需要定义每一列的数据类型。关系数据库支持的标准数据类型包括数值、字符串、时间等:
上面的表中列举了最常用的数据类型。很多数据类型还有别名,例如,REAL
又可以写成FLOAT(24)
。还有一些不常用的数据类型,例如,TINYINT
(范围在0~255)。各数据库厂商还会支持特定的数据类型,例如JSON
。
通常来说,BIGINT
能满足整数存储的需求,VARCHAR(N)
能满足字符串存储的需求,这两种类型是使用最广泛的。
3. 关系模型
关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。
- 表的每一行称为
记录
(Record),记录是一个逻辑意义上的数据。 - 表的每一列称为
字段
(Column),同一个表的每一行记录都拥有相同的若干字段。
字段
定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为NULL。注意NULL表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串’’。
- 关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。
- 一对多:一个表里的一行数据对应另一个表里的多行数据
- 一对一:一个表里的一行数据对应另一个表里的一行数据
- 在关系数据库中,关系是通过
主键
和外键
来维护的。
3.1 主键(primary key)
3.1.1 什么是主键:
对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段
唯一区分出不同的记录
,这个字段
被称为主键
。
3.1.2 如何选取主键:
作为主键
最好是完全业务无关的字段
,我们一般把这个字段命名为id
。常见的可作为id
字段的类型有:
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键。
- 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似
8f55d96b-8acc-4636-8cb8-76bf8abc2f57
。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
对于大部分应用来说,通常自增类型的主键就能满足需求。
如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。
3.1.3 联合主键
关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段
都设置为主键,这种主键被称为联合主键。
没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。
3.2 外键(foreign key)
关系数据库通过外键
可以实现一对多、多对多和一对一的关系。外键
既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
一张表的外键可以和另外一张标的主键进行关联(映射),当然不一定非得和另一张表的主键关联。当A表的外键和B表的主键关联时,可以唯一地确定一种连接映射关系。外键是人为指定的,不需要事先确定。
更多的外键内容,请参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1218728424164736
3.3 索引
3.3.1 什么是索引
索引
是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引
,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
3.3.2 索引的效率
索引
的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender
列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。
3.3.3 索引的好与坏
可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
3.3.4 索引与主键
对于主键
,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
更多内容参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1218728442198976
4. 查询数据
从本章开始,就要进入实战环节了。本章实战数据全部来源于廖雪峰github_learn-sql,你可以先fork到自己的仓库里,然后再git clone到本地。
然后在terminal中执行如下命令:
mysql -u root -p < init-test-data.sql
# 注意init-test-data.sql是文件名,就在clone到本地的learn-sql文件夹下
就可以自动创建test
数据库,并且在test
数据库下创建students
表和classes
表,以及必要的初始化数据。
其实对于初学者而言, init-test-data.sql 这个文件非常有必要品读。
在之后的使用过程中,打开terminal后,通常是利用如下方式进入test数据库的:
mysql -u root -p # 输入口令密码
use test
以上两条命令就可以进入到test
数据库。
本章的主题是查询数据,有两个关键词必须在开头提出:
SELECT
:后面跟随的是字段column
,可以跟任意多个字段,只要是合法字段即可。FROM
:FROM通常要配合SELECT才能使用,表明从当前数据库的哪张关系表中选取前面指定的那些字段。- 通常只有同类并列的内容之间才会加
逗号','
。例如,要查询几个指定字段的内容,这些字段之间就要加逗号','
来表示并列。 空格
是一条指令不同字符之间的间隔,空格
可以被替代为回车
,通过回车的方式输入一条指令,会使得该条指令的可读性提升。但是并列内容必须用逗号,
隔开,回车
不起作用。- 一条指令的结束,必须要以
;
作为标志。
举例:要通过INNER JOIN
进行连接查询
,主表students跟在FROM
后面;需要连接的表跟在INNER JOIN
后面;确定连接条件,使用ON <条件...>
,这里的条件是s.class_id = c.id
,表示students表的class_id
列与classes表的id
列相同的行需要连接。如图所示
具体的查询有很多用法:
- 基本查询;
- 条件查询;
- 投影查询;
- 排序;
- 分页查询;
- 聚合查询;
- 多表查询(笛卡尔查询);
- 连接查询。
以上查询用法细节,请参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1179610544539040
5. 修改数据
关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve、Update、Delete。其中,对于查询,上一章已经详细讲述了SELECT
语句的详细用法。
而对于增、删、改,对应的SQL语句分别是:
- INSERT:插入新记录;
- UPDATE:更新已有记录;
- DELETE:删除已有记录。
具体内容,请查看:https://www.liaoxuefeng.com/wiki/1177760294764384/1179610621264704
6. MySQL
- 管理MySQL
- 实用SQL语句
6. 事务
一套指令的组合执行,要成功则为全部执行,要失败则全部指令失效的特点称为事务。
具体内容请参考:https://www.liaoxuefeng.com/wiki/1177760294764384/1179611198786848