sql是什么,通俗的说,太专业听不懂?

sql是什么,通俗的说,太专业听不懂?

Codd基于对关系模型的定义,他提出了一种叫作DSL/Alpha的语言,用于操作关系数据表中的数据。在Codd的论文发表后不久,IBM委托一个小组根据Codd的想法建立一个原型。这个小组创建了DSL/Alpha的简化版本SQUARE。经过对SQUARE的改进,产生了SEQUEL语言,最终该语言被命名为SQL。尽管SQL最初是用于操作关系型数据库中的数据,但如今已经演变为一种可以处理各种数据库技术的语言(正如你将在本书结尾看到的)。

SQL现在已有40多年的历史,其间经历了很大的变化。20世纪80年代中期,美国国家标准协会(American National Standards Institute,ANSI)开始制定SQL语言的第一个标准,该标准最终于1986年发布。随后经过改进,陆续在1989年、1992年、1999年、2003年、2006年、2008年、2011年、2016年发布了新版本。在改良核心语言的同时,SQL语言中还添加了一些新特性,引入了面向对象功能等。之后的标准侧重于相关技术的集成,比如可扩展标记语言(XML)和JavaScript对象表示法(JSON)。

SQL与关系模型相辅相成,因为SQL查询的结果就是数据表(在该上下文中,也叫作结果集)。所以,在关系型数据库中,新的永久性数据表可以通过存储查询的结果集来创建。同样,查询可以使用永久性数据表和其他查询的结果集作为输出(我们会在第9章讨论相关细节)。

最后强调一点:SQL并不是某种缩写[尽管很多人坚持认为它表示“Structured Query Language”(结构化查询语言)]。在提及该语言时,可以使用独立的字母(S.Q.L)或使用“sequel”。

SQL语言被划分为若干部分:我们在本书中研究的部分包括SQL模式语句(SQL schema statement),用于定义存储在数据库中的数据结构;SQL数据语句(SQL data statement),用于操作之前使用SQL模式语句定义的数据结构;SQL事务语句(SQL transaction statement),用于启动、结束、回滚事务(相关概念会在第12章介绍)。例如,要想在数据库中创建新表,可以使用SQL模式语句create table,要在新表中填充数据,则需要使用SQL数据语句insert。

下面给出创建数据表corporation的SQL模式语句:

该语句创建出一个包含两列数据(corp_id和name)的表,其中corp_id列作为该表的主键。这个语句的具体细节(比如MySQL可用的数据类型)我们留待在第2章中仔细研究。接下来的SQL数据语句向corporation表中插入了一行关于Acme Paper Corporation的数据:

该语句向corporation表中添加了一行数据,其中corp_id列的值为27,name列的值为Acme Paper Corporation。

最后是一个简单的select语句,检索刚才创建好的数据:

通过SQL模式语句所创建的所有数据库元素都被存储在一个名为“数据字典”(data dictionary)的特殊表集合内。这些关于数据库的数据被称为“元数据”,我们将在第15章介绍。与用户创建的数据表一样,数据字典表也可以通过select语句查询,从而允许在运行时查看数据库中当前的数据结构。例如,用户需要创建展示上月新增账户的报表,那么既可以在Account表中硬编码事先已经知道的列名,也可以通过查询数据字典确定当前有哪些列,然后每次动态地生成报表。

本书大部分篇幅将聚焦于SQL语言中与数据相关的部分,包括select、update、insert、delete命令。SQL模式语句将在第2章中说明,这将引导你完成一些简单的数据表的设计和创建。一般来说,除了语法,对于SQL模式语句无须进行太多的讨论,而SQL数据语句,尽管数量寥寥,但包含了大量值得仔细研究的地方。因此,虽然我会介绍不少SQL模式语句,但本书的大多数章节还是把重点放在SQL数据语句上。

如果你有编程经验,肯定已经习惯了定义变量和数据结构、使用条件逻辑(if-then-else)和循环结构(do while...end)、把代码分解为可复用的小片段(对象、函数、过程)。代码经过编译后执行,其执行结果精确地(其实,并非总是精确地)符合预期。无论是使用Java、Python、Scala或其他过程化语言,你都可以完全控制程序的行为。

过程化语言定义了所预期的结果以及生成该结果的实现机制或过程。非过程化语言同样定义了所预期的结果,但是生成结果的过程则留给外部代理来实现。

对于SQL,你需要放弃部分已经习惯的控制权,因为SQL语句只定义了必要的输入和输出,至于如何执行语句,则由名为优化器(optimizer)的数据库引擎组件来处理。优化器的工作是检查SQL语句,考虑数据表的配置以及可用的索引,并决定最有效的执行路径(好吧,也未必总是最有效的)。大多数数据库引擎都允许你通过指定优化器提示(optimizer hint)来影响优化器的决策,比如建议使用特定的索引等,但大多数SQL用户从来不需要深入到该复杂层面,把这种事交给数据库管理员或性能调优专家来处理就行了。

