结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的。对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的。这个教程将会提供给你一些步骤,来评估你的查询语句。
寻找数据挖掘分析行业的工作,SQL是最需要的技能之一,不论是申请数据分析工作、数据引擎工作、数据挖掘分析或者其它工作。在O'Reilly发布的《2016数据科学从业者薪酬报告》中,有70%的受访者证实了这一点,表示他们需要在专业环境中使用SQL。此外,本次调查中,SQL远胜于R(57%)和Python(54%)等编程语言。所以在数据挖掘分析领域,SQL是必备技能。
我们分析一下SQL从1970s早期开发出,到现在还经久不衰的原因:
一、公司基本都将数据存储在关系数据库管理系统(RDBMS)或关系数据流管理系统(RDSMS)中,所以需要使用SQL来实现访问。SQL是通用的数据语言,可以使用SQL和几乎其它任何数据库进行交互,甚至可以在本地建立自己的数据库!
二、只有少量的SQL实现没有遵循标准,在供应商之间不兼容。因此,了解SQL标准是在数据挖掘分析行业立足的必要要求。
三、最重要的是SQL也被更新的技术所接受,例如Hive或者Spark SQL。Hive是一个用于查询和管理大型数据集的类似于SQL的查询语言界面;Spark SQL可用于执行SQL查询。
简而言之,以下就是为什么你应该学习这种查询语言:
为了提高SQL查询的性能,首先需要知道,运行查询时,内部会发生什么。
以下时查询执行的过程:
现在已经清楚了整个查询执行的过程。
正如前面了解到的,计划的成本质量起着重要的作用。更具体地说,评估计划所需的磁盘I / O数量,计划的CPU花销以及数据库客户端的整体响应时间和总执行时间等因素至关重要。这就是时间复杂性的概念。后面还将继续了解。
接下来,执行所选择的查询计划,由系统的执行引擎进行评估,并返回查询结果。
需要进一步说明的是,垃圾回收原则(GIGO)原本就是表达在查询处理和执行之中:制定查询的人,同时也决定着SQL查询的性能。
这意味着在编写查询,有些事情可以同步去做。就像文章开始时介绍的,编写查询需要遵循两个标准:首先,编写的查询需要满足一定的标准,其次还应该应对查询中可以出现的性能问题。
总的来说,有四个分句和关键字作为切入点,方便新手考虑性能问题:
虽然这种做法比较初级,但对于一个初学者来说,这些方法却是一个很好的指引。这些地方也是你刚开始编写时,容易发生错误的地方,并且这些错误也很难发现。
同时,要想提升性能,使其变得有意义,就不能脱离上下文:在考虑SQL性能时,不能武断的认为上面的分句和关键字不好。使用WHERE 或 HAVING的分句也可能是很好的查询语句。
通过下面的章节来来进一步了解编写查询时反向模型和代替方法,并将这些提示和技巧作为指导。如何重写查询和是否需要重写查询取决于数据量,以及数据库和执行查询所需的次数等。这完全取决于你的查询目标,事先掌握一些有关数据的知识是非常重要的!
在编写SQL查询时,并不是数据越多越好。因此在使用SELECT 语句、DISTINCT分句和LIKEcaozuofu.html" target="_blank">操作符时,需要谨慎。
SELECT声明
在编写完查询语句之后,首先需要做的事情就是检查select语句是否简洁。你的目标应该是删除不必要的select字段。以便只取到符合你查询目的的数据。
如果还有相关使用exists的子查询,那么就应该在select语句中使用常量,而不是选择实际列的值。当检查实体时,这是特别方便的。
请记住,相关子查询是使用外部查询中的值的子查询,并且在这种情况下,NULL是可以作为“常量”的,这点确实令人困惑!
通过以下示例,可以了解使用常量的含义:
SELECT driverslicensenr, name FROM Drivers WHERE EXISTS (SELECT '1' FROM Fines WHERE fines.driverslicensenr = drivers.driverslicensenr);
提示:我们很容易发现,使用相关子查询并不总是一个好主意,所以可以考虑通过以下方式避免使用相关子查询,例如使用 INNER JOIN重写:
SELECT driverslicensenr, name FROM drivers INNER JOIN fines ON fines.driverslicensenr = drivers.driverslicensenr;
DISTINCT分句
SELECT DISTINCT 语句用于返回不同的值。 DISTINCT 是一个分句,能不用尽量不用,因为如果将DISTINCT添加到查询语句中,会导致执行时间的增加 。
LIKE运算符
在查询中使用LIKE运算符时,如果模式是以% 或_开始,则不会使用索引。它将阻止数据库使用索引(如果存在的话)。当然,从另一个角度来看,你也可以认为,这种类型的查询可能会放宽条件,会检索到许多不一定满足查询目标的记录。
另外,你对存储在数据中数据的了解,可以帮助你制定一个模式,使用该模式可以对所有数据进行正确的过滤,以便查找到你最想要的数据。
如果无法避免使用 SELECT语句时,可以考虑通过其它方式缩小查询结果。例如,使用LIMIT 分句和数据类型转换的方法。
TOP,LIMIT和ROWNUM分句
可以在查询中添加LIMIT或TOP分句,来设置查询结果的最大行数。下面是一个示例:
SELECT TOP 3 * FROM Drivers;
请注意,你可以进一步指定PERCENT。
例如,如果你想更改查询的第一行 SELECT TOP 50 PERCENT *。
SELECT driverslicensenr, name FROM Drivers LIMIT 2;
此外,你还可以添加ROWNUM 分句,相应于在查询中使用的LIMIT:
SELECT * FROM Drivers WHERE driverslicensenr = 123456 AND ROWNUM <= 3;
应该使用最小的数据类型,因为小的数据类型效率更高。
当查询中需要进行数据类型转化,会增加执行时间,所以尽可能的避免数据类型转换的发生;
如果不能避免的话,需要谨慎的定义数据类型的转换。
本文是系列教程的第一篇,后续还有更多《如何编写更好的SQL查询》的文章分享给大家,敬请期待。
原文链接:http://www.kdnuggets.com/2017/08/write-better-sql-queries-definitive-guide-part-1.html
转载请注明出自:葡萄城控件
相关阅读:
【报表福利大放送】100余套报表模板免费下载
一句SQL完成动态分级查询
迁移 SQL Server 数据库到 Azure SQL 实战