zoukankan      html  css  js  c++  java
  • 视图和子查询

    笔记中用到的表在这里

    视图

    视图:视图可以理解成一张表。但它不保存在计算机的存储设备中,也不保存数据到任何地方,事实上,他保存的是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;
    
  • 相关阅读:
    拦截器
    git和bootstrap
    java面试题目
    Struts2笔记
    sql语句的面试题
    公司面试总结
    面试题12 包含 min 函数的栈 【栈】
    面试题11 字符串的排列[算法]
    [面试] 进程和线程的区别(面试题)
    [baidu] 面向对象的三个基本要素和五项基本设计原则
  • 原文地址:https://www.cnblogs.com/AsuraDong/p/7241284.html
Copyright © 2011-2022 走看看