一文告诉你Sql的执行顺序是怎样的
<p>学过 Sql,或了解过 Sql 的人,应该都会写下面这行代码:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_265056">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">t</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
上面代码表示查询 t 表中的所有信息,是 Sql 查询中最基础,最简单的一行代码,你可以把它理解成是其他编程语言中的Hello World。</p>
<p>
select *只是你迈入 Sql 大门的第一步,在真实工作中,肯定不止这么简单的。我们来看一个例子。</p>
<p>
现在有下面一个表 t ,存储了每个商品类别的成交明细,我们需要通过下面这张表获取订单量大于10对应的类别,并从中取出订单量前3的商品类别,会有一些测试的订单(catid=c666的为测试),我们需要过滤掉。</p>
<p>
</p>
<table>
<thead><tr>
<th>
catid</th>
<th>
orderid</th>
</tr></thead>
<tbody>
<tr>
<td>
c1</td>
<td>
1</td>
</tr>
<tr>
<td>
c1</td>
<td>
2</td>
</tr>
<tr>
<td>
c1</td>
<td>
3</td>
</tr>
<tr>
<td>
c2</td>
<td>
4</td>
</tr>
<tr>
<td>
c2</td>
<td>
5</td>
</tr>
<tr>
<td>
c3</td>
<td>
6</td>
</tr>
<tr>
<td>
…</td>
<td>
…</td>
</tr>
<tr>
<td>
c100</td>
<td>
10000</td>
</tr>
</tbody>
</table>
<p>
</p>
<p>
要做上面的需求,我们的 Sql 可以这么写:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_828214">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code>
</div>
<div class="line number2 index1 alt1">
<code class="sql spaces"> </code><code class="sql plain">catid,</code>
</div>
<div class="line number3 index2 alt2">
<code class="sql spaces"> </code><code class="sql color2">count</code><code class="sql plain">(orderid) </code><code class="sql keyword">as</code> <code class="sql plain">sales</code>
</div>
<div class="line number4 index3 alt1">
<code class="sql keyword">from</code>
</div>
<div class="line number5 index4 alt2">
<code class="sql spaces"> </code><code class="sql plain">t</code>
</div>
<div class="line number6 index5 alt1">
<code class="sql keyword">where</code>
</div>
<div class="line number7 index6 alt2">
<code class="sql spaces"> </code><code class="sql plain">catid <> </code><code class="sql string">"c666"</code>
</div>
<div class="line number8 index7 alt1">
<code class="sql keyword">group</code> <code class="sql keyword">by</code>
</div>
<div class="line number9 index8 alt2">
<code class="sql spaces"> </code><code class="sql plain">catid</code>
</div>
<div class="line number10 index9 alt1">
<code class="sql keyword">having</code>
</div>
<div class="line number11 index10 alt2">
<code class="sql spaces"> </code><code class="sql color2">count</code><code class="sql plain">(orderid) > 10</code>
</div>
<div class="line number12 index11 alt1">
<code class="sql keyword">order</code> <code class="sql keyword">by</code>
</div>
<div class="line number13 index12 alt2">
<code class="sql spaces"> </code><code class="sql color2">count</code><code class="sql plain">(orderid) </code><code class="sql keyword">desc</code>
</div>
<div class="line number14 index13 alt1">
<code class="sql plain">limit 3</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
上面的 Sql 代码中涉及到<code>select、from、where、group by、having、order by、limit</code>这7个关键词,基本上包括了 Sql 中所有的查询关键词,上面的顺序是这7个关键词的语法顺序,也就是你在写代码的时候,应该按照这个顺序写,那这7个关键词的执行顺序是什么样的呢?也就是先执行哪个再执行哪个?</p>
<p>
可以肯定的是,肯定不是从上至下执行,如果是这样子的话,就没有写这篇文章的必要啦。</p>
<p>
我一直坚持的一个态度就是,<span>计算机在做事的时候和人没什么两样,基本逻辑和流程都一样,毕竟计算机也是人设计出来的。</span>那既然这样,我们就来看看,如果是我们自己手动去做上面那个需求的时候,我们会怎么去做。</p>
<p>
首先我是不是需要知道我要从哪个表去获取我想要的,也就是from;现在我知道从哪个表获取了,可是并不是这个表里面所有的信息都是我需要的,我需要把一些不需要的去掉(比如测试订单),或是把一些我需要的筛选出来,这就是where;现在我把我需要的订单明细筛选出来,可是我想要每个品类的订单量,这个时候是不是需要做一个分组聚合,也就是group by;分组聚合后的结果也并不是我们全部都要,我们只要大于10的品类,所以需要把大于10的筛选出来,非大于10的品类过滤掉,这就是having;现在我们想要的大部分信息都已经出来了,我们就可以用select把他们查询出来了;因为我们最后需要取前三的品类,所以我们需要把查询出来的结果进行一个降序排列,即order by;最后一步就是只把前三显示出来,做一个限制就行,也就是limit。</p>
<p>
<strong>以上就是 Sql 语句的一个基本执行顺序,总结一下就是:</strong></p>
<blockquote>
<p>
from-where-groupby-having-select-orderby-limit</p>
</blockquote>
<p>
到此这篇关于Sql的执行顺序的文章就介绍到这了,更多相关Sql的执行顺序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!</p>
<p>
原文链接:https://mp.weixin.qq.com/s/jAh3TDDLVxQeFkbRnNQt-Q</p>
頁:
[1]