如何编写更好的SQL查询:终极指南-第一部分

结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的。对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的。这个教程将会提供给你一些步骤,来评估你的查询语句。

  • 首先,应该了解学习SQL对于数据挖掘分析这个工作的重要性;

  • 接下来,应该学习SQL查询语句的处理和执行过程以便可以更好的了解到,编写高质量的查询有多重要。具体说来就是,应该了解查询语句是如何被解析、重写、优化和最终评估的;

  • 掌握了上面一点之后,你不仅需要重温初学者在编写查询语句时,所使用的查询反向模型,而且还需要了解有关可能发生错误的替代方案和解决方案。同时还应该了解更多查询工作中的基于集合的程序方法。

  • 在性能方面也需要关注反向模型,除了手动提高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也很容易学习。学习曲线很平缓,编写SQ查询几乎不花费时间。

  • SQL遵循“学习一次,随时随地可用”的原则,所以花费时间学习SQL很划算!

  • SQL是对编程语言的一种极好的补充;在某些情况下,编写查询甚至比编写代码更为优先!

  • ...

 

SQL处理和查询执行

为了提高SQL查询的性能,首先需要知道,运行查询时,内部会发生什么。

以下时查询执行的过程:

  • 首先,将查询解析成“解析树”; 分析查询是否满足语法和语义要求。解析器将会创建一个输入查询的内部表示,然后将此输出传递给重写引擎。

  • 然后,优化器的任务是为给定的查询,寻找最佳执行或查询计划。执行计划准确地定义了每个操作所使用的算法,以及如何协调操作的执行。

  • 最后,为了找到最佳的执行计划,优化器会列举所有可能的执行计划,并确定每个计划的质量或成本,以便获取有关当前数据库状态的信息,最后选择最佳的执行计划。由于查询优化器可能不完善,因此数据库用户和管理员有时需要手动检查并调整优化器生成的计划,以便获得更好的性能。

现在已经清楚了整个查询执行的过程。

正如前面了解到的,计划的成本质量起着重要的作用。更具体地说,评估计划所需的磁盘I / O数量,计划的CPU花销以及数据库客户端的整体响应时间和总执行时间等因素至关重要。这就是时间复杂性的概念。后面还将继续了解。

接下来,执行所选择的查询计划,由系统的执行引擎进行评估,并返回查询结果。

 

编写SQL查询

需要进一步说明的是,垃圾回收原则(GIGO)原本就是表达在查询处理和执行之中:制定查询的人,同时也决定着SQL查询的性能。

这意味着在编写查询,有些事情可以同步去做。就像文章开始时介绍的,编写查询需要遵循两个标准:首先,编写的查询需要满足一定的标准,其次还应该应对查询中可以出现的性能问题。

总的来说,有四个分句和关键字作为切入点,方便新手考虑性能问题:

  • WHERE 分句

  • INNER JOIN 和 LEFT JOIN 关键字

  • HAVING 分句

虽然这种做法比较初级,但对于一个初学者来说,这些方法却是一个很好的指引。这些地方也是你刚开始编写时,容易发生错误的地方,并且这些错误也很难发现。

同时,要想提升性能,使其变得有意义,就不能脱离上下文:在考虑SQL性能时,不能武断的认为上面的分句和关键字不好。使用WHERE 或 HAVING的分句也可能是很好的查询语句。

通过下面的章节来来进一步了解编写查询时反向模型和代替方法,并将这些提示和技巧作为指导。如何重写查询和是否需要重写查询取决于数据量,以及数据库和执行查询所需的次数等。这完全取决于你的查询目标,事先掌握一些有关数据的知识是非常重要的!

1. 仅检索你需要的数据

在编写SQL查询时,并不是数据越多越好。因此在使用SELECT 语句、DISTINCT分句和LIKE操作符时,需要谨慎。

SELECT声明

在编写完查询语句之后,首先需要做的事情就是检查select语句是否简洁。你的目标应该是删除不必要的select字段。以便只取到符合你查询目的的数据。

如果还有相关使用exists的子查询,那么就应该在select语句中使用常量,而不是选择实际列的值。当检查实体时,这是特别方便的。

请记住,相关子查询是使用外部查询中的值的子查询,并且在这种情况下,NULL是可以作为“常量”的,这点确实令人困惑!

通过以下示例,可以了解使用常量的含义:

SELECT driverslicensenr, nameFROM DriversWHERE EXISTS (SELECT '1' FROM Fines              WHERE fines.driverslicensenr = drivers.driverslicensenr);

提示:我们很容易发现,使用相关子查询并不总是一个好主意,所以可以考虑通过以下方式避免使用相关子查询,例如使用 INNER JOIN重写:

