简介:怀恨者将要憎恨,或者你为什么仍然需要SQL

本文是翻译,版权归原作者所有


SQL无处不在,我这样说不是因为我想让你使用SQL。它只是一个事实。我打赌现在你的口袋里就有一些。所有的Android手机和iPhone都能轻松访问叫做SQLite的SQL数据库,你手机上的很多应用直接使用它。它运行着银行、医院、大学、政府、小企业、大企业,几乎每一台电脑和这个星球上的每个人最后都要接触到运行着SQL的东东。SQL是一种极为成功和稳固的技术。

SQL的问题在于好像每个人讨厌其本质。它是一种古怪的、笨拙的“非语言”,这是大多数程序员不能忍受的。像“网络规模”或面向对象编程这些现代问题出现了很长时间之前,SQL就被设计好了。不管它是否基于稳定的算法构建操作理论,它已经被误解得足够令人厌烦了。树?嵌套对象和父子关系?SQL只是蔑视你,给你大量的平面表(flat table),说“别指望我,兄弟。”

如果每个人都如此憎恨SQL,为什么你应该学习它呢?因为这种想象中的憎恨背后是缺乏对SQL是什么以及如何使用SQL的理解。NoSQL运动一定程度上是对于旧的数据库服务器的一种反应,也是对于源自SQL工作原理无知的恐惧所产生的影响。通过学习SQL,你实际上会学到重要的理论概念,这可以应用到过去和现在几乎每个数据存储系统。

不管SQL憎恨者宣扬什么,你都应该学些SQL,因为它无处不在,实际上学到足以被教育的程度不是太难。成为一名受过SQL教育的用户,将有助于你在使用什么数据库、是否不使用SQL上做出见多识广的决定,也有助于你深入理解做为程序员的你所用到的很多系统。

归根结底,我想让你学习SQL,因为它非常便利。我可以使用SQLite为网站应用程序、手机或桌面应用程序快速地规划一个简单数据模型的原型,我也知道它会运行起来,仅仅因为随处都有SQLite。这种使用跨平台一致性和强大数据存储语言的能力是无价之宝。

关于本书

本书向任何人教授SQL,但对于你已经可以编程是有帮助的。被教的SQL概念假定你至少知道如何做些编程工作,即使它只是简单的编程。它也假定你可以从命令行运行命令,知道如何使用shell,可以访问一个优秀程序员的文本编辑器。

为了保持本书简单,即使管理一个庞大的数据库服务器和学习SQL有些偏离,本书会使用SQLite3来讲解语言的基础部分。与如何使用Python或Ruby类似,使用SQLite3,你将学会编写完整的.sql脚本,并运行它们,来学习这门语言。

每个练习将在通常的“Learn The Hard Way”小节里介绍概念。也有一个很小的部分,“可能”用于解释PostgreSQL和/或MySQL的不同,或任何其它数据库,很明显本书的用处不仅仅体现在SQLite3上。

当你学习完本书之后,你应该较好地理解了SQL、如何设计数据、一点点数据库优化,你应当能够深入你选择的另一种数据库了。

SQL是什么?

我对SQL的发音是”sequel“,不过如果你愿意,也能念”ESS-QUEUE-ELL“。SQL还代表了结构化查询语言,但是截至目前甚至没有人关心这一点,因为无论如何这只是一种营销策略。SQL是一种让你与数据库中的数据交互的语言。尽管如此,它非常符合多年前定义的、结构良好的数据属性的理论。这不一定是同样的东东(某些诋毁者悲叹的),不过它足够有用。

SQL的工作原理是它理解表里的字段、理解如何找到基于字段内容的表中数据。所有的SQL操作都是下面通常的四种方式之一:

Create

把数据放入表。

Read

查询表中数据。

Update

改变表中已有数据。

Delete

移除表中数据。

这已经有了首字母缩写”CRUD“,并被视作每个数据存储系统必须具备的一套基础特性。事实上,如果你有时候做不到这四种方式之一,那么最好有个好理由。

我喜欢解释SQL工作原理的方式是把它与类似Excel的电子表格软件做比较:

最后一条比较关键,不理解这一点,会带来很多头痛的地方。SQL仅仅知道表,以及每个操作产生表。它可以通过修改一个现存表来“产生”一个表,也可以作为你的数据集返回一个新的临时表。

当你阅读本书时,你开始理解这种设计的重要性。比如,面向对象语言与SQL数据库不匹配的一个原因是OOP语言通过图表组织,而SQL只是想返回表。既然任何图表映射到表是可能的,反之亦然,但是它把大量工作交给OOP语言来作翻译。如果SQL返回一个嵌套的数据结构,那么这不是一个问题。

另一个引起不匹配的地方是SQL的概念,比如三元联系(Ternary Relationship)和属性关系 (attributed relationships),而OOP完全不能理解。在SQL里,我能够使用第4张表使3张表彼此关联,而第4张表是连贯关系。在OOP语言里,同样的工作我不得不用一个完整的中间类来转换这种关系,这在OOP里有些古怪。

这或许就像完全的魔咒,但是当你学完本书,你将理解这些问题以及如何处理它们。

反对教导

你或许遇到某个人,他认为你应当学习X技术因为它是优秀的。他们会宣称学习SQLite终生对你产生伤害,因为它正失去特性。或者,他们说SQL已死,NoSQL才是未来。

这些人的问题在于他们正试图教导你,而不是教育你。他们认为技术的世界是一个他们不得不赢的零和博弈【注1】,如果你学习SQL或SQLite,你就不能学习他们选择的系统。通常,这种教导是设计好的,以致于你必须取决于他们公司赖以生存的软件和服务。

我想教育你,让你有自己做出选择的能力,去学习你想学习的东西。我仅仅使用SQLite,因为它最简单,是你能够安装的最完整的SQL系统。其他服务器在安装和管理上是一个巨大的痛苦,但是SQLite只是一次下载,它免费,可靠。这就是我使用SQLite的唯一原因。我不想让你一直在SQLite上投入下去。我不想坚定你使用SQL而非NoSQL的信心。

我唯一目标就是用最简单的方式教育你这个特定工具,以致于做为程序员的你能够得到提高,在你学会之后,你不需要依靠我或我的服务就可以搞定。

当人们试着对你说,学习SQL多少有些”削弱“你的时候,要记住上面的话。通常他们想利用你现存的无知来获取一些东西。

原文地址:http://sql.learncodethehardway.org/book/introduction.html

注1:零和博弈,http://baike.baidu.com/view/196849.htm

译文:简介:怀恨者将要憎恨,或者你为什么仍然需要SQL 》| 腊八粥