SQL基础学习_04_视图
视图
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_视图的更多相关文章
- Oracle SQL 基础学习
oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念
SQL 基础学习(2) Joining 可以同时关联(joining)多张表进行复杂的查询. 相比于用Rails捞出数据再用Ruby进行过滤组合,使用SQL更加高效,节能. 以下是 users has ...
- qml基础学习 模型视图(一)
一.理解qml模型和视图 qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好.qml部分是qt4 ...
- SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...
- ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)
草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...
- SQL基础-更新&删除&视图
一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...
- sql基础学习
学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...
- 15、SQL基础整理(视图)
视图 即虚拟表 系统-右键-新建视图 编辑前200行 select *from studentscore 代码创建法: create view studentscore as select stude ...
随机推荐
- Linux多线程编程详细解析----条件变量 pthread_cond_t
Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...
- 日志模块---logging
作用 在程序的运行过程中,会遇到很多需要打印的中间信息,通过使用logging模块可以详细的输出信息,不同于print()函数的单一功能. 应用场景 对于软件程序的运行过程中输出中间信息,如账单信息, ...
- 关于C++编译链接和模板函数
一,关于编译链接编译指的的把编译单元生成目标文件的过程链接是把目标文件链接到一起的过程编译单元:可以认为是一个.c或者.cpp文件.每个编译单元经过预处理会得到一个临时的编译单元.预处理会间接包含其他 ...
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...
- 大数据:Hadoop入门
大数据:Hadoop入门 一:什么是大数据 什么是大数据: (1.)大数据是指在一定时间内无法用常规软件对其内容进行抓取,管理和处理的数据集合,简而言之就是数据量非常大,大到无法用常规工具进行处理,如 ...
- hdu 4109 dfs+剪枝优化
求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...
- POJ 2127 最长公共上升子序列
动态规划法: #include <iostream> #include <cstdio> #include <fstream> #include <algor ...
- 为 NativeScript 项目添加 iOS / Android 平台 API 的智能感知
使用 NativeScript ,我们可以很容易的调用平台的原生 API,在开发过程中,我们可以添加这些 API 的 d.ts 文件来提供智能感知,帮助我们更方便的构建媲美原生的 APP. 首先通过 ...
- Asp.net MVC 填充word并下载
使用Aspose.word填充内容并下载(免费版Aspose) 填充固定模式的Word文档,需要先制作Word模板: Aspose.Words主要通过Words里域(Fields)来控制内容. ...
- 自学Zabbix3.5.5-监控项item-User parameters(自定义key)
为什么要自定义KEY,即User parameters功能 有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法.我们可以在客户端配置文件zabb ...