zoukankan      html  css  js  c++  java
  • 9-SQL视图

    (1) 如何创建,更新和删除视图

            视图作为一张虚拟表,帮我们封装了底层与数据表的接口。它相当于是一张表或多张表的数据结果集。视图的这一特点,可以帮我们简化复杂的 SQL 查询,比如在编写视图后,我们就可以直接重用它,而不需要考虑视图中包含的基础查询的细节。同样,我们也可以根据需要更改数据格式,返回与底层数据表格式不同的数据。通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。
        
    (2) 创建视图
            create view view_name select column_1, column_2 from table_name where condition
            在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集形成一张虚拟表。其中 view_name 为视图名称,column1、column2 代表列名,condition 代表查询过滤条件。
            查询比 NBA 球员平均身高高的球员都有哪些,显示他们的球员 ID 和身高。假设我们给这个视图起个名字 player_above_avg_height,那么创建视图可以写成:
            create view player_view as select player_id, height, player_name from player where height > (select avg(height) from player);
            当视图创建之后,它就相当于一个虚拟表,可以直接使用,直接通过球员的视图进行查询操作:
            select * from player_view;
            
    (3) 修改视图
            alter view view_name as select column_1, column_2 from table_name where condition
            在player_view视图基础上添加一个team_id字段,进行更新
            alter view player_view as select team_id, player_id, player_name, height from player where height > (select avg(height) from player);
            直接通过球员的视图进行查询操作:
            select * from player_view;
            
    (3) 嵌套视图
            当我们创建好一张视图之后,还可以在它的基础上继续创建视图,比如我们想在虚拟表 player_view 的基础上,找到比这个表中的球员平均身高高的球员,作为新的视图 player_view_2,那么可以写成:
            create view player_view_2 as select player_id, height, player_name from player where height > (select avg(height) from player_view);
            在player_view_2基础上查询,
            select * from player_view_2;
            
    (4) 删除视图
            drop view view_name;
            比如删除刚创建的player_view_2;
            drop view player_view_2;
            需要说明的是,SQLite 不支持视图的修改,仅支持只读视图,也就是说你只能使用 CREATE VIEW 和 DROP VIEW,如果想要修改视图,就需要先 DROP 然后再 CREATE
            
    (5) 利用视图完成复杂的连接
            在SQL99 标准连接操作的时候,举了一个 NBA 球员和身高等级连接的例子,有两张表,分别为 player 和 height_grades。其中 height_grades          记录了不同身高对应的身高等级。通过创建视图,来完成球员以及对应身高等级的查询。首先我们对 player 表和 height_grades 表进行连接,关联条件是球员的身高 height(在身高等级表规定的最低身高和最高身高之间),这样就可以得到这个球员对应的身高等级,对应的字段为 height_level。然后我们通过 SELECT 得到我们想要查询的字段,分别为球员姓名 player_name、球员身高 height,还有对应的身高等级 height_level。然后把取得的查询结果集放到视图 player_height_grades 中,即:
            CREATE VIEW player_height_grades AS SELECT p.player_name, p.height, h.height_level FROM player as p JOIN height_grades as h ON height BETWEEN h.height_lowest AND h.height_highest;
            在视图player_height_grades基础上,进行查询操作  查询身高介于 1.90m 和 2.08m 之间的球员及他们对应的身高:
            select * from player_height_grades where height > 1.90 and height < 2.08;
            
    (6) 利用视图对数据进行格式化
            创建一个视图player_team,输出球员和对应的球队:
            create view player_team as select concat(player_name, '(' , team.team_name, ')' ) as player_team from player join team where player.team_id = team.team_id;
            首先我们将 player 表和 team 表进行连接,关联条件是相同的 team_id。
            我们想要的格式是player_name(team_name),因此我们使用 CONCAT 函数,即CONCAT(player_name, '(' , team.team_name , ')'),将 player_name 字段和 team_name 字段进行拼接,得到了拼接值       被命名为 player_team 的字段名,将它放到视图 player_team 中。
            在视图player_team基础上进行查询
            select * from player_team;
    (7) 使用视图与计算字段
            通过视图完成统计需求
            创建一个视图player_score_2_3,统计每个球员在每场比赛中的2分球,3分球和罚球的得分。
            CREATE VIEW player_score_every_2_3 AS SELECT
            game_id,
            player_id,
            ( shoot_hits - shoot_3_hits ) * 2 AS shoot_2_points,
            shoot_3_hits * 3 AS shoot_3_points,
            score 
            FROM
                player_score;
            在视图player_score_every_2_3基础上进行查询操作
            select * from player_score_every_2_3;
            
            正确使用视图可以简化复杂的 SQL 查询,让 SQL 更加清爽易用。不过有一点需要注意,视图是虚拟表,它只是封装了底层的数据表查询接口,因此有些 RDBMS 不支持对视图创建索引
            一个视图其实是SELECT语句的集合,执行时会提前编译好,可以反复使用。在底层执行顺序的时候和SELECT语句是一样:
            1、FROM子句组装数据
            2、WHERE子句进行条件筛选
            3、GROUP BY分组
            4、使用聚集函数进行计算;
            5、HAVING筛选分组;
            6、计算所有的表达式;
            7、SELECT 的字段;
            8、ORDER BY排序
            9、LIMIT筛选
  • 相关阅读:
    Memcache安全配置
    Iptables DDOS/CC 自动屏蔽脚本
    php浮点数精确运算
    Relearning PHP (2) – php 的浮点数float
    mybatis分页插件PageHelper的使用(转)
    深入理解mybatis参数
    @Param注解在mybatis中的使用以及传入参数的几种方式(转)
    idea常用快捷键大全(转)
    @ModelAttribute注解的作用
    参数绑定
  • 原文地址:https://www.cnblogs.com/Tom-tao/p/11871152.html
Copyright © 2011-2022 走看看