SQL 是什么
SQL 的全称是结构查询语言,这是第一个实现了关系模型的语言。是一种特定领域语言,如果你想开发一个软件,仅仅依靠 SQL 是无法完成的,它只能用于数据的查询和统计。与之相反,C 语言等就被称之为通用语言。
SQL 是关系模型的实现,在被 Oracle,MySQL 等各大关系型数据库所采用,但 SQL 不仅仅在关系型数据库中使用的很广泛,在大数据领域中也有很大的使用空间,Spark、Flink 等前沿的计算框架也都提供了 SQL 接口。
1. SQL结构
SQL 语言本身可以分成 DDL、DCL、DML等类型,每一类都有不同功能。
在 SQL 中有大量的操作符可以使用,而且为了更方便的查询和统计数据,SQL 中还内置了很多函数。
无论是上面三种类型的哪一种,都是由基础的元素构成,最基础的元素有三种:
子句(Clauses):每一个SQL 都可以分解成一个个子句
表达式(Expressions):可以产生任何标量值
谓词(Predicates):产生一个三值逻辑值(true/false/unknow)或者布尔值。
还有另外两种元素是由上面的部分组成的。
查询(Queries):基于特定的条件检索数据
语句(Statements):可以持久化地影响数据和数据结构
也就是说,执行中的 SQL,要么是查询,要么就是语句。
以 SQL 中的 SELECT 查询为例:
以 SQL 中的 UPDATE 语句为例:
这里介绍的是 SQL 的标准语法,在不同数据库中的实现有所不同。
DDL
DDL 全称是 data definition language,用于定义数据结构。
因为如果要能使用 SQL,就要求数据是结构化的。结构化就是指数据的数据结构,有哪些字段,字段是哪种类型,都需要提前定义好。
通俗来说,就是用来创建数据,创建表,修改表结构等等。
DCL
每个数据库系统中都会涉及到权限和安全,DCL 就是用来维护系统访问权限,全称是 data control language。
DML
DML 是日常使用最频繁的一类,全称是 data manipulation language。
对数据表的增删改查都是属于这一类。
操作符
SQL 中还提供了很多逻辑操作符操作符,这些逻辑操作符会和表达式组合形成一个谓词,用来过滤数据。
=
<>
>
<
≥
≤
between
like
in & not in
is null & is not null
is true & is not true
is false & is not false
is not distinct from (两个值相等或者都为空)
as
内置函数
在数据查询统计的需求中,通常会涉及到对数据的汇总和统计,SQL 中提供了很多内置的函数来帮助完成这个过程。
比如时间类的函数:
DAY
MONTH
WEEKDAY
YEAR
...
字符串函数:
LOWER
UPPER
...
聚合函数:
COUNT
AVG
MAX
MIN
...
2. SQL标准
SQL 起源于 1970 年的一篇论文[5],然后由 IBM 实现了这篇关系模型的论文,这就是 SQL 的前身,然后自家产品不断推出相关的产品。
Oracle 看到了 SQL 的潜力,也加入竞争,经历了一段时间的野蛮生长之后,这两家公司共同促进了 SQL 的标准化。
在 1986 年,SQL 成为了 ANSI 的标准,一年之后也成为了 ISO 的标准。
目前最新的 SQL 标准是 SQL-2016,SQL-2019 的标准正在制定中。
SQL 的标准号是通过年份来决定的,历史上的各个 SQL 标准如下:
1986 SQL-86
1989 SQL-89
1992 SQL-92
1999 SQL:1999
2003 SQL:2003
2006 SQL:2006
2008 SQL:2008
2011 SQL:2011
2016 SQL:2016
2019 SQL:2019(正在制定中)
需要注意的是,SQL 标准与实际使用的 SQL 还是有很大区别的,比如在不同的数据库中,对 SQL 的实现不完全相同。
也就是说,很有可能 SQL 标准中的某个特性在具体的数据库中不能使用,比如在 MySQL 中,就抛弃了很多功能,但不妨碍它受欢迎。就像网络的七层协议一样,最后的实现也并不是完整按照这七层协议来,而是选择最实用的方式来实现。
文 / Rayjun
本文首发于我的微信公众号
REF
[1] https://en.wikipedia.org/wiki/SQL
[2] https://en.wikipedia.org/wiki/SQL_syntax
[3] https://en.wikipedia.org/wiki/Domain-specific_language
[4] https://en.wikipedia.org/wiki/General-purpose_language
[5] https://dl.acm.org/doi/10.1145/362384.362685
版权声明: 本文为 InfoQ 作者【Rayjun】的原创文章。
原文链接:【http://xie.infoq.cn/article/c979f5946f5537f93c85780ce】。文章转载请联系作者。
评论