SELECT driverslicensenr, nameFROM driversINNER JOIN fines ON fines.driverslicensenr = drivers.driverslicensenr;

DISTINCT分句

SELECT DISTINCT 语句用于返回不同的值。 DISTINCT 是一个分句,能不用尽量不用,因为如果将DISTINCT添加到查询语句中,会导致执行时间的增加 。

LIKE运算符

在查询中使用LIKE运算符时,如果模式是以% 或_开始,则不会使用索引。它将阻止数据库使用索引(如果存在的话)。当然,从另一个角度来看,你也可以认为,这种类型的查询可能会放宽条件,会检索到许多不一定满足查询目标的记录。

另外,你对存储在数据中数据的了解,可以帮助你制定一个模式,使用该模式可以对所有数据进行正确的过滤,以便查找到你最想要的数据。

 

2. 缩小查询结果 

如果无法避免使用 SELECT语句时,可以考虑通过其它方式缩小查询结果。例如,使用LIMIT 分句和数据类型转换的方法。

TOPLIMITROWNUM分句

可以在查询中添加LIMIT或TOP分句,来设置查询结果的最大行数。下面是一个示例:

SELECT TOP 3 *FROM Drivers;

请注意,你可以进一步指定PERCENT。

例如,如果你想更改查询的第一行  SELECT TOP 50 PERCENT *。

SELECT driverslicensenr, nameFROM Drivers
LIMIT 2;

此外,你还可以添加ROWNUM 分句,相应于在查询中使用的LIMIT:

SELECT *FROM DriversWHERE driverslicensenr = 123456 AND ROWNUM <= 3;

 

数据类型转换

应该使用最小的数据类型,因为小的数据类型效率更高。

当查询中需要进行数据类型转化,会增加执行时间,所以尽可能的避免数据类型转换的发生;

如果不能避免的话,需要谨慎的定义数据类型的转换。

 

本文是系列教程的第一篇,后续还有更多《如何编写更好的SQL查询》的文章分享给大家,敬请期待。

原文链接:http://www.kdnuggets.com/2017/08/write-better-sql-queries-definitive-guide-part-1.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言(十六)之三数值求和

输入A、B、C三个数&#xff0c;如果存在一个数为0&#xff0c;则全部清零&#xff0c;否则求和输出 程序运行&#xff1a; 代码&#xff1a; datas segmentA dw 1B dw 0D dw 3S dw 0a_string db 0ffh, 0 ,100 dup(?)b_string db 0ffh, 0 ,100 dup(?…

回忆四班的那些事儿~

10“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”今天&#xff0c;谈谈四班的那些事儿吧~对于四班&#xff0c;回忆满满&#xff0c;根本忘却不了。和别的班一样&#xff0c;一个班内总有那么几个调皮捣蛋的孩子&#xff0c;只是四班…

C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码

本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? 也只讲一个,关于Xamarin.Forms针对各个平台如何进行可定制化的布局操作. 也就是针对某个平台…

汇编语言(十七)之判断三个数是否相等

输入三个数&#xff0c;计算相等数的个数 程序运行&#xff1a; 代码&#xff1a; datas segmenta db 0ffh, 0 ,100 dup(?)b db 0ffh, 0 ,100 dup(?)d db 0ffh, 0 ,100 dup(?) ARRAY dw 1,2,2inputA db input a$inputB db 0dh,0ah,i…

你想象中的实习是什么样的?

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;????雄雄的小课堂????。”今天感谢学长小李同学投稿的文章&#xff0c;在校外实习一年&#xff0c;可谓收获满满&#xff0c;下面就是李心焱同学的实习感悟&#xff0c;请欣赏&#xff01;实习…

汇编语言(十八)之求两个数的最大公约数

输入两个数&#xff0c;使用辗转相除法求最大公约数 程序运行&#xff1a; 代码&#xff1a; datas segmentM_max_len db 0ffhM_len db 0M_string db 100 dup(?)M dw 0 N_max_len db 0ffhN_len db 0N_string db…

Orleans—一些概念

这个文章聊一聊Orleans的概念.以下文章大部分翻译自官方教程,还有一些结合实际的应用经验,并对以前文章留下的坑进行填平.如果有哪个坑没有填,还请告诉我. Grain的生命周期: 一个Grain在逻辑上是永远存在的,并在逻辑上拥有一个不变的标识.程序的代码永远不会去创造或者销毁一个…

使用jdbc连接mysql数据库代码示例

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”最近&#xff0c;正好在看jdbc&#xff0c;于是就整理了一份增删改查的案例&#xff0c;记录记录&#xff0c;以备后用&#xff01;&#xff01;java编辑器&#xff1a;myeclipse![10]…

