本书用到的几个表的建表sql语句如下:

--销售产品供应商
CREATE TABLE Vendors (
vend_id varchar(20) not null,
vend_name varchar(50) not null,
vend_address varchar(100),
vend_city varchar(100),
vend_state varchar(100),
vend_zip varchar(20),
vend_country varchar(100),
PRIMARY KEY(vend_id),
)
go --产品表
CREATE TABLE Products(
prod_id varchar(20) not null,
vend_id varchar(20) not null,
prod_name varchar(100) not null,
prod_price float,
prod_desc varchar(200),
PRIMARY KEY(prod_id),
FOREIGN KEY(vend_id) REFERENCES Vendors(vend_id)
)
go
--顾客表
CREATE TABLE Customers(
cust_id varchar(20),
cust_name varchar(100),
cust_address varchar(100),
cust_city varchar(100),
cust_state varchar(100),
cust_country varchar(100),
cust_contact varchar(100),
cust_email varchar(100),
PRIMARY KEY(cust_id)
)
go
--订单表
CREATE TABLE Orders(
order_num varchar(20),
order_date date,
cust_id varchar(20),
PRIMARY KEY(order_num),
FOREIGN KEY(cust_id) REFERENCES Customers(cust_id)
)
go
--OrderItems表 存储每个订单中的实际物品
CREATE TABLE OrderItems(
order_num varchar(20),
order_item varchar(20),
prod_id varchar(20),
quantity int,
item_price float,
FOREIGN KEY(order_num) REFERENCES Orders(order_num),
FOREIGN KEY(prod_id) REFERENCES Products(prod_id)
)

--视图
/*
1 视图是虚拟的表,只包含使用时动态检索数据的查询
2 视图中包含的数据是从其他表中检索出来的,当这些表中数据改变时视图中数据也将返回改变过得数据
3 在特定条件下也可以通过视图的修改影响基表数据 */ --通过联合查询 来查询订购了某种产品的顾客信息
select cust_name,cust_address,cust_contact
from Customers,Orders,OrderItems
where OrderItems.order_num = Orders.order_num and Customers.cust_id = Orders.cust_id
and prod_id = 001; --上面的话我们可以通过修改prod_id号,查询产品所订购者的顾客信息,但是每次都这么写就略繁琐了
--如果我们把上面所需要的列数据写到一个视图中 然后在视图中进行相关查询 就简便了很多
go
create view ProductCustomer as
select cust_name,cust_address,cust_contact,prod_id
from Customers,Orders,OrderItems
where OrderItems.order_num = Orders.order_num and Customers.cust_id = Orders.cust_id --上面创建的视图中就包含了,cust_name,cust_address,cust_contact,prod_id 所对应的一张视图
--可以查询视图得到想要的结果 和上面效果一样 select cust_name,cust_address,cust_contact
from ProductCustomer
where prod_id = 001 --这种情况修改涉及到了两个表 不能进行更新
update ProductCustomer2 set cust_name = '张三(修正5)',order_date='1999-1-1'
where cust_name = '张三(修正4)' --涉及到一张表 所以可以
update Customers set cust_name = '张三(修正2)',cust_address = '皇家计量大学院'
where cust_name = '张三(修正)'

可更新视图
只要满足下列条件,即可通过视图修改基础基表的数据:

任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。

视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生,如通过以下方式:

聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。

计算。不能从使用其他列的表达式中计算该列。使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列将计入计算结果,且不可更新。

被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。

上述限制适用于视图的 FROM 子句中的任何子查询,就像其应用于视图本身一样。通常情况下,数据库引擎 必须能够明确跟踪从视图定义到一个基表的修改。

我对视图的一点理解:

通过视图我们可以把几张表中相关的有用信息提取到一张表(视图)中,虽然视图在数据库中不存在,是虚拟的表,但是我们可以通过查找视图获得我们想查找的数据,简化了复杂的SQL操作。

CSDN有篇比较好的博客讲视图的,连接如下:

http://blog.csdn.net/jbhou/article/details/3176262

sql必知必会(第四版) 学习笔记二 视图的更多相关文章

  1. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects

    The genesis of the computer revolution was a machine. The genesis of out programming languages thus ...

  2. 算法第四版学习笔记之优先队列--Priority Queues

    软件:DrJava 参考书:算法(第四版) 章节:2.4优先队列(以下截图是算法配套视频所讲内容截图) 1:API 与初级实现 2:堆得定义 3:堆排序 4:事件驱动的仿真 优先队列最重要的操作就是删 ...

  3. 算法第四版学习笔记之快速排序 QuickSort

    软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:

  4. sql必知必会(第四版) 学习笔记

    还有一个<Sqlserver2008技术内幕>的笔记,也很好!~ http://www.cnblogs.com/liupeng61624/p/4354983.html 温习一遍简单的sql ...

  5. sql必知必会(第四版) 学习笔记一

    温习一遍简单的sql语法,把自己掌握还不够的地方,做了些笔记.... 1 去重复关键词,distinct select distinct sname from student; 2 限制结果top的用 ...

  6. 算法(第四版)学习笔记之java实现希尔排序

    希尔排序思想:使数组中随意间隔为h的元素都是有序的. 希尔排序是插入排序的优化.先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码例如以下: /** * * @author seab ...

  7. 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈

    下压(LIFO)栈:可以动态调整数组大小的实现 import java.util.Iterator; public class ResizingArrayStack<Item> imple ...

  8. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十四)之Type Information

    Runtime type information (RTTI) allow you to discover and use type information while a program is ru ...

  9. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings

    Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation fo ...

随机推荐

  1. 自增运算a++和++b(1)

    #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code f[]={0x3f,0 ...

  2. JS数组追加数组采用push.apply的坑(转)

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...

  3. 阿里云 Debian Linux 布署记录

    摘要: 主要安装了web环境,java+tomcat+mysql+nginx(暂没没用) 数据盘挂载在/data下,项目,索引都放/data目录下 java,tomcat,mysql程序都在/root ...

  4. CGContext

    CGContext又叫图形上下文,相当于一块画布,以堆栈形式存放,只有在当前 context上绘图才有效.iOS有分多种图形上下文,其中UIView自带提供的在drawRect:方法中通过 UIGra ...

  5. Linux 入门命令

    本文系转载:http://www.cnblogs.com/wwj9413/archive/2012/03/15/2638638.html#2929949 1.Linux进入与退出系统 进入Linux系 ...

  6. jquery插件编写

    /*(function($) { $.fn.accordion = function(options) { var settings = $.extend({}, {open: false}, opt ...

  7. CSS3动画之透视

    若在x,y轴rotate90度,其实是线,不显示,按近大远小的透视关系可用 perspective:数值 开启透视: 默认以中间线为旋转基线,可以用transform-origin来设置旋转基线 在z ...

  8. [C++程序设计]用数组名作函数参数

    1. 用数组元素作函数实参 #include <iostream> using namespace std; int max_value(int x, int max) { return ...

  9. Pseudoprime numbers(POJ 3641 快速幂)

    #include <cstring> #include <cstdio> #include <iostream> #include <cmath> #i ...

  10. “弹出DVD驱动器错误”解决方法

    错误描述:(win7环境) 买了个开发板,赠送了一些光盘,放在电脑光驱中打开后,电脑就疯狂响,可能是光盘质量太差.用完后在弹出时显示“弹出DVD驱动器错误”[见图1].直接按主机上弹出按钮也没有反应. ...