sql时间函数_SQL语言简介:简单示例、最佳实践及潜藏陷阱

SQL (Structured Query Language结构化查询语言) 出现至今已经超过半个世纪,而 且它并非日渐式微。在 传统的关系数据库和较新的NoSQL数据库技术实现中,SQL都很流行;此外,SQL也被广泛用于数据分析,大数据处理,与其他编程语言一起构造应用等。

这是一种功能强大但简单的语言。 文中主要分享并阐述:

  • 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:

4f11aac85fdf04e1faa6bf54fb13bd3b.png

在深入研究SQL语言之前,这是在数据库外部使用SQL的示例——Python的数据分析类库:

292a1e23417dbfab6f601dc8a6b6d968.png

该示例生动说明了SQL语言在最新最流行的技术中应用还很活跃。

让我们深入探究一下SQL语言的强大功能。

SQL函数示例

SQL语言一大强势功能在于它的函数的功能。 这是SQL支持的三种类型函数:

113723d1ae2d88930152324aa2efaac6.png

我们建议您浏览查询引擎的功能文档以了解各函数的详细功能。

推荐的SQL编码约定 (关于命名及其他)

为了使用SQL语句的强大功能,我们强烈建议您依照编码约定来编写你的查询。 这不仅会方便您编写、改善SQL语句可阅读性,并且能够大大增进团队合作的效率。 以下清单列举了一些比较重要的事项:

5c1d3233798f6821d851ed21f1d7c184.png

SQL查询样例:好的和糟糕的风格

为了展示编码约定的重要性,请对比以下这些好的例子和糟糕的编码。

代码段4:糟糕的例子

70b9f7be7ee4bc50fce1a777b700a965.png

5c7ffe8ffb22a28d7164611c20e8d4ad.png

代码段5:良好的SQL编码风格

c0cd22079bb9f942c6f8a5bf42b9b670.png

推荐个不错的在线SQL格式化工具供您使用:https://sqlformat.org/

SQL语言疑难解答——错误和陷阱

与任何其他语言一样,SQL也有其自身的陷阱。您应该注意这些陷阱以节省开发时间,同时避免应用程序出现错误。

导致SQL错误的首要原因——空值

代码片段6:关于NULL的查询及结果

30eba9d12d158d24d537857059edd7f9.png

为解决此问题,只要潜在返回空值的危险,就应该使用coalesce 语句:

代码片段7:在JOIN联合查询情况下克服空值带来的影响

efc8970871e5103192613ed930789efd.png

没有正确使用索引和分区

我们花费大量时间通过添加索引和声明分区来构建数据库架构。 但是,止于此步,我们并不能保证获得想要的性能,还必须确保数据库引擎使用它们。

例如,假设我们在first_name列上建立了索引,考量以下2个查询:

0650dde31ac8a20c272d65d5c26d0fa0.png

不同的数据库实现,关于索引和分区功能的细节可能不尽相同,但是必须利用索引和分区优化查询这个概念在任何SQL实现中普遍适用。

如何确保索引和分区在查询中被使用到?可以通过分析查询的执行计划来实现。 在某些SQL实现中,可以使用EXPLAIN关键字。 例如在Oracle中,操作命令是EXPLAIN PLAN。

SQL语句分析功能陷阱——评估顺序

如果您要使用SQL的分析功能,下面我们说明的一点很重要,因为对评估顺序的误解可能会导致结果错误。 例如:

代码片段8:分析函数与过滤器的结合运用

6002a93ce8e59b977ab36faa81e9cb4e.png

上述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注入攻击的侵害。

ecd52a9f39ef4b874ad092bb6a8f3428.png

欲了解更多Imperva相关详情,敬请关注官方微信&网站 www.imperva.com 或 ? China-Channel@imperva.com获取资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值