POJ1958-Strange Towers of Hanoi【递推】

正题 题目链接&#xff1a;http://poj.org/problem?id1958 大意 有4根柱子的汉诺塔&#xff0c;有n个盘&#xff0c;求移动次数 解题思路 首先我们定义只有三根柱子时有n个盘的话移动次数是dndn&#xff0c;然后dndn−1∗21dndn−1∗21定义有四根柱子时有n个盘移动次数为fn…

[上海站] 微软Azure AspNetCore微服务实战

活动介绍 2017官方发布了EshopOnContainers的微服务项目&#xff0c;其结合了.Net Core、Azure、Docker等众多优秀的技术&#xff0c;为开发者们抛砖引玉&#xff0c;走进微服务的大门。 本次分享&#xff0c;我们将结合实际毫无保留的从代码上解析微服务架构&#xff0c;以实…

汇编语言(十九)之删除数组中的元素

在数组中删除所有-1元素&#xff0c;然后输出删除后的长度 程序运行&#xff1a; 代码&#xff1a; datas segmentLink dw 15 ,1,2,3,4,5,6,-9,-1,3,4,5,3,-1,-2,3ouput db Link length:$ datas endsstacks segment stackdb 100h dup(?)stacks endscodes segmentassume cs…

Linux+.NetCore+Nginx搭建集群

本篇和大家分享的是LinuxNetCoreNginx搭建负载集群&#xff0c;对于netcore2.0发布后&#xff0c;我一直在看官网的文档并学习&#xff0c;关注有哪些新增的东西&#xff0c;我&#xff0c;一个从1.0到2.0的跟随者这里只总结一句话&#xff1a;2.0版本&#xff0c;api更多&…

老师 累了,我们 泪了!

“以下文章来自一位不愿意透露姓名的同学所写&#xff1a;”呀呼 “老穆头” 没错是我们的穆老师悄悄往我们班探了探头瞧了瞧我们&#xff0c; 我们依旧对他那么热情&#xff0c;紧随其后老佟往门口一站 教室里立马严肃起来 她是我们级部出了名没人敢惹的老佟&#xff08;佟老…

汇编语言(二十)之分类统计字符个数

输入一串字符串&#xff0c;分别统计英文字符&#xff0c;数字字符和其他字符的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentline_max_length db 0ffhline db 0, 100h dup(?)letter_count dw 0digit_count dw 0other_count …

.NET Core+Selenium+Github+Travis CI =amp;gt; SiteHistory

前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory&#xff0c;感觉挺好(每次都这样 frameborder"0" scrolling"no" style"border-width: initial; border-style: none; width: 25px; height: 26px;&qu…

汇编语言(二十一)之数值交换与自增

输入两个数&#xff0c;如果第一个数为偶数第二个数为奇数&#xff0c;互换位置&#xff1b;如果两个数都是奇数&#xff0c;则两个数都加一 程序运行&#xff1a; 代码&#xff1a; datas segmentA dw 0 B dw 0a_string db 0ffh, 0 ,100h dup(?)b_string …

2021 程序媛跳槽记:学习计划篇(已收获字节等offer)

今天推荐的这篇文章是一位互联网程序媛写的跳槽日记。她本硕毕业于985计算机专业&#xff0c;先后就职于央企和BAT。这一篇就是她跳槽到互联网的学习笔记&#xff0c;希望能对大家有所帮助&#xff0c;感兴趣的读者也可以关注公众号&#xff0c;听听更多程序媛的故事~ 坦白说&a…

Orleans的集群构建

听闻一周前,微软公布了.net core2.0,以及各种各样的其他core2.0.大家都很兴奋.微妈的诚意真是满满的.这次开源势头让我感觉到了微妈的技术实力之雄厚.我在这里祝福C#越来越好.细心的人似乎发现Orleans在github中是和net core分在一起的.Orleans的2.0何时发布呀… 现在我们面对…

汇编语言(二十二)之统计减去奇数的个数

输入一个正数&#xff0c;该数减去递增奇数&#xff08;从1开始&#xff09;直至小于等于零为止&#xff0c;计算该数减去奇数的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentNUM dw 17ANS dw 0NUM_string db 0ffh, 0 ,100 dup(?)inputNUM …

.NET Core 在程序集中集成Razor视图

前言 有时候&#xff0c;我们在开发一个程序集供其他项目引用的时候&#xff0c;可能需要对外输出一些HTML的结构数据。 还有一些情况我们可能开发的是一个中间件&#xff0c;这个中间件需要提供一些界面来对外展示数据或者是内部的一些程序的运行信息&#xff0c;这个时候我…