柳燕 發表於 2023-8-18 00:00:00

SQL中一些小巧但常用的关键字小结

<p>
        <span><strong>前言</strong></span></p>
<p>
        前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建、查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效率的写出一些 SQL。</p>
<p>
        下面话不多说了,来一起看看详细的介绍吧</p>
<p>
        <span><strong>起别名</strong></span></p>
<p>
        在实际的项目中,有时候我们的表名、字段名过于复杂以致于我们的 SQL 写出来过长、过于复杂,这时候我们往往会通过起别名的方式将一些名字较长、较为复杂的字段或是表名简化。</p>
<p>
        我们可以使用别名(Alias)来对数据表或者列进行临时命名,既然是别名,也就是说并不会修改原表或列的原始名称,仅仅用于当前查询的简介化显示。</p>
<p>
        <strong>给表起别名:</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_675907">
                        <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>
                                                </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">person </code><code class="sql keyword">as</code> <code class="sql plain">p</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">where</code> <code class="sql plain">p.id = 1;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        一旦为表执行了别名,那么本次查询的子查询语句中都可以直接引用别名替代原表的引用。</p>
<p>
        <strong>给列起别名:</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_492582">
                        <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 keyword">name</code> <code class="sql keyword">as</code> <code class="sql plain">n,age </code><code class="sql keyword">as</code> <code class="sql plain">a </code><code class="sql keyword">from</code> <code class="sql plain">perosn;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        除了使用关键字 as 来给表或是列起别名外,还可以直接使用空格字符达到同样的效果,但是个人认为要么全部使用 as 进行别名,要么全部使用空格进行别名,不要交叉使用使得你的 SQL 复杂又难以看懂。</p>
<p>
        <span><strong>消除重复记录</strong></span></p>
<p>
        有时候,我们的数据库中会存在两条完全一样的数据,我们也叫做冗余数据,当然不希望在查询数据的时候查出来这么些冗余的重复数据,我们要把它们过滤掉。</p>
<p>
        LeetCode 上的一道简单题:</p>
<p>
        有一个courses 表 ,有: student (学生) 和 class (课程)。</p>
<p>
        请列出所有超过或等于5名学生的课。</p>
<p>
        例如,表:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_987454">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">---------+------------+</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">| student | class  |</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">---------+------------+</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">| A  | Math  |</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">| B  | English |</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql plain">| C  | Math  |</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql plain">| D  | Biology |</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql plain">| E  | Math  |</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql plain">| F  | Computer |</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql plain">| G  | Math  |</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql plain">| H  | Math  |</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql plain">| I  | Math  |</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">---------+------------+</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        应该输出:</p>
<blockquote>
        <p>
                +---------+<br>
                | class   |<br>
                +---------+<br>
                | Math    |<br>
                +---------+</p>
</blockquote>
<p>
        你可以花个一分钟思考一下,运用我们之前的基本功,应该是不难的。</p>
<p>
        显然是需要用到分组的,想要统计每门课有多少人选,就得按照学科进行分组,每个分组内就是该门学科选修的学生记录。</p>
<p>
        那么 SQL 语句也就信手拈来了:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_59496">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">class </code><code class="sql keyword">from</code> <code class="sql plain">courses</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">class</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">having</code> <code class="sql color2">count</code><code class="sql plain">(student) &gt;=5</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        但是你提交后在海量测试用例下,会返回给你解答错误的提示,不信你试试,问题出在哪?</p>
<p>
        问题就出现在冗余数据这个边界条件没有被考虑,如果 A 选了两次 Math,当我们对 Math 这个分组进行计数时就会多算一次选 Math 的人数,实际上这是不符合逻辑的,我们需要过滤掉那些重复选择的数据记录。</p>
<p>
        解决方案如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_61215">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">class </code><code class="sql keyword">from</code> <code class="sql plain">courses</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">group</code> <code class="sql keyword">by</code> <code class="sql plain">class</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">having</code> <code class="sql color2">count</code><code class="sql plain">(</code><code class="sql keyword">distinct</code> <code class="sql plain">student) &gt;=5</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        有些人可能看出来了,我们在 count 函数的列参数前添加了一个 distinct 关键字,它表示如果 student 列的值重复出现的话只计数一次。</p>
