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只有子查询中才能被看到;按照二重循环的理解,这一点是显而易见的。

时间: 2024-12-13 22:32:20

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

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

一.理解qml模型和视图 qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好.qml部分是qt4.7的时候推出的,当时qml只是为了移动端而设计的开发语言,随着it行业的发展,桌面端也产生了一定的需求,这就使得qml也必须支持桌面端的开发.使用qml可以做出绚丽的界面,并把逻辑和界面展示分开,qml和C++就好比html和JavaScript. qt中有大量的model/view类,视图类:Q

SQL基础学习笔记(四)—视图

视图 (view): 视图的作用就是当一个表中的数据并不想对成员全部开放,只针对不同权限的用户开放不同的数据部分,同子图一样,但是子图的修改,父图并 不受影响,而视图,解决了这一问题 依赖于某表创建一个视图 create view empview as select employee_id id, last_name name, salary sal from employees where department_id = 80 更改数据 update empview set salary =

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

草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正确访问和提供必要的数据就行. 个人习惯 我喜欢先意淫一下需求,然后找出需要的实体和逻辑,而不是先设计数据库,现在EF那么牛逼,完全可以在代码上生成表和表之间的关系,各种查询语句效率并不一定比你写sql语句差.所以我在做东西的时候从来不先考虑数据的.但是今天主要是练习api和复习一下ado.net的CUR

SQL 基础学习: 和深度学习资料

SQL is a standard language for storing, manipulating and retrieving data in databasee. 关系型数据库:RDBMS(Relational Database Mangement System) SQLite3: Rails默认的轻量级数据库,集成于Rails中,在db/development.sqlite3这个档案中. 用途:单机用途.所以在实际部署的时候会换成MySQL等数据库服务器. MySQL: 目前流行的开

sql基础学习

学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_name,column_name from table_name; #数据库中选取某个表格某几列数据 select * from table_name; #数据库中选取某个表格所有列数据 2.SELECT DISTINCT 语句 用于返回唯一不同的值. select distinct column_na

SQL基础-更新&amp;删除&amp;视图

一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE student SET gender = '男'; ### 更新部分数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值 WHERE 限定条件; 比如: 更新学生方东美的性别为女: UPDATE student SET gender = '女' WHERE student_n

SQL基础学习笔记(三)—约束

约束: 一.创建表时,定义约束 create table emp2( id number(10) constraint emp2_id_nn not null, name varchar2(20) not null, salary number(10,2) ) constraint emp2_id_nn 给约束起个名增加阅读性,不写也行,会自动加上sys_XXXX 作用范围: ①列级约束只能作用在一个列上 ②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上) 定义方式:列约束必须跟在

SQL基础学习笔记(五)—序列、索引、同义词

常见的数据库对象 表:基本的数据存储集合,由行和列组成 视图:从表中抽出逻辑上相关的数据集合 序列:提供有规律的数值 索引:提高查询效率 同义词:给对象起别名 (索引和同义词了解即可) 序列sequences 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 如何和创建序列 CREATE SEQUENCE sequence [INCREMENT BY n] --每次增长的数值 [START WITH n] --从哪个值开

SQL基础学习_05_函数、谓词、CASE表达式

函数 算术函数 1. 四则运算: +.-.*./? 2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的位数) 字符串函数 1. 字符串拼接: ||, str1 || str2 || str3 || - || strn ?AS str_all 2. 字符串长度:LENGTH,LENGTH(str1) AS len_str1 3. 小写转换:LOWER,LOWER(str1) AS low_str 4.