这是一种功能强大但简单的语言。 文中主要分享并阐述:
SQL强大功能以及我们为什么使用它
使用中的常见陷阱以及最佳实践
什么是SQL语言?为什么要使用它
SQL语言最初是由IBM在1970年代初期开发的,在随后的十年中被甲骨文(Oracle) 公司所采用,并且从那时开始一直被用于关系数据库中。
随着数据量的爆炸式增长,新的数据库和技术应运而生。 其中重要的一大类就是大数据处理,用于分析传统的数据库应用无法处理的,过于复杂的数据集。在大数据中,经常会使用并非基于关系数据库的模型的NoSQL数据库来存放数据。 有趣的是,这类数据库通常会宣称自己“不仅SQL”,以强调它们也可以同时支持类似SQL语句的查询语言。 支持SQL查询语句的非关系数据库和框架列举如下:
开源项目Apache Spark 提供的分析引擎
Google 提供的Big Query服务 ——托管的数仓分析服务
Facebook推广的Presto框架 以及 AWS推出的 Athena服务
Elastic search
Python语言数据分析库 (pandasql)
尽管业务需求大相径庭,但SQL语言在不同的数据库业务应用场景:OLTP (事务密集处理) 和OLAP (分析密集处理) 中都得到了广泛使用
代码片段1:
在深入研究SQL语言之前,这是在数据库外部使用SQL的示例——Python的数据分析类库:
该示例生动说明了SQL语言在最新最流行的技术中应用还很活跃。
让我们深入探究一下SQL语言的强大功能。
SQL函数示例
SQL语言一大强势功能在于它的函数的功能。 这是SQL支持的三种类型函数:
我们建议您浏览查询引擎的功能文档以了解各函数的详细功能。
推荐的SQL编码约定 (关于命名及其他)
为了使用SQL语句的强大功能,我们强烈建议您依照编码约定来编写你的查询。 这不仅会方便您编写、改善SQL语句可阅读性,并且能够大大增进团队合作的效率。 以下清单列举了一些比较重要的事项:
SQL查询样例:好的和糟糕的风格
为了展示编码约定的重要性,请对比以下这些好的例子和糟糕的编码。
代码段4:糟糕的例子
代码段5:良好的SQL编码风格
推荐个不错的在线SQL格式化工具供您使用:https://sqlformat.org/
SQL语言疑难解答——错误和陷阱
与任何其他语言一样,SQL也有其自身的陷阱。您应该注意这些陷阱以节省开发时间,同时避免应用程序出现错误。
导致SQL错误的首要原因——空值
代码片段6:关于NULL的查询及结果
为解决此问题,只要潜在返回空值的危险,就应该使用coalesce 语句:
代码片段7:在JOIN联合查询情况下克服空值带来的影响
没有正确使用索引和分区
我们花费大量时间通过添加索引和声明分区来构建数据库架构。 但是,止于此步,我们并不能保证获得想要的性能,还必须确保数据库引擎使用它们。
例如,假设我们在first_name列上建立了索引,考量以下2个查询:
不同的数据库实现,关于索引和分区功能的细节可能不尽相同,但是必须利用索引和分区优化查询这个概念在任何SQL实现中普遍适用。
如何确保索引和分区在查询中被使用到?可以通过分析查询的执行计划来实现。 在某些SQL实现中,可以使用EXPLAIN关键字。 例如在Oracle中,操作命令是EXPLAIN PLAN。
SQL语句分析功能陷阱——评估顺序
如果您要使用SQL的分析功能,下面我们说明的一点很重要,因为对评估顺序的误解可能会导致结果错误。 例如:
代码片段8:分析函数与过滤器的结合运用
上述SQL语句执行后,我们将查询到部门中姓氏以A开头的雇员人数,而不是预期的部门中所有满足条件雇员的详情。 请记住,(除了ORDER BY 以外) 所有分析类的函数都在查询的最后才会被执行。
SQL语句的标准化
日期和时间的语法格式,空字符NULL的定义,字符串连接功能,数据比较中是否大小写敏感——这些细节实现,在SQL相关供应商而异,正是这细节的差异,使得在供应商间迁移SQL相关的应用程序变得困难。
我们推荐尝试仅采用标准的表达式编写SQL语句、开发相关应用。例如,在判断空值的时候使用COALESCE而不是ISNULL (SQL Server的专有功能函数) 或NVL (用于Oracle数据库的函数)。
防止SQL注入攻击
Web应用程序中的一个众所周知的安全隐患是SQL注入攻击——它是一种代码注入技术,通过将恶意语句插入SQL查询字段中执行来攻击应用程序。 此类攻击通常用于窃取数据,更改数据记录,或者更改受攻击数据库中的权限设置。
防止SQL注入攻击的努力,可以早在开发过程中进行,随后推荐使用代码扫描工具以及Web应用程序防火墙来保护您的应用程序。
总结
SQL语言本身是个很棒的工具。基于SQL的语言进行工作,而不是其他查询语言或API攻击。 但是,只有需要正确使用SQL,就能使工作更轻松。 首先正确构建查询模式,然后需要依照编码约定,并且妥善配置其他选项,例如WITH关键字和窗口函数。
不要忘记文中列举的已知陷阱。并且,如果您正在利用SQL开发应用程序,请时刻留心安全措施,谨防应用遭受SQL注入攻击的侵害。
欲了解更多Imperva相关详情,敬请关注官方微信&网站 www.imperva.com 或 ? China-Channel@imperva.com获取资源