视图和子查询
笔记中用到的表在这里。
视图
视图:视图可以理解成一张表。但它不保存在计算机的存储设备中,也不保存数据到任何地方,事实上,他保存的是
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的效率。
限制和优点
一些限制:
- 尽管有些DBMS可以在
select
子句中使用order by
。但实际上,视图和表一样,数据行没有顺序。所以不建议使用。 - 表和视图的数据是同步的。但是对于上面示例,这条
insert into ShohinSum values('电器制品',5);
语句会出错。这是因为视图是通过聚合得到的视图。所以,通过聚合得到的视图无法更新数据。因为聚合,所以数据库不知道在哪一行具体变化,所以行不通。
优点:
- 无需保存数据,所以节省空间。
- 可以将频繁使用的
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;