精华内容
下载资源
问答
  • 索引:个人理解,其实就是选取原表中的某一个或几个列组成一个索引(可以大胆的认为是子表),方便以后更快速的查询。为什么更快的呢?因为是子表不需要再读取整个表;索引也是需要存储的,所以其缺点就是会比无索引...

    索引:个人理解,其实就是选取原表中的某一个或几个列组成一个索引(可以大胆的认为是子表),方便以后更快速的查询。为什么更快的呢?因为是子表不需要再读取整个表;索引也是需要存储的,所以其缺点就是会比无索引来讲多占硬盘空间。

    语法为:

    创建索引:CREATE INDEX index_name ON table_name (column_name);

    使用索引:SELECT column_name FROM index_name WHERE column_name='value';

    删除索引:ALTER TABLE table_name DROP INDEX index_name;

     

    举个例子:

    创建索引:create index Persons_index ON persons(Firstname,Lastname);

    使用索引:select * from Persons_index where Firstname like 'x%';     --查询表中以x开头的姓,在此基础上也查询该人的名

    删除索引:ALTER TABLE persons DROP INDEX Persons_index;

     

    视图:通俗来讲,视图就是存储在数据库中的查询语句。个人理解,视图就是一部分懒人在处理复杂查询的时候好不容易想出来一个查询语句,怕以后忘了就给了个名字记住喽。

    语法为:

    创建视图:CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;

    使用视图:SELECT * FROM view_name WHERE condition;

    更新视图:CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition

    删除视图:DROP VIEW view_name;

     

    举个例子:

    创建视图:create view Persons_view as select * from Persons where SEX='M';

    使用视图:select * from Persons_view where name like 'x%'

    更新视图:create or replace view Persons_view as select * from Persons where SEX='F';

    删除视图:DROP VIEW Persons_view; 

     

    展开全文
  • SQL中视图整理

    2015-12-25 23:33:56
    视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。 视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表 视图来源于表,所有对视图数据的修改最终都会被反映...

    一、视图:

    从表中抽出来的逻辑上相关的数据集合
    视图其实就是一条查询SQL语句,用于显示一个或多个表或其它视图中相关数据。
    视图将查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表
    视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义
    在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)

    使用视图的好处:
    可把复杂的SQL语句简单化
    可保证数据的安全性,限制对数据的访问,因为它对表中的一些字段是隐藏的
    可使相同的数据以不同形式出现在不同的视图中

    视图分类:
    简单视图
    只从一个表中获取数据
    不包含函数
    不包含分组数据
    可通过该视图进行DML操作

    复杂视图
    从多个表中获取数据
    包含函数
    包含分组数据
    不一定能通过视图进行DML操作

    创建视图:
    CREATE [OR REPLACE] [FORCE |NOFORCE ]VIEW view_name [alias [,alias]...]
    AS subquery
    [WITH CHECK OPTION]
    [WITH READ ONLY]

    OR REPLACE 如果视图存在,重建、修改这个视图
    FORCE 不管引用的表是否存在,都创建这个视图
    NOFORCE 只有当表存在的时候,才能创建这个视图(默认方式)
    WITH CHECK OPTION 只有子查询能够检索出的行才能够被插入,修改,或删除。默认情况下对此不作检查
    没有指定约束名,系统会自动为约束命名,形式为SYS_Cn。
    WITH READ ONLY 只读,不可对视图做DML操作

    需要注意的是,在子查询中不能包含ORDER BY ,子查询可以是复杂的SELECT语句


    修改视图
    使用CREATE OR REPLACE VIEW 子句修改视图

    删除视图:
    DROP VIEW view_name

    视图中使用DML的规定:
    当视图定义中含有以下元素之一不能使用INSERT
    组函数
    GROUP BY、ORDER BY
    DISTINCT
    ROWNUM
    列的定义为表达式
    表中非空的列,在视图定义中未包括

    视图定义含有以下元素不能使用UPDATE
    组函数
    GROUP BY、ORDER BY
    DISTINCT
    ROWNUM
    列的定义为表达式

    视图包含以下元素不能DELETE
    组函数
    GROUP BY、ORDER BY
    DISTINCT
    ROWNUM


    与视图有关的数据字典:
    DBA_VIEWS
    USER_VIEWS

    --演示创建视图
    SQL> create or replace view vw_emp as
    2 select empno,ename,sal from emp where sal >2500;

    View created.

    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000
    7902 FORD 3000

    SQL> update vw_emp set sal = 3500 where ename = 'FORD'; --可以更新并且直接修改了基表

    1 row updated.

    SQL> select * from emp where ename = 'FORD';

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    7902 FORD ANALYST 7566 03-DEC-81 3500 20

    SQL> insert into vw_emp select 9999,'Robinson',6000 from dual; --可以插入并且直接修改了基表

    1 row created.

    SQL> select * from emp where empno = 9999;

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    9999 Robinson 6000

    1 rows selected.

    SQL> delete from emp where ename = 'Robinson'; --可以删除并且直接修改了基表

    1 row deleted.

    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000
    7902 FORD 3500

    SQL> rollback;

    Rollback complete.


    --使用with check option
    --使用WITH CHECK OPTION 子句确保DML只能在特定的范围内执行,任何违反
    --WITH CHECK OPTION 约束的请求都会失败

    SQL> create or replace view vw_emp
    2 as
    3 select empno,ename,sal from emp where sal > 2500
    4 with check option;

    View created.

    SQL> insert into vw_emp select 9999,'Robinson',2000 from dual; --不满足条件sal > 2500 不可插入
    insert into vw_emp select 9999,'Robinson',2000 from dual
    *
    ERROR at line 1:
    ORA-01402: view WITH CHECK OPTION where-clause violation


    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000
    7902 FORD 3000

    SQL> delete from vw_emp where empno = 7902; -- 满足条件sal > 2500 可以删除,并且修改了基表

    1 row deleted.

    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000

    SQL> select * from emp;

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    7369 SMITH CLERK 7902 17-DEC-80 800 20
    7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
    7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
    7566 JONES MANAGER 7839 02-APR-81 2975 20
    7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
    7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    7782 CLARK MANAGER 7839 09-JUN-81 2450 10
    7788 SCOTT ANALYST 7566 19-APR-87 3000 20
    7839 KING PRESIDENT 17-NOV-81 5000 10
    7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
    7876 ADAMS CLERK 7788 23-MAY-87 1100 20

    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    7900 JAMES CLERK 7698 03-DEC-81 950 30
    7934 MILLER CLERK 7782 23-JAN-82 1300 10

    13 rows selected.

    SQL> rollback;

    Rollback complete.

    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000
    7902 FORD 3000

    SQL> update vw_emp set sal = 2000 where empno = 7499; --不满足条件,不能更新

    0 rows updated.

    --WITH READ ONLY 屏蔽DML 操作
    --可以使用WITH READ ONLY 选项屏蔽对视图的DML操作
    --任何DML 操作都会返回一个Oracle server 错误

    SQL> create or replace view vw_emp
    2 as
    3 select empno,ename,sal from emp where sal > 2500
    4 with read only;

    View created.

    SQL> insert into vw_emp select 9901,'Robinson',3000 from dual;
    insert into vw_emp select 9901,'Robinson',3000 from dual
    *
    ERROR at line 1:
    ORA-01733: virtual column not allowed here


    SQL> select * from vw_emp;

    EMPNO ENAME SAL
    ---------- ---------- ----------
    7566 JONES 2975
    7698 BLAKE 2850
    7788 SCOTT 3000
    7839 KING 5000
    7902 FORD 3000

    SQL> update vw_emp set sal = 8000 where empno = 7902;
    update vw_emp set sal = 8000 where empno = 7902
    *
    ERROR at line 1:
    ORA-01733: virtual column not allowed here


    SQL> delete from vw_emp where empno = 7566;
    delete from vw_emp where empno = 7566
    *
    ERROR at line 1:
    ORA-01752: cannot delete from view without exactly one key-preserved table

    --创建复杂视图
    SQL> create view vw_sum_emp(name,minsal,maxsal,avgsal)
    2 as
    3 select dname,min(e.sal),max(e.sal),avg(e.sal)
    4 from emp e
    5 join dept d
    6 on e.deptno = d.deptno
    7 group by dname;

    View created.

    SQL> select * from vw_sum_emp;

    NAME MINSAL MAXSAL AVGSAL
    -------------- ---------- ---------- ----------
    ACCOUNTING 1300 5000 2916.66667
    RESEARCH 800 3000 2175
    SALES 950 2850 1566.66667

    --查询与视图有关的数据字典
    SQL> select view_name,text from user_views;

    VIEW_NAME TEXT
    ------------------------------ --------------------------------------------------------------------------------
    VW_SUM_EMP select dname,min(e.sal),max(e.sal),avg(e.sal)
    from emp e
    join dept d
    on e.deptno = d.deptno
    group by dname

    VW_EMP select empno,ename,sal from emp where sal > 2500
    with read only

    更详细的创建视图的语法:
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8004.htm#SQLRF01504

    更多参考:

    Oracle 数据库实例启动关闭过程

    Oracle 10g SGA 的自动化管理

    使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例

    Oracle实例和Oracle数据库(Oracle体系结构)

    SQL 基础-->常用函数

    SQL基础-->过滤和排序

    SQL 基础-->SELECT 查询


    二、在sql中进行增删改

    1. 创建修改视图的例子
    SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST,
       last_name LAST, salary MONTHLY_SALARY
        FROM s_emp WHERE dept_id = 41;
    SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary), MAX(e.salary),
    AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;
    注意: 如果用select * from table_name创建的视图
       table_name的结构改变后 view要重建或compile后才能显示新的字段内容
    2. 查询视图的数据字典
    SQL> set   long   20000 
    set linesize 800
    set pagesize 100
    SQL> select view_name,text from user_views;
    说明: 可以根据视图text_length来设置set long 数字;
    User_updatable_columns视图能查询视图里能被修改的字段

      Lesktop开源IM发布以后,有一些网友问及如何在嵌入IM后与自己网站的用户系统整合(即如何让嵌入的IM直接使用网站原有的用户数据库,而不需要将已有的用户数据导入到IM的数据库中)。Lesktop对Users表(存储用户登录名,昵称,密码等信息的表)都是在存储过程中进行增删改的,显然,如果直接去改Users表相关的存储过程是比较麻烦的,本文将介绍一种较为简单的方法,在不需要修改存储过程和源代码的情况下整合用户系统。

      为实现这个目的,先介绍一下在SQL SERVER中,如何对视图进行增删改。假使用户有Name,Remark两项信息,但是没有存放在同一张表中,而是分开存储在两个表UserBase(ID, Name),UserExtent(ID, Remark)中。

    image

      为使用方便,建立一个视图Users,用于表示用户的完整信息,其定义如下:

        
    CREATE VIEW [dbo].[Users]
    as
    SELECT b.ID as ID, b.Name as Name, e.Remark as Remark
    FROM UserBase b, UserExtent e
    WHERE b.ID = e.ID;

      现在,我们希望通过Users视图进行增删改实现对UserBase,UserExtent表进行修改。显然,如果对Users直接执行insert,update,delete是不可能的,执行时会发生以下错误:

    image

      在SQL Server中,对视图增删改可以通过触发器来实现,例如我们可以创建一个INSERT触发器,当在视图Users上执行INSERT时,在触发器中实现对UserBase,UserExtent的INSERT操作。在触发器中,可以通过名称为inserted的表,获取到新插入的行,具体代码如下:

        
    CREATE TRIGGER [dbo].[Users_Insert] ON [dbo].[Users] INSTEAD OF INSERT
    as
    declare @name nvarchar(32), @remark nvarchar(32)
    declare ins_cursor cursor
    for
    select Name, Remark from inserted
    open ins_cursor
    fetch next from ins_cursor into @name, @remark;
    while(@@fetch_status = 0)
    begin
    --读取所有行,并插入
    insert into UserBase (Name) values (@name);
    insert into UserExtent(ID, Remark) values (@@identity, @remark);
    fetch next from ins_cursor into @name, @remark;
    end
    close ins_cursor

      下面我们通过插入两行数据测试触发器:

        
    --清空所有数据
    delete from UserExtent;
    delete from UserBase;

    create table #temp(
    name
    nvarchar(32),
    remark
    nvarchar(32)
    )
    insert #temp (name,remark) values (N'user1', N'1');
    insert #temp (name,remark) values (N'user2', N'2');

    --插入两行数据
    insert Users(name, remark)
    select name,remark from #temp

    drop table #temp

    select * from Users;
    select * from UserBase;
    select * from UserExtent;

      执行结果如下:

    image

      创建更新触发器,与INSERT触发器类似,受影响的行会保存在inserted中,可以从inserted表中获取受影响的行,并更新UserBase,UserExtent,具体代码如下:

        
    CREATE TRIGGER [dbo].[Users_Update] ON [dbo].[Users] INSTEAD OF UPDATE
    as
    update UserExtent
    set UserExtent.Remark=ins.Remark
    from inserted ins
    where UserExtent.ID = ins.ID;

    update UserBase
    set UserBase.Name=ins.Name
    from inserted ins
    where UserBase.ID = ins.ID;

      测试代码:

        
    --清空所有数据
    delete from UserExtent;
    delete from UserBase;
    --插入两行数据
    insert Users (name,remark) values (N'user1', N'1');
    insert Users (name,remark) values (N'user2', N'2');
    insert Users (name,remark) values (N'user3', N'2');
    --修改后两行数据
    UPDATE Users set Remark = N'3' where Remark = N'2'
    --输出数据
    select * from Users;
    select * from UserBase;
    select * from UserExtent;

      测试结果:

    image

      创建删除触发器,在删除的触发器中,可以通过deleted表,获取被删除的行,具体代码如下:

        
    CREATE TRIGGER [dbo].[Users_Delete] ON [dbo].[Users] INSTEAD OF DELETE
    as
    delete from UserExtent where ID in (select ID from deleted)
    delete from UserBase where ID in (select ID from deleted)

      测试代码:

        
    --清空所有数据
    delete from UserExtent;
    delete from UserBase;
    --插入两行数据
    insert Users (name,remark) values (N'user1', N'1');
    insert Users (name,remark) values (N'user2', N'2');
    insert Users (name,remark) values (N'user3', N'2');
    --删除后两行数据
    delete from Users where Remark = N'2'
    --输出数据
    select * from Users;
    select * from UserBase;
    select * from UserExtent;

      运行结果:

    image

      上文已介绍了如何对视图进行增删改,接下来将介绍如何通过建立视图并添加增删改触发器实现Lesktop开源IM用户系统的整合。首先介绍一下Lesktop开源IM数据库中Users表的结构:

    image

      假使您的网站的用户表(假使名称为MyUserTable)只有Name,Nickname:

    image

      那么,您可以建立一张扩展表(假使名称为UserExtentIM),用于存储其他信息:

    image

      接下来,您只需要把Users表删掉,重新建立一个名称为Users的视图,然后用上文处理Users,UserBase,UserExtent的方法,在Users视图上建好触发器,在触发器中对MyUserTable,UserExtentIM表进行增删改即可,Lesktop的存储过程对User进行读取和增删改时,将通过触发器自动转换成对MyUserTable,UserExtentIM的操作,因此不需要修改任何存储过程和源代码,当然也不会对你原有的数据库造成影响

    三、SQL Server视图管理的四大限制条件
    SQL Server视图其优点是非常明显的,但是视图并不是万能的,在使用视图的时候,需要遵守一些限制,下面就让我们一起来了解一下。
    SQL Server中通过SQL Server视图来访问数据,其优点是非常明显的,如可以起到数据保密、保证数据的逻辑独立性、简化查询操作等等。
    但是,话说回来,SQL Server数据库中的视图并不是万能的,他跟表这个基本对象还是有重大的区别。在使用视图的时候,需要遵守四大限制。


    限制条件一:SQL Server视图数据的更改

    当用户更新视图中的数据时,其实更改的是其对应的数据表的数据。无论是对视图中的数据进行更改,还是在视图中插入或者删除数据,都是类似的道理。但是,不是所有视图都可以进行更改。如下面的这些视图,在SQL Server数据库中就不能够直接对其内容进行更新,否则,系统会拒绝这种非法的操作。

    如在一个视图中,若采用Group By子句,对视图中的内容进行了汇总。则用户就不能够对这张视图进行更新。这主要是因为采用Group By子句对查询结果进行汇总在后,视图中就会丢失这条纪录的物理存储位置。如此,系统就无法找到需要更新的纪录。若用户想要在视图中更改数据,则数据库管理员就不能够在视图中添加这个Group BY分组语句。

    如不能够使用Distinct关键字。这个关键字的用途就是去除重复的纪录。如没有添加这个关键字的时候,视图查询出来的纪录有250条。添加了这个关键字后,数据库就会剔除重复的纪录,只显示不重复的50条纪录。此时,若用户要改变其中一个数据,则数据库就不知道其到底需要更改哪条纪录。因为视图中看起来只有一条纪录,而在基础表中可能对有的纪录有几十条。为此,若在视图中采用了Distinct关键字的话,就无法对视图中的内容进行更改。


    如果在SQL Server视图中有AVG、MAX等函数,则也不能够对其进行更新。如在一张视图中,其采用了SUN函数来汇总员工的工资时,此时,就不能够对这张表进行更新。这是数据库为了保障数据一致性所添加的限制条件。


    可见,试图虽然方便、安全,但是,其仍然不能够代替表的地位。当需要对一些表中的数据进行更新时,我们往往更多的通过对表的操作来完成。因为对视图内容进行直接更改的话,需要遵守一些限制条件。在实际工作中,更多的处理规则是通过前台程序直接更改后台基础表。至于这些表中数据的安全性,则要依靠前台应用程序来保护。确保更改的准确性、合法性。

    限制条件二:定义视图的查询语句中不能够使用某些关键字

    我们都知道,视图其实就是一组查询语句组成。或者说,视图是封装查询语句的一个工具。在查询语句中,我们可以通过一些关键字来格式化显示的结果。如我们在平时工作中,经常会需要把某张表中的数据跟另外一张表进行合并。此时,数据库管理员就可以利用Select Into语句来完成。先把数据从某个表中查询出来,然后再添加到某个表中。

    当经常需要类似的操作时,我们是否可以把它制作成一张视图。每次有需要的时候,只需要运行这个视图即可,而不用每次都进行重新书写SQL代码。不过可惜的是,结果是否定的。在SQL Server数据库的视图中,是不能够带有Into关键字。如果要实现类似的功能,只有通过函数或者过程来实现。

    另外,跟Oracle数据库不同的是,在微软的SQLServer数据库中创建视图的时候,还有一个额外的限制。就是不能够在创建视图的查询语句中,使用order by排序语句。这是一个很特殊的规定。一些Oracle的数据库管理员,在使用SQL Server数据库创建视图的时候,经常会犯类似的错误。他们就搞不明白,为什么Oracle数据库中可行,但是在微软的数据库中则行不通呢?这恐怕只有微软数据库产品的设计者才能够回答的问题。总之我们要记住的就是,在SQLServer数据库中,建立视图时,查询语句中不能够包含Order By语句。

    限制条件三:要对某些列取别名,并保证列名的唯一

    在表关联查询的时候,当不同表的列名相同时,只需要加上表的前缀即可。不需要对列另外进行命名。但是,在创建视图时就会出现问题,数据库会提示 “duplicate column name”的错误提示,警告用户有重复的列名。有时候,用户利用Select语句连接多个来自不同表的列,若拥有相同的名字,则这个语句仍然可以执行。但是,若把它复制到创建视图的窗口,创建视图时,就会不成功。

    查询语句跟创建SQL Server视图的查询语句还有很多类似的差异。如有时候,我们在查询语句中,可能会比较频繁的采用一些算术表达式;或者在查询语句中使用函数等等。在查询的时候,我们可以不给这个列“取名”。数据库在查询的时候,会自动给其命名。但是,在创建视图时,数据库系统就会给你出难题。系统会提醒你为列取别名。

    从以上两个例子中,我们可以看出,虽然视图是对SQL语句的封装,但是,两者仍然有差异。创建视图的查询语句必须要遵守一定的限制。如要保证视图的各个列名的唯一;如果自阿视图中某一列是一个算术表达式、函数或者常数的时候,要给其取名字,等等。

    限制条件四:权限上的双重限制

    为了保障基础表数据的安全性,在视图创建的时候,其权限控制比较严格。

    一方面,若用户需要创建SQL Server视图,则必须要有数据库视图创建的权限。这是视图建立时必须遵循的一个基本条件。如有些数据库管理员虽然具有表的创建、修改权限;但是,这并不表示这个数据库管理员就有建立视图的权限。恰恰相反,在大型数据库设计中,往往会对数据库管理员进行分工。建立基础表的就只管建立基础表;负责创建视图的就只有创建视图的权限。

    其次,在具有创建视图权限的同时,用户还必须具有访问对应表的权限。如某个数据库管理员,已经有了创建视图的权限。此时,若其需要创建一张员工工资信息的视图,还不一定会成功。这还要这个数据库管理员有美誉跟工资信息相关的基础表的访问权限。如建立员工工资信息这张视图一共涉及到五张表,则这个数据库管理员就需要拥有者每张表的查询权限。若没有的话,则建立这张视图就会以失败告终。

    第三,就是视图权限的继承问题。如上面的例子中,这个数据库管理员不是基础表的所有者。但是经过所有者的授权,他就可以对这个基础表进行访问,就可以以此为基础建立视图。但是,这个数据库管理员有没有把对这个基础表的访问权限再授权给其他人呢?如他能否授权给A用户访问员工考勤信息表呢?答案是不一定。默认情况下,数据库管理员不能够再对其他用户进行授权。但是,若基础表的所有者,把这个权利给了数据库管理员之后,则他就可以对用户进行重新授权。让数据库管理员可以给A用户进行授权,让其可以进行相关的操作。

    可见,视图虽然灵活,安全,方便,但是其仍然有比较多的限制条件。根据笔者的经验,一般在报表、表单等等工作上,采用视图会更加的合理。因为其 SQL语句可以重复使用。而在基础表更新上,包括纪录的更改、删除或者插入上,往往是直接对基础表进行更新。对于一些表的约束,可以通过触发器、规则等等来实现;甚至可以通过前台SQL语句直接实现约束。作为数据库管理员,要有这个能力,能够判断在什么时候使用视图,什么时候直接调用基础表。



    展开全文
  • 视图的使用1>视图的创建(1)使用图文创建视图(2)使用T-SQL创建视图2> 删除视图使用T-SQL删除3>视图注意事项二.存储过程1.存储过程概念:2.存储过程分类1>系统存储过程2>自定义存储过程3>扩展存储过程3.调用存储过程4....
  • sql中视图

    2012-11-08 19:51:38
    视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同:数据表是实际存储记录的地方,然而视图并不...
    视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上
    视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同:数据表是实际存储记录的地方,然而视图并不保存任何记录。
    相同的数据表,根据不同用户的不同需求,可以创建不同的视图(不同的查询语句)
    视图的目的是方便查询,所以一般情况下不能对视图进行增删改
    优点:
    筛选表中的行\降低数据库的复杂程度
    防止未经许可的用户访问敏感数据
    使用视图注意事项:
    视图中的查询不能使用orderby ,除非指定了top语句。
    视图被认为是一个虚拟表,表是一个集合,是不能有顺序的。而orderby 则返回的是一个有顺序的,是一个游标。
    在视图中使用selecttop percent + order by 问题。
    所有查询的列,必须有列名,且列名必须唯一
    创建视图
    create view +名字   as 引出查询语句
    我们可以把很长的查询语句放在一个视图中这样我们想要得到查询的结果时,就可以不再执行这段语句,而是查询相应的视图。
    展开全文
  • 浅析SQL Server中视图、存储过程和函数的异与同.pdf
  • 一.什么是视图 视图就是从几个表中导出的数据映射,他是虚表,存放的只是操作语句的定义。和实表形成映射关系,实表中的操作会映射到虚表中。 视图定义以后就和实表一样具有增删查改的功能但是会受到限制。...

    一.什么是视图

    视图就是从几个表中导出的数据映射,他是虚表,存放的只是操作语句的定义。和实表形成映射关系,实表中的操作会映射到虚表中。
    视图定义以后就和实表一样具有增删查改的功能但是会受到限制。同样操作者也可以进行套娃在视图之上在定义视图。
    

    二.视图的优点

    优点:
    1. 简化了数据的查询处理
    2.屏蔽了数据库的复杂性
    3.简化了权限操作
    4.便于数据共享
    5.数据管理更加安全
    缺点:
    1.性能差
    2.增删查改受到相应权限的限制。
    
    

    下面的操作语句会设计到两张表,阅读者可查看结构,方便你理解下面的操作语句。

    三. 创建视图

    # 当我们创建视图的时候并不会执行其中的select语句,只要在视图被查询时才会执行select 语句
    create view ViewName  as  select column_1, column_2 from tableName where caditon;
    
    # 创建id小于10的诗人写过的那些诗的视图
    create view mypoet as select poets.id,poets.name, poetries.content from poets, poetries where poets.id = poetries.poet_id and poets.id < 10;
    # 在对视图进行增删改的时候会进行条件检查 with check option, 比如在增加title和content的时候会设置id=1
     create view lishiming as select poetries.title, poetries.content from poets, poetries where poets.id=1 and poets.id = poetries.poet_id with check option;
    

    可以通过show tables 来查看视图

    四.删除视图

    drop view viewName
    

    五.查询视图

    视图的查询和表格的查询是一样的操作

    select * from viewName;
    select * from lishiming;
    select count(title) from viewName;
    

    六. 更新视图

    update ViewName set title = "修改操作和的题目" where id ="demoID"
    

    七.删除视图中的数据

    delete from viewName where id = "demoID"
    
    展开全文
  • sql 视图的更新和删除SQL Programming language and SQL Database engines provide some useful mechanisms in order to make management of the data easier. SQL View is one of them which can be used to create...
  • SQL中视图与表的区别与联系

    千次阅读 2018-07-11 14:35:46
    区别:1、视图是已经编译好的sql语句,而表不是 2、视图没有实际的物理记录,而表有3、表是内容,视图是窗口4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能...
  • 如有错误请指教提前致谢前言熟悉SqlServer中视图、存储过程、事务的使用会在操作数据时带来更大的方便。正文视图-VIEWVIEW介绍 定义: 视图(VIEW)虚拟表,一般是不存储数据的,但是Sqlserver的索
  • SQL语句——视图

    2021-01-06 14:13:36
    SQL语句 视图的概述 试图(view)是数据库中的一个对象,它是数据库管理系统提供给用户的以多种角度观察数据库中数据的一种重要机制。它对应三种模式中的外模式。 在SQL中,试图是基于SQL语句的结果集的可视化的表。...
  • sql中视图的概念

    2015-06-30 14:42:53
    首先是一个高中,那么我们会有一条Sql where school='潢高', 查询出一个List,得到gradeids,然后再到grade中根据gradeids查询这么多grades对应的studentids,在使用这些studentsid查询出students循环最后得到name...
  • 1、索引操作: --1、查看指定表的索引 --格式:exec sp_helpindex 'tableName'; exec sp_helpindex 'employee'; ...--Create [Unique][Clustered][NonClustered] index index_name On [Table/View] (Column[Asc...
  • SQL Server之视图和索引

    热门讨论 2019-08-18 10:22:50
    第五章 ...sql语句创建:如下 create view V_studentinfo as select A.姓名,A.性别,A.民族,A.家庭住址,B.班级名 from 学生信息 A,班级信息 B where A.所属班级=B.班级编号 该语句将学生信息中的...
  • SQL —— 视图操作

    千次阅读 2018-11-05 22:05:35
    通常,一般情况下,视图时可以更新的(即可以对它们使用INSERT、UPDATE、DELETE),更新一个视图将更新其基表(视图本身没有数据),如果对视增加或删除行,实际上是对其基表增加或删除行。 并不是所有视图都...
  • SQLServer改变字段类型(表和视图)

    千次阅读 2019-11-18 11:45:34
    更改视图字段类型 视图字段类型基于表格。 改变表格字段类型,然后alter视图,达到效果:视图字段类型同表格,一并更新。 仅在查询结果中改变,使用cast 更改表格字段类型 改变表格字段类型: ...
  • SQL SERVER中视图、事务

    2017-03-17 15:06:00
    1、SQL server 视图 在SQL中视图是可以让用户在结果集里面看到自己查看结果的可视化的图形,视图创建的格式: create view 名称 ...上就是违反了视图规定出现了重复列,而正确的是 2、事...
  • Sql Server视图数据的增删改查

    万次阅读 多人点赞 2017-09-13 00:09:16
    如下所示,执行一个查询操作: (四)备注 有些书上说: 可以对任何查询结果进行排序,但是只有当视图包括Top子句时才能排序视图。 这样看来书上确实是有问题的。动 手实践出真知 3.2 插入数据 ...
  • SQL Server中的视图(view)

    万次阅读 多人点赞 2018-08-25 10:59:03
    目录 零、码仙励志 一、建库和建表 二、视图的用法 1.解释 2.格式 3.注意 4.实例演示 5.优点 6.缺点 零、码仙励志 现在不努力,将来拿什么向曾经抛弃你的人证明它有多瞎 ... ename nvarc...
  • SQL学习记事本。 use db 创建视图 create view v_db as select name,sex,age from user where age > 20 修改视图(更新) alter view v_db as select name,sex,age from user where age > 30 删除视图 drop view...
  • 一.视图 1. 首先,什么是视图,通俗的讲 在实际的数据库中,每一张表会有很多个字段,但是不同... 再说的专业一点,视图是对SQL语句的封装,这个说法在下面进行解释 2. 为什么说 视图是对SQL语句的封装呢?这是因...
  • SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。 B.修改限制。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 694
精华内容 277
关键字:

sql中视图