视图

1. 视图的创建

    视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作;

    由于视图并不实际保存数据,只是保存了执行的SELECT语句,可以节约存储空间,但是对于大数据量的存储,使用视图来频繁操作的话,势必会占用较大的计算时间,也算是一种用时间换空间的方案。

    通过以下语句创建视图:

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

    如:

    CREATE VIEW ShohinSum(shohin_bunrui, cnt_shohin)
    AS
    SELECT shohin_bunrui, COUNT(*)
    FROM Shohin
    GROUP BY shohin_bunrui;

    此时,如果执行:

    show tables;

    可以看到多了一张ShohinSum的表,对该表可以进行一般查询,但是并不能插入和修改数据,可更新的视图需要满足一定的条件;

2. 多重视图

    由于视图在SQL中也是一张表,所以也可以在视图的基础上再创建视图,可想而知,这样做会使得SQL的效率变得很慢

3. 视图定义的限制

    1. 不能使用ORDER BY子句定义(除了PostgreSQL,但是也应该尽量避免)

    2. 对视图进行更新的条件:

        1. SELECT子句中未使用DISTINCT

        2. FROM子句中只有一张表

        3. 未使用GROUP BY子句

        4. 未使用HAVING子句 

        能不能更新一个视图,最终还是要看响应的操作能不能在原表中也做响应的修改,如果原表可以同时进行更新,则视图就可以更新;

        而在PostgreSQL中,视图默认是只读的,如果要在可更新的视图中做更新操作,需要做以下操作:

        CREATE  OR REPLACE RULE insert_rule
        AS ON INSERT
        TO <视图名> DO INSTEAD

4. 删除视图

    通过DROP VIEW来删除视图

子查询

1. 定义

    子查询就是一张一次性的视图,由于视图可以当成表的特性,在FROM子句中,可以用小括号将视图作为一个表来处理:

    SELECT <列1>,<列2>,…
    FROM (SELECT 语句) AS  <子查询名>

    子查询在执行时,先执行被当成视图的SELECT语句,然后再执行外层查询语句;

    可以嵌套多个子查询,但是相应的性能也会变差;

2. 标量子查询

    标量子查询就是返回单一值的子查询,由于返回的是单一值,所以可以使用比较运算等各种运算中。

    标量子查询的一个应用就是使得WHERE 语句中使用聚合函数的返回值,如:

    SELECT shohin_id, shohin_mei, hanbai_tanka
    FROM Shohin
    WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka) FROM Shohin); 

    由于先执行视图中的SELECT语句,并且返回一个标量,所以在WHERE中并不会产生错误,解决WHERE子句不能使用聚合函数的问题;

    标量子查询也可以应用在现实标量值的查询中,如:

    SELECT shohin_id, shohin_mei, hanbai_tanka, (SELECT AVG(hanbai_tanka) FROM Shohin) AS avg_tanka
    FROM Shohin; 

3. 关联子查询

    标量子查询用起来非常方便,但是如果返回的值并不是标量,而是有多个值的时候,就不能简单地做比较以及其他的标量操作,

    通过使用关联子查询,可以解决这个问题。

    关联子查询实际上就是设定一个限制条件,使得视图中的查询返回的结果是唯一适用于外层查询的;

    如果将子查询看成是一个二重循环,关联子查询实际上就是在内层循环中添加一个条件,使得只返回一个值,并且该值是外层循环需要的,

    比较难用文字解释,看示例:

    SELECT shohin_id, shohin_mei, hanbai_tanka
    FROM Shohin AS S1
    WHERE hanbai_tanka > (SELECT AVG(hanbai_tanka)
                                             FROM Shohin AS S2
                                             WHERE S1.shohin_bunrui = S2.shohin_bunrui
                                             GROUP BY shohin_bunrui);

    由于上面的子查询中使用到了GROUP BY,所以该子查询会返回多个值,此时使用比较运算发生错误;

    关联子查询的关键就是添加WHERE S1.shohin_bunrui = S2.shohin_bunrui 子句,该子句使得子查询只返回一个值,并且该值和外层查询同组,也就是外层查询需要的值,

    通过关联子查询巧妙地解决子查询多个返回值的比较运算问题;

    通过上述的查询语句,可以看出名称的作用域的关系,S1在内外两层中都可以被使用,但是S2只有子查询中才能被看到;按照二重循环的理解,这一点是显而易见的。

SQL基础学习_04_视图的更多相关文章

  1. Oracle SQL 基础学习

    oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...

  2. [SQL基础教程] 5-1视图

    [SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...

  3. SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念

    SQL 基础学习(2) Joining 可以同时关联(joining)多张表进行复杂的查询. 相比于用Rails捞出数据再用Ruby进行过滤组合,使用SQL更加高效,节能. 以下是 users has ...

  4. qml基础学习 模型视图(一)

    一.理解qml模型和视图 qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好.qml部分是qt4 ...

  5. SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.

    SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...

  6. ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

    草图   真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...

  7. SQL基础-更新&删除&视图

    一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...

  8. sql基础学习

    学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...

  9. 15、SQL基础整理(视图)

    视图 即虚拟表 系统-右键-新建视图 编辑前200行 select *from studentscore 代码创建法: create view studentscore as select stude ...

随机推荐

  1. CCF-201312-1-出现次数最多的数

    问题描述 试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有 ...

  2. wkhtmltopdf

    最近要做一个html转pdf的功能,在网上找了很多内容,itext什么的,都不太满意,最后找到一个wkhtmltopdf,用起来真的很不错,还找到了一篇好文章,我就直接抄过来了,等有时间我再自己理一遍 ...

  3. 你不知道的javaScript上卷(第一章 作用域是什么)

    在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...

  4. zeppelin0.7.3源码编译

    操作系统: Centos7.X Python版本: Python2.7 Maven版本:3.1.* Git:1.8.3.* JAVA:java1.7+ node npm bower grunt 每次执 ...

  5. 电脑创建WIFI/无线热点之后, 手机QQ能上浏览器不能上网

    这个完全是个人经验,绝对原创,请尊重博主原创权,转载请注明转于此博客. 问题如题,大家电脑创建无线热点之后, 有的人手机会出现QQ,微信能上网, 但是浏览器或者基于浏览器的那些比如应用商店不能上网, ...

  6. ROC和AUC的区别

    ROC是一个曲线,AUC是曲线下面的面积值.   ROC曲线是FPR和TPR的点连成的线. 可以从上面的图看到,横轴是FPR, 纵轴是TPR (TPR = TP / (TP + FN):FPR = F ...

  7. LintCode-落单的数 III

    给出2*n + 2个的数字.除当中两个数字之外其它每一个数字均出现两次,找到这两个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1,2,2,3,4,4,5,3].返回 1和5 挑战 ...

  8. 牛腩新闻公布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...

  9. 用R画有图例的中国地图

    近期在网上找了几种画中国地图方法,终于认为这种方法还是最适用的 1.用googlevis包.因为中国国情如今已经不能訪问google地图了.所以大多中国用户来说仅仅能望洋兴叹了. 2.用ggplot包 ...

  10. Microsoft Graph 桌面应用程序

    作者:陈希章 发表于 2017年3月22日 桌面应用程序,在我这篇文章的语境中,我是特指在Windows桌面上面直接运行的.NET应用程序,包括Console Application,WPF Appl ...