因此,单凭SQL无法编写完整的应用程序,除非你只是编写简单的脚本来处理某些数据,否则需要将SQL与编程语言集成起来。一些数据库厂商已经为用户考虑了这些,比如Oracle的PL/SQL语言、MySQL的存储过程语言以及Microsoft的Transact-SQL语言。在这些语言中,SQL数据语句是该语言语法的一部分,允许无缝地将数据库查询与过程化语句集成到一起。如果你使用的是Java或Python这种非数据库特定语言,则需要使用工具集/API才能在代码中执行SQL语句。有些工具集由数据库厂商提供,有些则由第三方厂商或开源代码提供者所创建。表1-2展示了将SQL集成到特定语言的部分可用选择。

表1-2 SQL集成工具集

如果仅仅需要交互式执行SQL命令,所有的数据库厂商都提供了至少一种简单的命令行工具,用于向数据库引擎提交SQL命令并检查执行结果。大多数厂商还提供了图形化的工具,其中包含一个显示SQL命令的窗口以及一个显示SQL命令执行结果的窗口。此外,SQuirrel等第三方工具可以通过JDBC连接到很多不同的数据库服务器。因为本书中的示例都是在MySQL数据库中执行的,所以我选择使用MySQL安装自带的命令行工具来运行示例和格式化运行结果。

之前答应过要展示一个能够返回George Blake的支票账户所有交易的SQL语句,下面就是这些SQL语句:

现在先不涉及过多的细节,该查询查找满足两个条件的行,即individual表中姓名为George Blake的行和product表中的name列为checking的行,并通过account表将两者关联起来,然后分4列返回transaction表中提交到该账户的所有交易信息。如果你恰好知道George Blake的account_id为8,product_cd为'CHK',就可以简单地根据客户ID在account表中找到George Blake的支票账户,并使用账户ID找出相应的交易:

在随后的章节中,我会逐一介绍以上查询中涉及的所有概念(而且远不止这些),但这里仅展示一下其基本结构。

上述查询包含三种不同的子句:select、from和where。几乎所有查询至少都会包含这三种子句,尽管还有更多子句可用于实现更具体的目标。它们的用途如下所示:

大多数SQL实现将位于“/”和“/”之间的文本视为注释。

在构建查询时,通常首先要确定需要哪些数据表,接着将其加入from子句。然后,向where子句加入条件,将数据表中不需要的数据过滤掉。最后,确定要检索数据表中的哪些列并将其加入select子句。下面这个简单的示例展示了如何查找姓氏为“Smith”的所有客户:

该查询搜索individual表,在其中找出lname列匹配字符串'Smith'的所有行,并返回这些行的列cust_id和fname。

除了查询数据库,很可能还需要在数据库中插入和修改数据。下面这个简单的例子,展示了如何在product表中插入新行:

糟糕,这里把“Deposit”拼错了。无妨,可以使用update语句来解决:

注意,与select语句一样,update语句也包含了where 子句。原因在于update语句必须标识出要修改的行,在本例中,只需要指定product_cd列与字符串'CD'相匹配的那些行。因为product_cd列是product表的主键,所以update语句只会修改一行(或者一行都不修改,如果数据表中不存在该值的话)。不管什么时候执行SQL数据语句,都会接收到来自数据库引擎的反馈,说明有多少行受到该语句的影响。如果使用交互式工具(比如之前提到的命令行工具),那么会接收到来自下列语句的反馈信息:

如果你使用了过程化语言以及之前提到的某种工具集,当你执行SQL数据语句之后,可以使用工具集提供的调用来获取语句的执行结果。一般而言,最好是检查一下执行结果,以免语句执行后出现意想不到的结果(比如忘了在delete语句中加入where子句,这会把整个数据表的行全部清空!)

推荐阅读

SQL学习指南(第3版)

本书介绍了SQL语言的基础知识以及高级特性,包括SQL基本查询、过滤、多数据表查询、集合、数据操作、分组和聚合、子查询、连接、条件逻辑、事务、索引和约束、视图等内容。同时,为了适应近年来数据库领域的发展变化,本书针对大数据、SQL跨平台数据库服务和数据分析等领域的需求,增加了处理大型数据库的实现策略和扩展技术,以及报表和分析工具等内容。

本书内容循序渐进,每章的主题相对独立,并提供了丰富、可扩展的示例,同时还配备精选练习,有利于读者有效学习和快速掌握SQL语言。本书适合作为数据库应用开发者和数据库管理员的必备入门书,也可供SQL相关从业者查阅和参考。