历史

如上所述,关系型数据库管理系统(rDBMS)通过关系代数的操作(如投影、选择、连接、集合操作(并集、差集和交集)等)对数据进行处理。关系代数的操作使用高度形式化且难以理解的数学语言表示,这对最终用户以及许多软件工程师来说可能不易理解。因此,rDBMS 提供了一个位于关系代数之上的易于理解的层,但可以映射到底层的关系操作。自1970年代以来,我们见证了一些语言承担了这一角色;其中之一是SQL,另一个例子是QUEL。在1980年代初期(由于商标问题从原名SEQUEL更名为SQL后),SQL实现了市场主导地位。并且在1986年,SQL首次被标准化。当前版本为SQL 2023。

特性

SQL的标记和语法以英语日常用语为模型,以尽可能降低访问门槛。一个像 UPDATE employee SET salary = 2000 WHERE id = 511; 这样的SQL命令,与句子“将id为511的员工的薪水改为2000”相差无几。

SQL的关键字可以用任意组合的大小写字母表示,即关键字不区分大小写。无论是在SQL代码中写成UPDATE、updateUpdateUpDate,还是其他任何大小写组合,都没有区别。

接下来,SQL是一种描述性语言,而不是过程性语言。它不规定关系操作的所有方面(例如,使用哪种操作、操作的顺序等),这些操作是从给定的SQL语句中生成的。rDBMS有自由从一个语句生成多个执行计划。它可能会比较生成的多个执行计划,并在特定情况下运行它认为最好的那个。此外,程序员无需考虑所有数据访问的细节,例如:如果WHERE条件与AND结合,应该先评估哪些条件?

尽管有上述简化,SQL仍然非常强大。它允许通过单一语句操作一组数据记录。UPDATE employee SET salary = salary * 1.1 WHERE salary < 2000; 将影响所有实际薪水低于2000的员工记录。潜在地,这些记录可能有数千条,只有几条甚至零条。该操作还可能依赖于数据库中已存在的数据;语句 SET salary = salary * 1.1 导致薪水增加10%,这可能对一个员工增加120,对另一个员工增加500。

SQL的设计者试图使语言元素彼此独立。这意味着任何语言元素都可以在语句中任何允许直接使用该元素结果的位置使用。例如:如果你有一个函数 power(),它接受两个数字并返回另一个数字,你可以在所有允许数字的位置使用该函数。以下语句在语法上是正确的(如果你已定义函数 power() )——并且会导致相同的结果行。

SELECT salary FROM employee WHERE salary < 2048;
SELECT salary FROM employee WHERE salary < power(2, 11);
SELECT power(salary, 1) FROM employee WHERE salary < 2048;

另一个正交性的例子是,在UPDATE、INSERT、DELETE或另一个SELECT语句内部使用子查询。

然而,SQL并非没有冗余。通常有多种可能的表达方式来表示相同的情况。

SELECT salary FROM employee WHERE salary < 2048;
SELECT salary FROM employee WHERE NOT salary >= 2048;
SELECT salary FROM employee WHERE salary BETWEEN 0 AND 2048; -- 'BETWEEN' 包含边界

这是一个非常简单的例子。在复杂的语句中,可能需要在连接、子查询和exists谓词之间进行选择。

基础知识

核心SQL由语句组成。语句由关键字、操作符、值、系统和用户对象的名称或函数组成。语句以分号结尾。在语句 SELECT salary FROM employee WHERE id < 100; 中,SELECTFROMWHERE 是关键字。salaryemployeeid 是对象名称,< 是操作符,100 是值。

SQL标准将语句分为九类:

“SQL语句的主要类别包括:

  1. SQL模式语句;这些语句可能对模式集产生持久影响。
  2. SQL数据语句;其中一些,如SQL数据更改语句,可能对SQL数据产生持久影响。
  3. SQL事务语句;除了<commit语句>之外,这些语句以及以下类别的语句在SQL会话终止时不会产生持久效果。
  4. SQL控制语句。
  5. SQL连接语句。
  6. SQL会话语句。
  7. SQL诊断语句。
  8. SQL动态语句。
  9. SQL嵌入异常声明。”

这种详细的分类在日常语言中并不常见。一个典型的替代方法是将SQL语句组织为以下组:

  • 数据定义语言(DDL):管理数据库对象的结构(创建/修改/删除表视图、列等)。
  • 数据查询语言(DQL):使用SELECT语句检索数据。这个组只有一个语句。
  • 数据操纵语言(DML):使用INSERT、UPDATEMERGEDELETE、COMMIT、ROLLBACK和SAVEPOINT语句更改数据。
  • 数据控制语言(DCL):管理访问权限(GRANT、REVOKE)。

图灵完备性

如上所述,核心SQL并非图灵完备。它缺少条件分支、变量、子程序等功能。但标准以及大多数实现提供了扩展以满足图灵完备性的需求。在标准的“第4部分:持久存储模块(SQL/PSM)”中,定义了IF、CASE、LOOP、赋值和其他语句。现有实现对此部分的名称、语法以及操作范围有所不同:Oracle中的PL/SQL,DB2中的SQL/PL,SQL Server和Sybase中的Transact-SQL或T-SQL,Postgres中的PL/pgSQL,以及MySQL中的“存储过程”。

Last modified: Tuesday, 28 January 2025, 12:03 PM