介绍
SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版本。
SQL 是 Structured Query Language 的缩写,中文译为“结构化查询语言”。SQL 是一种计算机语言,用来存储、检索和修改关系型数据库中存储的数据。
SQL 是关系型数据库的标准语言,所有的关系型数据库管理系统(RDBMS (opens new window)),比如 MySQL、Oracle、SQL Server、MS Access、Sybase、Informix、Postgres 等,都将 SQL 作为其标准处理语言。
此外,SQL 也有一些变种,就像中文有很多方言,比如:
- 微软的 SQL Server 使用 T-SQL;
- Oracle 使用 PL/SQL;
- 微软 Access 版本的 SQL 被称为 JET SQL(本地格式)。
# SQL 的用途
SQL 之所以广受欢迎,是因为它具有以下用途:
- 允许用户访问关系型数据库系统中的数据;
- 允许用户描述数据;
- 允许用户定义数据库中的数据,并处理该数据;
- 允许将 SQL 模块、库或者预处理器嵌入到其它编程语言中;
- 允许用户创建和删除数据库、表、数据项(记录);
- 允许用户在数据库中创建视图、存储过程、函数;
- 允许用户设置对表、存储过程和视图的权限。
# SQL 简史
1970 年,IBM 的 Edgar Frank "Ted" Codd(埃德加·弗兰克·科德)博士描述了关系型数据库的模型,他因此被称为“关系型数据库之父”。
1974 年,IBM 希望把 Codd 的想法变成现实,着手开发一款名为 System R 的数据库,并研发出一套结构化查询语句 SEQUEL,这就是 SQL 的雏形。System R 数据库于 1978 年第一次发布,用于科研和实验。
1979 年,Oracle 公司首先提供商用的 SQL,随后 IBM 公司也在 DB2 数据库中实现了 SQL。
1986 年 10 月,美国 ANSI 采用 SQL 作为关系型数据库管理系统的标准语言,紧接着国际标准组织(ISO)也将 SQL 采纳为国际标准。
1989 年,ANSI 发布了 SQL 标准的重大更新版本,以弥补旧版的不足,称为 ANSI SQL 89,该版本也被 ISO 采纳。
目前,市场上主要的关系型数据库都有自己的 SQL 变种, 但是它们都遵守 ANSI SQL 89 标准。
# SQL 执行过程
当你在任何一款 RDBMS 中执行 SQL 命令时,系统首先确定执行请求的最佳方式,然后 SQL 引擎将会翻译 SQL 语句,并处理请求任务。
整个执行过程包含了多种组件,比如:
- 查询调度程序;
- 优化引擎;
- 传统的查询引擎;
- SQL 查询引擎。
传统查询引擎能够处理所有的非 SQL 命令,但是 SQL 引擎并不能处理逻辑文件。
# SQL 命令
与关系型数据库有关的 SQL 命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE、DROP 等,根据其特性,可以将它们分为以下几个类别。
# DDL - Data Definition Language,数据定义语言
对数据的结构和形式进行定义,一般用于数据库和表的创建、删除、修改等。
命令 | 说明 |
---|---|
CREATE | 用于在数据库中创建一个新表、一个视图或者其它对象。 |
ALTER | 用于修改现有的数据库,比如表、记录。 |
DROP | 用于删除整个表、视图或者数据库中的其它对象 |
# DML - Data Manipulation Language,数据处理语言
对数据库中的数据进行处理,一般用于数据项(记录)的插入、删除、修改和查询。
命令 | 说明 |
---|---|
SELECT | 用于从一个或者多个表中检索某些记录。 |
INSERT | 插入一条记录。 |
UPDATE | 修改记录。 |
DELETE | 删除记录。 |
# DCL - Data Control Language,数据控制语言
控制数据的访问权限,只有被授权的用户才能进行操作。
命令 | 说明 |
---|---|
GRANT | 向用户分配权限。 |
REVOKE | 收回用户权限。 |
# RDBMS
RDBMS 是 Relational Database Management System 的缩写,中文译为“关系数据库管理系统”,它是 SQL 语言以及所有现代数据库系统(例如 SQL Server、DB2、Oracle、MySQL 和 Microsoft Access)的基础。
关系数据库管理系统(RDBMS)是一种基于 E. F. Codd 发明的关系模型的数据库管理系统(DBMS)。
# 什么是表(Table)?
在 RDBMS 中,数据被存储在一种称为表(Table)的数据库对象中,它和 Excel 表格类似,都由许多行(Row)和列(Column)构成。每一行都是一条数据,每一列都是数据的一个属性,整个表就是若干条相关数据的集合。
表是关系型数据库中最常见、最简单的数据存储形式。
下面是一个名为“website”的网站信息表的示例:
+----+----------------+----------------------------+-----+-------+---------+---------+
| id | name | url | age | alexa | uv | country |
+----+----------------+----------------------------+-----+-------+---------+---------+
| 1 | 百度 | https://www.baidu.com/ | 21 | 4 | 5010.5 | CN |
| 2 | 淘宝 | https://www.taobao.com/ | 17 | 8 | 3996.75 | CN |
| 3 | C语言中文网 | http://c.biancheng.net/ | 12 | 7923 | 11.62 | CN |
| 4 | Google | https://www.google.com/ | 23 | 1 | 36474 | US |
| 5 | GitHub | https://github.com/ | 13 | 95 | 216.3 | US |
| 6 | Stack Overflow | https://stackoverflow.com/ | 16 | 48 | 592.2 | US |
| 7 | Yandex | http://www.yandex.ru/ | 11 | 53 | 591.82 | RU |
| 8 | VK | https://vk.com/ | 23 | 23 | 1206 | RU |
+----+----------------+----------------------------+-----+-------+---------+---------+
2
3
4
5
6
7
8
9
10
11
12
# 什么是字段(Field)?
每个表都由若干列构成,每一列都称为一个字段(Field),上表 website 所包含的字段有 id、name、url、age、alexa、uv 和 country。
字段用来维护数据表中每一条数据(记录)的特定信息。
# 什么是列(Column)?
列(Column)是从垂直方向观察表中的数据,它包含了与某个字段相关联的所有信息。
例如,website 表中有一列为 url,它表示网站的地址,如下所示:
+----------------------------+
| url |
+----------------------------+
| https://www.baidu.com/ |
| https://www.taobao.com/ |
| http://c.biancheng.net/ |
| https://www.google.com/ |
| https://github.com/ |
| https://stackoverflow.com/ |
| http://www.yandex.ru/ |
| https://vk.com/ |
+----------------------------+
2
3
4
5
6
7
8
9
10
11
12
程序员往往不刻意区分字段(Field)和列(Column)的概念,而是将它们等同看待,因此您可以说“website 表的 age 字段”,也可以说“website 表的 age 列”,它们都是等价的。为了加深读者理解,本教程也不区分字段和列的概念,而是将它们混用。
# 什么是记录(Record)?
数据表中的每一行数据都称为一条记录(Record),有多少行数据就有多少条记录。
字段是从垂直方向看表中的数据,记录是从水平方向看表中的数据。
上表website 共有 8 条记录,以下是第 3 条记录:
+----+----------------+----------------------------+-----+-------+---------+---------+
| 3 | C语言中文网 | http://c.biancheng.net/ | 12 | 7923 | 11.62 | CN |
+----+----------------+----------------------------+-----+-------+---------+---------+
2
3
程序员往往也不刻意区分记录(Record)和行(Row)的概念,而是将它们等同看待,因此您可以说“website 表的第 3 条记录”,也可以说“website 表的第 3 行”,它们都是等价的。为了加深读者理解,本教程也不区分记录和行的概念,而是将它们混用。
# 什么是空值(NULL)?
字段的取值可以为 NULL,此时意味着该字段是空的,没有任何值,所以 NULL 被称为“空值”。更多内容请转到《SQL NULL (opens new window)》。
注意,NULL 和零值不一样,和包含空白符(空格、缩进、换行等)的字段也不一样,NULL 字段是指在添加记录的时候留空的字段,也即不为该字段指定任何值。
# 数据的完整性
每个 RDBMS 都存在以下几种类别的数据完整性:
- 实体完整性:表中的一行(一条记录)代表一个实体,表中不能有重复的行。
- 域完整性:域也即字段,域完整性用来保证字段的取值是合理的。
- 引用完整性:一个表中的字段可以引用另外一个表中的记录。如果某条记录被另外一个表中的字段引用,那么该记录不能被删除。
- 自定义完整性:除了以上三种基本的完整性约束,不同版本的 RDBMS 在实现时,还可以根据其具体的应用环境,自己制定一些其它的完整性约束。
# 数据库范式
设计关系型数据库时,需要遵守一些特定的规范才能设计出合理的数据库,这些规范就称为“范式”,满足不同程度的规范就是不同的范式。范式的目的在于:
- 消除冗余数据,比如,不应该将两份相同的数据存储到不同的表中;
- 确保数据之间的关联性是有意义的。
以上两点不但能减少数据库占用的存储空间,还能确保数据之间有清晰的逻辑关系。
关系型数据库之父 Edgar Frank "Ted" Codd 提出了六种范式,但是从长期实践看,三种范式更具有实际的意义。满足最低要求的叫第一范式,简称 1NF;在第一范式的基础上满足进一步要求的称为第二范式,简称 2NF;以此类推,在第二范式的基础上满足更加进一步要求的称为第三范式,简称 3NF。
遵守的范式级别越高,数据的冗余越少,下一级别的范式包含上一级别的所有范式;也就是说,范式级别越高越严格。
# 常用关系型数据库
关系型数据库管理系统(RDBMS)有很多种,它们都有各自的优缺点,下表是由 DB-Engines 发布的 2020 年 11月份数据库排名榜单。
排名 | 数据库 | 类型 | 得分 |
---|---|---|---|
1 | Oracle | 关系型数据库 | 1345.00 |
2 | MySQL | 关系型数据库 | 1241.64 |
3 | Microsoft SQL Server | 关系型数据库 | 1037.64 |
4 | PostgreSQL | 关系型数据库 | 555.06 |
5 | MongoDB | 文档数据库 | 453.83 |
6 | IBM Db2 | 关系型数据库 | 161.62 |
7 | Redis | 键值对(Key-value)数据库 | 155.42 |
8 | Elasticsearch | 搜索和数据分析引擎 | 151.55 |
9 | SQLite | 关系型数据库 | 123.31 |
10 | Microsoft Access | 关系型数据库 | 118.75 |
除了“关系型数据库”,其它类型的数据库统称为 NoSQL 数据库。NoSQL = Not Only SQL ,也即“不仅仅是 SQL”。
选择了一些常用的 RDBMS,并帮助您比较了它们的历史和特性。
# MySQL
MySQL 是一种开源的 SQL 数据库,由瑞典的 MySQL AB 公司开发。MySQL 支持多线程、多用户,并且非常快速,一般的中小型网站都选择 MySQL。
MySQL 是跨平台的,可以在 Windows、Linux、Unix 和 Mac OS X 等主流操作系统上运行。
MySQL 有免费版和收费版,它们的功能和用途(商业/非商业)是有区别的。
# MySQL 简史
- 1994 年,Michael Widenius 和 David Axmark 在 Unix 系统上着手开发 MySQL。
- 1995 年,MySQL AB 公司在瑞典创立。
- 1996 年 5 月,MySQL 1.0 版本在小范围内发布;1996 年 10 月,MySQL 3.11.1 版本公开发布。
- 1998 年 1 月 8 日发布 Windows 版,适用于 Windows 95 和 NT 平台。
- MySQL 最初是 MySQL AB 公司的私有财产,2000 年遵循 GPL 协议开放源代码,免费供大家使用。
- MySQL 3.23 版本,从 2000 年 6 月开始测试,2001 年 1 月正式发布。
- MySQL 4.0 版本,从 2002 年 8 月开始测试,2003 年 3 月正式发布。
- MySQL 5.0 版本,从 2005 年 3 月开始测试,2005 年 10 月正式发布。
- 2008 年 2 月 26 日,Sun 公司收购了 MySQL AB 公司,MySQL 数据库归 Sun 公司所有。
- MySQL 5.1 版本,2008 年 11 月 27 日正式发布。
- 2015 年,MySQL 5.7 版本发布,这是 5.x 的最后一个版本。
- MySQL 跳过了 6.x 和 7.x 版本,于 2016 年 9 月直接发布了 8.0 版本;截止到 2020 年 11 月份,MySQL 的最新版本是 8.0.22。
# MySQL 特性
- 使用 C/C++ 编写,性能高
- 跨平台,支持 Windows、Mac OS、Linux、Unix 等各种操作系统
- 可伸缩性和可扩展性
- 很好地支持事务
- 适合 Web 等大数据量应用场景
- 强大的数据保护功能
- 适用于各种应用程序开发
- 易于管理
- 开源、自由、24x7 小时支持
- 总体的使用成本很低
# SQL Server
SQL Server 是微软公司(Microsoft)开发的一种关系型数据库,只能运行于 Windows 操作系统,它除了支持标准的 SQL 语言,还支持增强版的 T-SQL。
# SQL Server 简史
- 1987 年,Sybase 公司发布了用于 Unix 系统的 SQL Server。
- 1989 年,Microsoft、Sybase 和 Aston-Tate 几家公司联合将 SQL Server 移植到 OS/2 平台。
- 1989 年,Microsoft、Sybase 和 Aston-Tate 联合发布了适用于 OS/2 的 SQL Server 1.0 版本。
- Microsoft 终止与 Aston-Tate 的合作,Aston-Tate 退出了 SQL Server 开发。
- 1990 年,SQL Server 1.1 发布,开始支持 Windows 3.0。
- 1994年,Microsoft 再次终止与 Sybase 的合作,买下了 Windows NT 版本 SQL Server 全部版权,此后 Microsoft 开始独立开发 SQL Server。
- 1995 年 6 月,Microsoft 发布了 SQL Server 6.0。对 Microsoft 而言,这个版本是一个重要的里程碑,因为这个版本是独立完成的,没人借他人之手。
- 2000 年,Microsoft 发布了 SQL Server 2000。
- 2001 年,Microsoft 发布了适用于 SQL Server 的 XML。
- 2002 年,微软发布了 SQLXML 2.0(由 XML for SQL Server 更名而来)。
- 2002 年,Microsoft 发布了 SQLXML 3.0。
- 2005 年 11 月 7 日,Microsoft 发布了 SQL Server 2005,这是一次重大的架构变革,原有的很多方面都被重写。
- 2008 年发布 SQL Server 2008,作为上一代产品的升级强化版本。
- 2012 年发布 SQL Server 2012,做出了重大改进。
- 截止到 2020 年 11 月份,最新的公开发布版本是 SQL Server 2019。
# SQL Server 特性
- 高性能
- 高可用性,适用于多种应用程序开发
- 数据库镜像
- 数据库快照
- CLR 整合
- 服务代理(Service Broker)
- DLL 触发器
- 排名函数
- 基于数据行的隔离级别
- 内置 XML 的支持
- 支持异常处理
- 支持邮件发送
# Oracle
Oracle 是一个大型的、基于多用户的关系型数据库管理系统,它的优势是高并发、高吞吐量以及分布式。不管是 B/S(Browser/Server)模式还是 C/S(Client/Server)模式,Oracle 都是非常不错的选择。
Oracle 几乎支持所有的主流操作系统,包括 MS DOS、OS/2、NetWare、UnixWare、OS/2 以及大多数的 Unix 发行版。
# Oracle 简史
Oracle 是历史最悠久的数据库之一,今天它已经 43 岁了(1977 ~ 2020)。
- 1977 年,Larry Ellison、Bob Miner 和 Ed Oates 成立了软件开发实验室,开始从事 Oracle 开发工作。
- 1979 年,Oracle 2.0 版发布,成为第一个商业的关系数据库和第一个 SQL 数据库。同年,公司更名为 Relational Software Inc(简称 RSI)。
- 1981年,RSI 开始为 Oracle 开发管理工具。
- 1982 年,RSI 更名为 Oracle Corporation。
- 1983 年,Oracle 3.0 版发布,该版本使用C语言进行了重构,并能够运行在多个平台上。
- 1984 年,Oracle 4.0 版发布,包含了并发控制、多版本读取一致性等功能。
- 1986 年,Oracle 上市,每年营业额 5500 万美元。
- 1988 年,Oracle 6.0 发布,对核心组件进行了改写,极大提升了性能。
- 1989 年,Oracle 进入中国市场。
- 2007 年,Oracle 发布了 Oracle 11g,该版本侧重于更好的分区、易于迁移等。
- 2013 年,Oracle 发布了 Oracle 12c,用以支持云计算。
- 2019 年,Oracle 19c 发布,这也是目前(2020-11)的最新版本。
# Oracle 特征
- 高并发
- 读取一致性
- 锁机制
- 静默(Quiesce)模式
- 高可移植性
- 自我管理能力(Self-managing)
- SQL*Plus 客户端工具
- 自动存储管理(ASM)
- 调度程序
- 资源管理
- 数据仓库
- 物化视图(Materialized View)
- 位图索引
- 表压缩
- 并行执行
- 数据挖掘模块
- 分区功能
# Access
Access 是微软(Microsoft)发布的一款入门级的数据库管理软件,随专业版的 Microsoft Office 安装包一起发布。Access 价格便宜,适合数据量不大、性能要求不高的小型项目。
Access 带有界面,操作起来比较直观,不需要具备非常专业的数据库知识。
Access 使用一种称为 Jet 的数据库引擎,它删除了标准 SQL 的部分功能,同时也扩展了一些标准 SQL 没有的功能,形成了一种独特的 SQL 变种,被称为 Jet SQL。
# Access 简史
- 1992 年,Access 1.0 版本发布。
- 1993 年,Access 1.1 版本发布,提高了兼容性,并支持 Access Basic 编程语言(Access Basic 有许多特点与 Visual Basic 都相同)。
- 最重要的版本升级是从 Access 97 到 Access 2000。
- 2007 年,Access 2007 版本发布,引入了一种新的数据库格式 ACCDB,用以支持更加复杂的数据类型,例如多值字段和附件字段。
- 2013 年,Access 2013 发布,支持创建 Access Web 应用程序(AWA)。
- 2018 年 9 月 25 日,Access 2019 发布,这是目前(2020-11)最新的版本。
# Access 特性
- 用户可以创建表、查询、表单和报表,并将它们与宏连接在一起。
- 支持多种格式的数据导入导出,包括 Excel、Outlook、ASCII、dBase、Paradox、FoxPro、SQL Server、Oracle、ODBC 等。
- Access 还支持 Jet 数据库格式(Access 2007 中的 MDB 或者 ACCDB),开发者可以将应用程序和数据打包到一个文件中,这使得在将整个应用程序分发给用户时非常方便,用户在没有联网的环境中依然可以使用。
- Access 提供了参数化查询,其它程序(例如 VB6、.NET 等)可以通过 DAO 或者 ADO 使用这些查询结果和数据表。
- 作为 Jet 引擎的替代方案,SQL Server 桌面版可以和 Access 一起使用。
- 和一般的 C/S(Client/Server)模式的关系型数据库管理系统(RDBMS)不同,Access 不支持触发器、存储过程和事务日志。
# 参考
http://c.biancheng.net/sql/