视图和子查询

笔记中用到的表在这里

视图

视图:视图可以理解成一张表。但它不保存在计算机的存储设备中,也不保存数据到任何地方,事实上,他保存的是select语句。

语法

创建语法:

create view view_name(col_name1,...) 
as 
select 子句;

删除的语法:

drop view view_name;
#drop view view_name CASCADE;#删除多重视图

示例:

create view ShohinSum(shohin_bunrui,cnt_shohin)
as 
select shohin_bunrui,count(*)
	from Shohin
	group by shohin_bunrui;

应该注意:避免在视图上建立视图,形成“多重视图”,降低DBMS的效率。

限制和优点

一些限制:

  1. 尽管有些DBMS可以在select子句中使用order by。但实际上,视图和表一样,数据行没有顺序。所以不建议使用。
  2. 表和视图的数据是同步的。但是对于上面示例,这条insert into ShohinSum values('电器制品',5);语句会出错。这是因为视图是通过聚合得到的视图。所以,通过聚合得到的视图无法更新数据。因为聚合,所以数据库不知道在哪一行具体变化,所以行不通。

优点:

  1. 无需保存数据,所以节省空间。
  2. 可以将频繁使用的select语句保存成视图,避免重复书写。

子查询

概括来说,就是一张一次性视图。

比如

select shohin_bunrui,cnt_shohin from
 (select shohin_bunrui,count(*) as cnt_shohin from Shohin group by shohin_bunrui) as ShohiSum;

执行顺序:先执行内循环,生成临时table,再执行外循环。

as ShohiSum就是定义子查询的名字。原则上,必须设定子查询的名字。

标量子查询

返回一行一列的结果(即:单一值)。因此标量子查询返回值可以用在<>=等比较运算符。

例如,要实现得到大于平均单价的商品:

select shohin_id ,shohin_mei,hanbai_tanka 
from Shohin
where hanbai_tanka > ( select avg(hanbai_tanka) from Shohin) #where不能使用聚合函数
;

事实上,能使用列名或常数的地方,都可以使用标量子查询。

关联子查询

在细分的组内进行比较时候使用。

例如要得到同类商品中,高于平均价格的商品:

select  shohin_bunrui,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
	)
;

可见,组合条件必须写在子查询中。


欢迎进一步交流本博文相关内容:

博客园地址 : http://www.cnblogs.com/AsuraDong/

CSDN地址 : http://blog.csdn.net/asuradong

也可以致信进行交流 : xiaochiyijiu@163.com

欢迎转载 , 但请指明出处  :  )


用到的表:
CREATE TABLE Shohin
(shohin_id     CHAR(4)      NOT NULL,
 shohin_mei    VARCHAR(100) NOT NULL,
 shohin_bunrui VARCHAR(32)  NOT NULL,
 hanbai_tanka  INTEGER ,
 shiire_tanka  INTEGER ,
 torokubi      DATE ,
 PRIMARY KEY (shohin_id));

INSERT INTO Shohin VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Shohin VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Shohin VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Shohin VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Shohin VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Shohin VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Shohin VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Shohin VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');

COMMIT;