暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据库技术-高级数据查询(一)

青年之学 2021-04-28
607

正文共:4360字

预计阅读时间:9分钟

前言


本章节内容主要介绍了一些扩展的和复杂的查询功能,需要具有一定的基础数据查询语句的知识。


目录

/CONTENT

01/一般数据查询功能拓展

        ▪SELECT 查询语法格式

        ▪使用TOP限制结果集

        ▪使用CASE函数

        ▪将查询结果保存到新表中

02/查询结果的并、交、差运算

        ▪并运算

        ▪交运算

        ▪差运算

03/相关子查询

       ▪使用子查询进行基于集合的测试

       ▪使用子查询进行比较测试

       ▪使用子查询进行存在性测试



一般数据查询功能拓展


SELECT 查询语法格式



SELECT语句是SQL语言中功能强大、使用灵活的语句之一, 它能够实现数据的选择投影连接运算,并且能够完成筛选字段的重命名分类汇总排序多数据源组合等具体操作。

SELECT语句的一般格式为:


    SELECT [ALL | DISTINCT | TOP n] <字段列表> [<表达式>AS<标识符>] --查询指定的列
    [INTO new_table] --将查询结果创建到新表
    FROM<表名1>[<表名2>]... --查询行所在的表
    [WHERE <条件表达式>] 指定返回行的搜索条件
    [GROUP BY <字段名> --指定查询结果的分组条件
    [HAVING<条件表达式> ]] --指定组或聚合函数的搜索条件
    [ORDER BY <字段名>[ASC | DESC]] --指定结果集的排序方式
    [COMPUTE expression] --在结果集的末尾生成汇总数据行

    该语句从指定的基本表中,创建一个由指定范围内、满足条件、按某字段分组、按某字段排序的指定字段你组成的新纪录集。


    使用TOP限制结果集



    当使用SELECT语句进行查询时,有时只希望列出结果集中的前几行数据,而不是全部数据;可以使用TOP谓词来限制输出的结果。


    使用TOP谓词的语法格式为: 

      TOP n [ percent ] [WITH TIES ]  其中 n为非负整数。

      参数含义:

      ①TOP n :取查询结果的前n行数据;

      ②TOP n percent :取查询结果的前n%行数据;

      WITH TIES :表示包括最后一行取值并列的结果。


      注意位置: TOP谓词写在SELECT单词的后边(如果有DISTINCT的话,则TOP写在DISTINCT的后边)、查询列表的前边。


      注意使用:在使用TOP谓词时,应该与ORDER BY子句起使用,这样的前几名才有意义。当使用WTTH TIES选项时,则要求必须使用ORDER BY子句。‍

      使用CASE函数



      可以在查询语句中使用CASE函数,以达到分情况显示不同类型的数据的目的。CASE函数是一种多分支表达式,它计算条件列表并返回多个可能的结果表达式中的一个。

      CASE函数分两种类型:简单CASEA函数搜索CASE函数


      简单CASE函数的语法格式如下:


        CASE  测试表达式
        WHEN 简单表达式1 THEN 结果表达式1
        WHEN 简单表达式2 THEN 结果表达式2
        WHEN 简单表达式n THEN 结果表达式n
        [ELSE结果表达式n+1]
        END

        简单CASE函数的执行过程:











        1.计算测试表达式 然后按从上到下的顺序对每个WHEN子句的简单表达式进行计算。

        2.如果某个简单表达式的值与测试表达式的值相匹配,则返回与第一个取值为True的WHEN对应的结果表达式的值。

        3.如果所有的简单表达式的值都不与测试表达式的值相匹配则当指定了ELSE子句时,将返回ELSE子句中指定的结果表达式的值若没有指定ELSE子句。则返回NULL值。‍












        搜索CASE函数的语法格式如下:


          CASE
          WHEN 布尔表达式1 THEN 结果表达式1
          WHEN 布尔表达式2 THEN 结果表达式2
          WHEN 布尔表达式n THEN 结果表达式n
          [ ELSE结果表达式n+1 ]
          END

          搜索CASE函数的各个WHEN子句的布尔表达式可以使用比较运算符,也可以使用逻辑运算符


          搜索CASE函数的执行过程同简单CASE函数。


          将查询结果保存到新表中



          当使用SELECT语句查询数据时,产生的结果是保存在内存中的。若将查询结果永久保存下来,比如保存在一个表中,可以通过在SELECT语句中使用INTO子句实现。


          包含INTO子句的语法格式为:

            SELECT 查询列表序列 INTO <新表名>
            FROM数据源
            --其他行过滤,分组等子句

            其中“新表名"是存放查询结果的表名。这个语句将查询的结果保存在“新表名”所指定的表中,此语句包含如下三个功能


            ①根据查询语句列出的列以及其类型创建一个新表

            ②将查询的结果插人到新表中。

            ③执行查询语句。


            用INTO子句创建的新表可以是永久表,也可以是临时表。

            永久表


            在执行这个语句时所使用的数据库中被物理的创建,并且是存储在磁盘上的表。


            临时表


            在tempdb数据库中创建此表,其生存期是有限的。

            临时表又根据其使用范围分为局部临时表和全局临时表,两种表的介绍如下:

            ## 全局临时表

            通过在表名前加“##"来标识,比如: ##T1 ,表示“##T1” 是一个全局临时表。

            全局临时表的生存期与创建全局临时表的用户的连接生存期相同,并且在生存期内可以被所有的连接使用


            # 局部临时表

            通过在表名前加一个“#” 来标识,比如:#T1,表示“#T1" 是一个局部临时表。

            局部临时表的生存期与创建此局部临时表的用户的连接生存期相同,它只能在创建此局部临时表的当前连接中使用


            查询结果的并、交、差运算


            并运算



            并运算可将两个或多个查询语句的结果集合并为一个结果集,这个运算可以使用UNION运算符实现。


            UNION是个特殊的运算符,通过它可以实现让两个或更多的道询产生单一的结果集。UNION操作与JOIN连接操作不同。

            VS

            UNION操作

            JOIN操作


            UNION更像是将一个查询结果追加到另一个查询结果中

            UNION是垂直地合并数据(添加更多的行)



            JOIN操作是水平的合并数据(添加更多的列)


            使用UNION谓词的语法格式为:


              SELECT语句1 
              UNION [ALL]
              SELECT语句2
              UNION [ALL]
              SELECT语句n

              ALL表示在结果集中包含所有查询语句产生的全部记录,包括重复的记录。如果没有指定ALL,则系统默认是删除合并后结果集中的重复记录


              使用注意


              1.所有要进行UNION操作的查询,其SELECT列表中列的个数必须相同,而且对应列的语义应该相同


              2.各查询语句中每个列的数据类型必须与其他查询中对应列的数据类型是隐式兼容的,如char(20)与varchar(40)。即只要它们能进行隐式转换即可。合并后的结果采用第一个SELECT语句的列标题


              3.如果要对查询的结果进行排序,则ORDER BY子句应该写在最后一个查询语句之后,且排序的依据列应该是第一个查询语句中出现的列名


              交运算



              交运算将返回同时在两个集合中出现的记录,即返回两个查询结果集中各个列的值均相同的记录,并用这些记录构成交运算的结果。

              实现交运算的SQL运算符为INTERSECT,其语法格式为:


                SELECT语句1
                INTERSECT
                SELECT语句2
                INTERSECT
                SELECT语句n


                差运算



                差运算将返回在第一 个集合中有但第个集合中没有的数据。实现差运算的SQL运算符EXCEPT

                实现差运算的SQL运算符EXCEPT,其语法格式为:


                  SELECT语句1
                  EXCEPT
                  SELECT语句2
                  EXCEPT
                  SELECT语句n


                  相关子查询


                  如果一个SELECT语句是嵌套在一个SELECT、 INSERT、UPDATE或DELETE语句中,则称为子查询或内层查询,包含子查询的语句称为主查询或外层查询。

                  子查询类型

                  1

                  WHERE 表达式 [NOT] IN 子查询

                  2

                  WHERE 表达式 比较运算符 子查询

                  3

                  WHERE 表达式 [NOT] EXISTS 子查询


                  注意


                  子查询一般用在外层查询的WHERE子句HAVING子句中,与比较运算符或逻辑运算符起构成查询条件。

                  对于返回结果为单值的子查询语句,可以出现在任何允许使用表达式的地方。


                  使用子查询进行基于集合的测试




                  使用子查询进行基于集合的测试时,通过运算符INNOT IN,将一个表达式的值与子查询返回的结果集进行比较。

                  其形式为:

                     WHERE表达式[NOT] IN (子查询)


                    这种形式的子查询先查询子查询在子查询的基础上进行外层查询


                    注意:子查询返回的结果实际上就是一个集合,外层查询就是在这个集合上使用IN运算符进行比较。


                    使用子查询进行比较测试




                    通过比较运算符( =、<>、<、>、<=、>=), 将一个表达式的值与子查询返回的单值进行比较。形式为: 

                      WHERE表达式比较运算符(子查询)


                      使用子查询进行的比较测试要求子查询语句必须是返回单值的查询语句。


                      注意


                      由于聚合函数不能出现在WHERE子句中,因此,当一个列的值与一个聚合函数的结果进行比较时,必须用子查询先得到聚合函数的结果,然后在此结果基础之上再执行外层查询的比较。

                      子查询的查询条件不依赖于外层查询,称这样的子查询为不相关子查询嵌套子查询


                      使用子查询进行存在性测试



                      使用子查询进行存在性测试时,通常使用EXISTS谓词,其形式为:

                        WHERE [NOT] EXISTS (子查询)

                        带EXISTS谓词的子查询不返回查询的结果,只产生逻辑真值和逻辑假值

                        EXISTS含义:

                        当子查询中有满足条件的数据时,EXISTS返回真值,否则返回假值。

                        NOT EXISTS含义:

                        当子查询中有满足条件的数据时,NOT EXISTS返回假值;不存在满足条件的数据时, NOT EXISTS返回真值。


                        注意


                        带EXISTS谓词的查询是先执行外层查询,然后再执行内层查询。由外层查询的值决定内层查询的结果;内层查询的执行次数由外层查询的结果数决定。


                        由于带EXISTS的子查询只返回真或假值,因此在子查询里不必指定查询列表。所以在有EXISTS的子查询中。子查询中的目标列通常都用“*" 



                        习题


                        1. 在SQL Server 2008中,使用TOP限制结果集时,如果需要包括最后一行取值并列的结果则需要使用WITH________选项。


                        参考答案


                        想知道?

                        点我
                        点亮下方“在看”显示答案哦


                        参考资料及声明

                        • 全国计算机等级考试三级教程.数据库技术 2019.12.
                        • 三级数据库技术:全国计算机等级考试上机考试题库 2017.10.
                        • 部分图片源自网络,使用图片是为了传递更多信息,普及相关知识,若有来源标注错误或侵犯了您的合法权益,请及时与我联系,我将及时更正、删除或依法处理。


                          数据库技术-数据库及数据库对象(二)

                          掌握更多知识,请扫码关注我~这里有大学的各种高校服务
                        点击下方“在看”,给我鼓励
                        文章转载自青年之学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论