SQL 学习笔记

概述

数据库是一种专门管理数据的软件。

数据模型

相比层次模型和网状模型,关系模型理解和使用起来最简单,最终,基于关系模型的关系数据库获得了绝对市场份额。

数据类型

关系型数据库支持的标准数据类型包括:

名称 类型 说明
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 日期类型 存储日期,例如,2018-06-22
TIME 时间类型 存储时间,例如,12:20:59
DATETIME 日期和时间类型 存储日期+时间,例如,2018-06-22 12:20:59

主流关系数据库

  1. 商用数据库,例如:OracleSQL ServerDB2等;
  2. 开源数据库,例如:MySQLPostgreSQL等;
  3. 桌面数据库,以微软Access为代表,适合桌面应用程序使用;
  4. 嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。

SQL

SQL 是结构化查询语言的缩写,用来访问和操作数据库。不同的数据库,都支持 SQL ,通过学习 SQL 这一种语言,就可以操作各种不同的数据库。

虽然 SQL 已经被 ANSI 组织定义为标准,但不同数据库对标准的 SQL 支持不太一致。并且,大部分数据库都在标准的 SQL 上做了扩展。如果只使用标准 SQL 的核心功能,那么所有数据库通常都可以执行。

SQL 语言定义了这些操作数据库的能力:

DDL:Data Definition Language

DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。

DML:Data Manipulation Language

DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。

DQL:Data Query Language

DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。

语法特点

SQL 语言关键字不区分大小写,但对不同的数据库,对于表名和列名,又多数据库区分大小写,有的数据库不区分大小写。同一个数据库,有的在Linux上区分大小写,有的在Windows上不区分大小写。

安装 MySQL

MySQL:MySQL AB —> SUN —> Oracle

MySQL 本身只是一个 SQL 数据接口,其内部包含多种数据引擎,常用包括:InnoDB 和 MyISAM。

基于 MySQL 的开源版本,衍生出了各种版本:

MariaDB

由MySQL的创始人创建的一个开源分支版本,使用XtraDB引擎。

Aurora

由Amazon改进的一个MySQL版本,专门提供给在AWS托管MySQL用户,号称5倍的性能提升。

PolarDB

由Alibaba改进的一个MySQL版本,专门提供给在阿里云托管的MySQL用户,号称6倍的性能提升。

而MySQL官方版本又分了好几个版本:

https://dev.mysql.com/downloads/mysql/

关系模型

关系型数据库是简历在关系模型上的,而关系模型的本质就是若干个存储数据的二维表。

表的每一行称为记录(Record),记录是一个逻辑意义上的数据。

表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。

在关系数据库中,关系是通过主键外键来维护的。

主键

在关系数据库中,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。每一条记录都包含若干定义好的字段。同一个表的所有记录都有相同的字段定义。

对于关系表,有一个很重要的约束:任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是能够通过某个字段唯一区分出不同的记录,这个字段被称为主键

一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一些了影响。选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

作为主键最好是完全业务无关字段,我们一般把这个字段命名为id,常见的可以作为id的字段类型有:

  1. 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数。
  2. 全局唯一 GUID 类型:使用一种全局唯一的字符串作为主键。

如果使用 INT 自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。

联合主键

两个或更多的字段都设置为主键,这种主键被称之为联合主键。

对于联合主键,允许一列有重复,只要不是所有主键列都重复即可。

联合主键并不常用。

外键

关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

索引

使用索引可以在数据量大时,获得非常快的查找速度。

可以对一张表创建多个索引。索引提高了查询效率,但在插入、更新和删除记录时,需要同时修改索引,因此,缩影越多,插入、更新和删除记录的速度就越慢。

唯一索引

在设计关系数据库时,具有业务含义的列,不宜作为主键,但例如身份证号,邮箱地址这些列,但根据业务需求,这些列又具有唯一性约束。这个时候,就可以为这个列添加一个唯一索引。

是否创建索引,对于用户及应用程序来说,并没有区别。但在数据库中查询时,如果有相应的索引可用,数据库就会自动索引来提高查询效率。

数据查询

基本查询

SELECT * FROM <表名>

SELECT 是关键字,表示将要执行一个查询,*表示”所有列”,FORM表示将要从哪个表查询。

查询结果是一个二维表,它包含列名和每一行数据。

条件查询

SELECT * FROM <表名> WHERE <条件表达式>