介绍

10/6/2023 SQL

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 命令

与关系型数据库有关的 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      |
+----+----------------+----------------------------+-----+-------+---------+---------+
1
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/            |
+----------------------------+
1
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      |
+----+----------------+----------------------------+-----+-------+---------+---------+
1
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 数据库图标(Logo)

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数据库图标(Logo)

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数据库图标(Logo)

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数据库图标(Logo)

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/

Last Updated: 10/6/2023, 6:06:42 PM