<p>
        当然,distinct 除了可以在聚合函数中使用外,也可以直接用在查询语句的列筛选阶段,例如:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_718225">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">//取出所有的学生,不允许重复名字的学生同时出现</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">select</code> <code class="sql keyword">distinct</code> <code class="sql keyword">name</code> <code class="sql keyword">from</code> <code class="sql plain">students</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>连接结果集</strong></span></p>
<p>
        UNION 运算符可以将一个或多个 SELECT 语句的结果连接组合成一个结果集,但要求两个或多个结果具有相同数量的列,列的数据类型相同,举个例子:</p>
<p>
        构建一个学生表:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_399161">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+------+----------+-------+</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">| id | </code><code class="sql keyword">name</code> <code class="sql plain">| uNo  | fees |</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+------+----------+-------+</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">| 1 | 张三 | 15263501 | 18000 |</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">| 2 | 李四 | 15263506 | 15960 |</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql plain">| 3 | 王二 | 15263512 | 2500 |</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+------+----------+-------+</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        学生表主要有学生的姓名,学号和学费。</p>
<p>
        构建一个教师表:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_115244">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+--------+------+--------+</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">| id | </code><code class="sql keyword">name</code> <code class="sql plain">| tNo | salary |</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+--------+------+--------+</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql plain">| 1 | 李老师 | 1001 | 10000 |</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql plain">| 2 | 杨老师 | 1002 | 15000 |</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql plain">| 3 | 曹老师 | 1030 | 5000 |</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql plain">+</code><code class="sql comments">----+--------+------+--------+</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        现在有一个需求,需要拿到全校所有人的姓名和编号,包括学生和老师。一般来说,我们两次 select 查询就好了,但是没法合并在一个结果集中显示,这是一个问题。</p>
<p>
        于是我们可以使用 union 来连接两个结果并在一张表中显示出来:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_140530">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql keyword">name</code><code class="sql plain">,uNo </code><code class="sql keyword">from</code> <code class="sql plain">students</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql keyword">union</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql keyword">name</code><code class="sql plain">,tNo </code><code class="sql keyword">from</code> <code class="sql plain">teacher</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        查询结果:</p>
<blockquote>
        <p>
                +--------+----------+<br>
                | name   | uNo      |<br>
                +--------+----------+<br>
                | 张三   | 15263501 |<br>
                | 李四   | 15263506 |<br>
                | 王二   | 15263512 |<br>
                | 李老师 | 1001     |<br>
                | 杨老师 | 1002     |<br>
                | 曹老师 | 1030     |<br>
                +--------+----------+</p>
</blockquote>
<p>
        看起来是不是直观了很多,除此之外的是,如果两个结果集中存在完全重复的数据记录,合并后的结果集中不会重复出现该数据记录。</p>
<p>
        当然了,如果你不需要在合并结果集的时候删除掉重复的数据行,你可以转而使用关键字 UNION ALL 替代 UNION。</p>
<p>
        <span><strong>TOP</strong></span></p>
<p>
        TOP 子句用于从一张数据表中取回前 N 个或者 X% 的记录,但是需要注意的是,没有一个数据库实现是支持 TOP 的,各自有各自的关键字作为替代,例如 MySQL 和 SQLserver 使用 LIMIT 关键字,Oracle 使用 ROWNUM 关键字。</p>
<p>
        例如:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_59341">
                        <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">students limit 2;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        MySQL 数据库取出前两条数据,等效的 Oracle 数据库写法:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_320122">
                        <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>
                                                </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">students</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql plain">rownum &lt;= 2</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        以上的一些关键字虽然逐个看起来很简单,但有时候可能会帮上你大忙的,不要忘记使用它们!。</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:https://www.cnblogs.com/yangming1996/p/10474628.html</p>
頁: [1]
查看完整版本: SQL中一些小巧但常用的关键字小结