sql编程思想(一门从设计之初就为新手考虑的编程必备技能)
前段时间,美国招聘网站 Indeed 公布了2019 年计算机技能需求排行榜,结果是:SQL排名最高,Java紧随其后,Python位居第三。
而在大数据领域,SQL作为专业工具的使用率一直是名列前茅。
各技能占比:数据分析师(蓝)、数据工程师(橙)、数据科学家(黄)
今天就来聊聊,45岁的SQL是如何保持青春的?以及现阶段SQL是否还重要?
SQL:过去和现在
1970年夏天,IBM公司E.F. Codd博士发表了论文"A Relational Model of Data forLarge Shared Data Banks",结构化查询语言( Structured Query Language,SQL)就是以此为原型开发出来的。
SQL后来成为了与关系数据库进行通信的标准语言,Codd 也因此在 1981 年获得了计算机领域最高奖图灵奖,被人们称为关系数据库之父。
SQL为何如此重要?举例来说,当我们去别的国家旅行时,如果服务员只能使用本国语言,那我们用母语点菜就可能会有麻烦。如果把数据库看作一个要从中进行信息搜索的国家,那么SQL就是我们向数据库表达需求的语言。如同在别的国家通过菜单点菜一样,我们可以利用SQL进行查询,从数据库中获得特定的信息。
参考我们通过在线商店来订购图书、衣服或其他任何产品时的情况。我们需要通过点击的方式来导览产品目录,输入搜索条件,然后将货物放到购物车中,而这一切都需要在幕后执行SQL代码,以连接数据库,同时告诉数据库我们想要查看什么数据,以及以什么方式来查看。
为了让大家更好地理解SQL,本文将从SQL的历史,SQL标准在过去多年是如何进化的,以及一些数据库系统知识和最新技术,包括关系型数据库、客户端/服务器系统、基于Web的系统,分别展开介绍:
SQL标准化
美国国家标准化组织( American National Standards Institute , ANSI )是一个核准多种行业标准的组织。SQL作为关系数据库通信所使用的标准语言,最初是基于IBM的实现于1986年被批准。
1987年,国际标准化组织( International Standards Organization , ISO )把ANSI SQL作为国际标准。该标准在1992年进行了修订( SQL-92 ) , 1999年再次修订( SQL-99 )。目前最新的标准是SQL-2019。
有人认为标准限制了特定实现的灵活性和功能,然而,遵循标准的大多数厂商都在标准SQL中添加了特定于产品的增强功能,从而弥补了这种缺陷。
综合考虑正反两方面的因素,标准还是好的。预期的标准定义了在任何SQL完整实现中都应该具备的特性,规划的基本概念不仅使各种相互竞争的SQL实现保持一致性,也提高了SQL程序员的价值。
所谓SQL实现是指特定厂商的SQL产品或RDBMS。需要说明的是,SQL实现之间的差别很大。虽然有些实现基本上与ANSI兼容,但没有任何一种实现能够完全遵循标准。另外,近些年ANSI标准中为了保持兼容性而必须遵守的功能列表并没有太大改变,因此,新版本的RDBMS也必将保持与ANSI SQL的兼容性。
数据库
简单来说,数据库就是数据的集合。我们可以把数据库看成这样一种有组织的机制:它能够存储信息,用户能够通过这种机制以高效的方式检索其中的信息。
事实上,人们每天都在使用数据库,只是没有察觉到。电话簿就是一个数据库,其中的数据包括个人的姓名、地址和电话号码。这些数据是按字母排序或是索弓|排序的,可以使用户方便地找到特定的本地居民。
从根本上说,这些数据保存在计算机上的某个数据库里。毕竟这些电话簿的每一页都不是手写的,而且每年都会发布一个新版本。
数据库必须被维护。由于居民会搬到其他城市,电话簿里的条目就需要删除或添加。类似地,当居民更改姓名、地址、电话号码等信息时,相应的条目也需要修改。
一个简单的数据库
关系数据库
关系数据库由被称为表的逻辑单元组成,这些表在数据库内部彼此关联。关系数据库可以将数据分解为较小的、可管理的逻辑单元,从而更容易根据组织级别进行维护,并提供更优化的数据库性能。
关系数据库中的表之间通过一个公共的关键字(数据值)彼此关联。
客户端/服务器技术
过去,计算机行业由大型计算机统治,它们是体积庞大、功能强悍的系统,具有大容量存储和高速数据处理能力。
用户通过哑终端与大型机通信,所谓哑终端就是没有处理能力的终端,完全依靠大型机的CPU、存储和内存进行工作。每个终端通过一条数据线连接到大型机。
大型机环境能够很好地实现其设计目的,并且仍然在当今很多业务中发挥作用,但另一种更伟大的技术出现了:客户端/服务器模型。
在客户端/服务器系统中,主计算机被称为服务器,可以通过网络进行访问(通常是局域网或广域网)。通常是个人计算机(PC )或其他服务器访问服务器,而不是哑终端。
每台个人计算机被称为客户端,它可以连接到网络,从而允许客户端与服务器之间进行通信,这也就是“客户端/服务器”名称的由来。
客户端/服务器与大型机环境之间最大的差别在于,客户端/服务器环境中的用户计算机能够“思考”,利用自身的CPU和内存运行自己的进程,并且能够轻松地通过网络访问服务器。
在大多数情况下,客户端/服务器系统更适用于商业需求,因此获得了青睐。
现代数据库系统运行于多种不同的操作系统之上,而这些操作系统又运行在多种不同的计算机上。最常见的操作系统有基于Windows的系统、Linux和UNIX命令行系统。数据库主要位于客户端/服务器和Web环境中。无法实现数据库系统的主要原因是缺乏培训
和经验。
然而,随着当今商业中不断增长的(甚至是不合理的)需求以及Internet技术和网络计算的发展,我们应该理解客户端/服务器模型和基于Web的系统。
客户端/服务器模型
基于Web的数据库系统
商业信息系统已经在Web集成方向有了很大发展。现在我们能够通过Internet访问数据库,这意味着顾客(数据的用户)使用浏览器(比如IE、Microsoft Edge和Firefox )就能访问公司的信息,能够定购货物、盘点库存、查看订单状态、对账户进行管理变更、转账等。
用户只需打开浏览器,访问公司的站点并登录(如果公司的站点要求这样做) , 就可以利用内置到公司Web页面中的程序访问数据。大多数公司都要求用户注册,并且为用户提供登录名和密码。
当然,通过Web浏览器访问数据库时,幕后还会发生许多事情。举例来说,Web程序可以运行SQL,从而访问公司的数据库,向Web服务器返回数据,然后再将数据返回到顾客的浏览器。
从用户的角度来说,基于Web的数据库系统的基本架构类似于客户端/服务器系统。每个用户拥有一台客户机,安装了浏览器程序,能够连接到Internet。这个网络(对基于Web的数据库来说)碰巧是Internet,而不是本地网络。在大多数情况下,客户机访问服务器是为了获取信息,并不关心服务器是否位于另一个省,甚至是另一个国家。
基于Web的数据库系统的主要目的在于利用没有物理界限的数据库系统,提高数据可访问性,扩大公司的客户群。
主流数据量厂商
当今一些主流的数据库厂商包括Oracle、Microsoft、 Informix、 Sybase和IBM。这些厂商以基本许可费用的形式出售各种版本的关系数据库(通常称为闭源版本)。
其他一些厂商提供SQL数据库(关系数据库)的开源版本,这些厂商包括MySQL、PostgresSQL和SAP。虽然还有其他很多厂商,但这里列出的名称经常会出现在图书、报纸、杂志、股市和万维网上。
每个厂商的SQL实现在功能和性质上都是与众不同的。数据库服务器就是一个产品像市场上的其他产品一样,由多个不同的厂商生产。为了实现可移植性和易用性,厂商都保证其实现兼容于当前的ANSI标准,这关乎到厂商的利益。
比如一家公司从一个数据库服务器迁移到另一个时,需要数据库的用户学习另一种语言来维护新系统的功
能,用户的体验会非常差。
但是,每个厂商的SQL实现都针对其数据库服务器进行了增强(或称为扩展),即将一些额外的命令和选项附加于标准SQL软件包上,由特定的实现提供。
SQL还重要吗?
NoSQL、NewSQL已经超越了传统数据库,SQL还有用武之地吗?
以后都是云时代了,谁还用关系型数据库呢?
我编程都是用OR Mapping工具,从不需要写SQL!
大数据时代,我们都用Hadoop、Spark了,不用写SQL啦!
以上是这届网友问得最多的问题,之所以有这些疑问,是因为随着NOSQL、NEWSQL、BIGDATA等技术逐步成熟推广,“SQL语言在现阶段已经变得不那么重要”成为一些人的观点。那实际情况又是如何呢?
先说NoSQL,它并非为了取代关系型数据库,而是指Not Only SQL,提供了在SQL之外的另一种选择。
NoSQL有很多种分类,大致包括键值数据库、文档数据库、列族数据库以及图数据库等,用于解决各异的场景。
NoSQL数据库虽然可以提供良好的扩展性和灵活性,但它们的不足却是十分明显的:
不同的NoSQL数据库都有自己的查询语言,相比于SQL,制定应用程序标准接口难上加难。并且NoSQL也无法提供ACID的事务的操作,因此很多企业无法放心的将NoSQL应用于核心业务系统中。
正如NoSQL的定义所说,它们仅仅是基于SQL的关系型数据库的有益补充,而非关系型数据库的替代者。
再来是NewSQL,它是对各种具有分布式可扩展的数据库的简称,继承了NoSQL对海量数据的处理能力,同时还保持了传统关系型数据库对SQL和ACID事务的支持。
总的来看,NewSQL虽然尚未成熟,但确是面向未来的正确尝试。三种类型NewSQL数据库的关注点各不相同,新架构类型数据库的关注点是彻底的革新;透明化分片数据库中间件的关注点是增量;而云数据库则更加关注屏蔽用户使用细节。
那SQL 为何会成功?
1. 易于学习和使用
与其他高级编程语言不同,SQL通过使用声明性语句而变得简单而受到喜爱。它无需你记住数字和字母字符串,只使用简单的语言结构和易于理解的英语单词。
如果你是编程和数据科学的新手,那么SQL是最好的入门语言。而作为一个有抱负的数据科学家,更需要学习SQL,因为它是数据科学的基础。
2. 了解数据集
作为数据科学家,你首先要了解的是对正在使用的数据集的深入了解。学习SQL将对关系数据库有扎实的了解,从而使你能够掌握数据科学的基础。
SQL将帮助你充分研究数据集,对其进行可视化,识别结构并了解数据集的实际外观。它能够发现是否缺少任何值,识别异常值,NULLS和数据集的格式。通过切片,过滤,聚合和排序,SQL将使您能够玩转数据集,对其完全熟悉,并了解值的分布方式和数据集的组织方式。
SQL于数据科学家而言,就像外科医生的手术刀,因为SQL在“增加”数据集以进行详细了解方面毫无疑问是有用的。
3. 与脚本语言集成
尽管SQL在数据访问,查询和操作方面功能强大,但在某些方面(如可视化)受到了限制。作为数据科学家,你将需要以团队或组织容易理解的方式精心呈现数据。SQL与R和Python等其他脚本语言很好地集成在一起。你可以轻松地将SQL和Python集成在一起,以将代码包作为存储过程合并,从而轻松地完成工作。
同样,SQL的专用连接库(如SQLite和MySQLdb)在将客户端应用程序连接到数据库引擎时也非常有用,从而使您可以使用数据集。
4. 管理海量数据
在大多数情况下,数据科学涉及处理关系数据库中存储的大量数据。除了通常的电子表格外,处理如此大量的数据还需要高级解决方案来对其进行管理。随着数据集数量的增加,使用电子表格变得站不住脚了。处理大型数据集的最佳解决方案是SQL。SQL具有管理此类数据集的能力。
使用SQL,在处理关系数据库中的数据池时,你不必担心。它可以交流,查询数据并提供有用的见解。
5. 通往数据科学工作的门户
对于大多数数据科学工作,SQL的熟练程度高于其他编程语言。数据科学涉及处理数据库中的大型数据集,它将需要SQL专业知识才能解决项目中的问题。就数据科学而言,SQL编程非常有市场价值。对于每个数据科学家来说,存储,更新,访问控制和操作数据集的能力都是一项伟大的技能。
此外,SQL与MySQL,Microsoft SQL Server,Oracle数据库,dBase等许多数据库管理系统集成在一起,从而可以为项目动态构建SQL语句。这种集成还可以在系统之间进行切换。SQL在大多数行业中都使用过,例如计算机软件,医疗保健,制造业,运输业,银行业等。简而言之,SQL可以保留并且掌握它对于有抱负的数据科学家来说将是一个优势。
归纳一下,不同技术有其各自特点,不存在谁代替谁的问题。传统关系型数据库有其自身鲜明特点,在某些场合依然是不二选择。而作为其主要交互语言,SQL必然长期存在发展下去。
SQL入门经典
看到这,你应该开始相信SQL确实有排在技术需求榜第一的实力了吧~不过,从很多SQL入门者遇到的问题来看,最大的问题不是 SQL 语法,而是对 SQL 原理的不熟悉。
很多初学者,往往被 SQL 能做什么,为什么会有 SQL 这门语言给迷惑到了。然而,学 SQL 和学英语一样,为什么你每次从 abandon 开始学,不到 10 页就学不下去了?
原因在于学习模式太过枯燥。假如我告诉你,听听英文音乐,看看英语电影就能轻松学好英语,是不是觉得有趣多了?同理,通过大量的范例,直观地了解如何使用SQL如何对数据进行处理,效果自然事半功倍。
这里推荐一本书,来自Ryan Stephens大神的《SQL入门经典》,Ryan在IT领域有20多年的研究和咨询经历,是数据管理方面的专家,擅长SQL和Oracle等;本书跟随20多年以来SQL标准以及这些标准在关键数据库系统中的应用更新,如今已经来到第6版。
SQL入门经典(第6版)
作者:Ryan Stephens
译者: 郝记生 ,王士喜
内容简介:
本书详细介绍了SQL语言的基本语法、基本概念,说明了各种SQL实现与ANSI标准之间的差别。书中包含了大量的范例,直观地说明了如何使用SQL对数据进行处理。每章后面还有针对性很强的测验与练习,能够帮助读者更好地理解和掌握学习的内容。在最后的附录里还有关于安装MySQL的详细介绍、书中用到的关键SQL语句、测验和练习的答案。本书的内容层次清晰,针对性强,非常适合初学者作为入门教材。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com