• SQL入门学习4-复杂查询


    5-1 视图

    视图和表

    视图和表的区别只有一个是否保存了实际的数据
    使用INSERT和SELECT实际上就是从存储设备中读取数据,各种计算后,将数据呈现给用户。

    视图不会将数据保存在存储设备中。实际上,视图保存的是SELECT语句视图会在内部执行该SELECT并创建出一张临时表。

    视图的优点

    1. 无需保存数据,节省存储设备的容量。
    2. 可以将频繁使用的SELECT保存成视图,这样就不用每次都重新书写了。

    创建视图

    创建视图,要使用CREATE VIEW语句
    语法:

    CREATE VIEW 视图名称 (<视图列表1>,<视图列表2>,……)
    AS
    <SELECT语句>
    

    注意:

    1. SELECT语句需要书写在AS关键字之后,
    2. SELECT语句中的列的排列顺序和视图中的列的排列顺序相同。

    例:

    CREATE VIEW myView (age, name)
    AS
    SELECT age, name
    FROM STU
    WHERE age>10;
    

    这就完成一个视图的创建,创建成功,会有CREATE VIEW的字样。

    之后就可以像用普通表一样去使用这个视图了。
    使用视图的查询
    实际有两个步骤:

    1. 执行定义视图的SELECT语句。
    2. 根据得到的结果,再执行在FROM子句中使用视图的SELECT语句。

    多重的视图会降低效率,所以建议使用单重视图。

    视图的限制:

    1. 定义视图时不能使用ORDER BY子句。
      因为视图和表一样,数据都是没有顺序的。
    2. 限制性对视图进行更新
      条件:
      • SELECT子句中未使用DISTINCT
      • FROM子句中只有一张表
      • 未使用GROUP BY 子句。
      • 未使用HAVING 子句

    视图和表需要同时进行更新,因此通过聚合得到的视图无法进行更新
    在视图中进行数据的更新, 在原表中,数据也会进行更新。

    删除视图

    语法:

    DROP VIEW 视图名称
    

    例如:

    DROP VIEW myView
    

    在PostgreSQL下,如果想删除已视图未寄出创建出来的多重视图,会由于存在关联视图,而发生错误。
    可以使用DROP VIEW 视图名 CASCADE进行删除。

    5-2 子查询

    子查询和视图

    子查询就是一张一次性的视图。

    例:

    SELECT name ,age
    FROM (SELECT  name, age
        FROM STU
        WHERE age>10) AS temp;
    

    有种类似嵌套SELECT的感觉。
    子查询作为内层查询会首先执行。

    增加子查询的层数
    子查询的层数原则上没有上限。


    标量子查询

    标量子查询有一个特殊限制:
    必须而且只能返回一行一列的数据

    标量子查询就是返回单一值的子查询

    使用实例:
    当在WHERE时,需要使用类似平均值这种聚合函数,但是会发生错误。如果我们需要使用到标量子查询。

    例如:

    SELECT *
    FROM STU
    WHERE score > (SELECT AVG (score)
                    FROM STU);
    

    使用范围:
    任意可以使用单一值的


    5-3 关联子查询

    • 关联子查询会在细分的组内进行比较时使用
    • 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分。
    • 关联子查询的结合条件如果未给出在子查询之中就会发生错误。

    使用情况:
    对切分后的组进行子查询

  • 相关阅读:
    【Charles】高级过滤
    【Python】遍历字典
    sso
    数据可视化大屏,屏幕多分辨率适配方案,且在任意屏幕下保持16:9的比例等比缩放
    从实战的角度谈微服务(八):Sentinel简单使用
    软件研发的成本,效率与质量
    Java获取POST请求Json格式参数(raw)
    Linux日志文件分析
    mongodb非交互式命令
    Java线程池之Executors.newSingleThreadExecutor()
  • 原文地址:https://www.cnblogs.com/subaiBlog/p/5481771.html
Copyright © 2020-2023  润新知