Oracle DB视图_MySQL

Jun 01, 2016 pm 01:28 PM

bitsCN.com

Oracle DB视图

 

什么是视图

通过创建表的视图可以显示数据的逻辑子集或组合。视图是一种基于表或其它视图的逻辑表。视图没有自己的数据,但它如同一个窗口,通过它可以查看或更改表中的数据。视图所基于的表被称为基表。视图以SELECT 语句的形式存储在数据字典中。

 

视图的优点

• 由于视图可以显示表中的选定列,因而可以限制对数据的访问。

• 视图可用来通过进行简单查询来检索复杂查询的结果。例如,用户在不了解如何编写联接语句时,使用视图就可以查询多个表中的信息。

• 视图为特定用户和特定应用程序提供了数据独立性。一个视图可用来检索多个表中的数据。

• 通过视图,用户组可根据各自的特定标准访问数据。

 

简单视图和复杂视图

 

 

Oracle DB视图_MySQL

 

视图有两种分类:简单视图和复杂视图。这两类视图的基本差别与DML(INSERT 、UPDATE 和DELETE )操作有关。

• 简单视图有如下特点:

- 只从一个表中获得数据

- 不包含函数或数据组

- 可以通过视图执行DML 操作

• 复杂视图有如下特点:

- 从多个表中获得数据

- 包含函数或数据组

- 不一定允许通过视图执行DML 操作

 

创建视图

• 在CREATE VIEW 语句中嵌入一个子查询:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view

[(alias [,  alias ]...)]

AS subquery

[WITH CHECK O PTION [CONSTRAINT  constraint ]]

[WITH READ ON LY [CONSTRAINT  constraint ]];

 

• 子查询可以包含复杂的SELECT 语法。

 

 

可以通过在CREATE VIEW 语句中嵌入子查询来创建视图。

在该语法中:

OR REPLACE :如果该视图已存在则重新创建

FORCE :不管基表是否存在都创建视图

NOFORCE :仅当基表存在时才创建视图(默认设置)

view :是视图的名称

alias :指定由视图查询选定的表达式的名称(别名的数量必须与视图选择表达式数量匹配)

subquery :是一个完整的SELECT 语句(可以在SELECT 列表中使用列的别名

WITH CHECK OPTION: 指定只插入或只更新视图中可以访问的那些行

constraint: 是为CHECK OPTION约束条件指定的名称

WITH READ ONLY :确保不对此视图执行DML 操作

 

• 创建视图EMPVU80,视图包含部门80 中每位雇员的雇员编号、姓氏和薪金:

hr@TEST0924> create view empvu80

  2  as select EMPLOYEE_ID,LAST_NAME,SALARY from employees where EMPLOYEE_ID=80;

 

View created.

 

• 使用SQL*Plus DESCRIBE 命令描述视图的结构:

DESCRIBE empvu80

hr@TEST0924> desc empvu80

 Name                                                  Null?    Type

 ----------------------------------------------------- -------- ------------------------------------

 EMPLOYEE_ID                                           NOT NULL NUMBER(6)

 LAST_NAME                                             NOT NULL VARCHAR2(25)

 SALARY                                                         NUMBER(8,2)

 

• 在子查询中使用列别名创建视图,可以通过将列别名包含在子查询中来控制列名:

hr@TEST0924> create view salvu50

  2  as select EMPLOYEE_ID id_number,LAST_NAME name,SALARY*12 ann_salary from employees where EMPLOYEE_ID=50;

 

View created.

 

hr@TEST0924> desc salvu50

 Name                                                  Null?    Type

 ----------------------------------------------------- -------- ------------------------------------

 ID_NUMBER                                             NOT NULL NUMBER(6)

 NAME                                                  NOT NULL VARCHAR2(25)

 ANN_SALARY                                                     NUMBER

示例中创建了一个视图,其中包含部门50 中每位雇员的以下信息:别名为ID_NUMBER 的雇员编号( EMPLOYEE_ID ) 、别名为NAME 的姓名( LAST_NAME)  以及别名为ANN_SALARY的年薪( SALARY ) 。

 

你也可以在CREATE 语句之后和SELECT 子查询之前使用别名。列出的别名数量必须与在子查询中选定的表达式数量相匹配。

hr@TEST0924> CREATE OR REPLACE VIEW salvu50 (ID_NUMBER, NAME, ANN_SALARY)

  2  AS SELECT  employee_id, last_name, salary*12 FROM    employees WHERE   department_id = 50;

 

View created.

 

hr@TEST0924> desc salvu50

 Name                                                  Null?    Type

 ----------------------------------------------------- -------- ------------------------------------

 ID_NUMBER                                             NOT NULL NUMBER(6)

 NAME                                                  NOT NULL VARCHAR2(25)

 ANN_SALARY                                                     NUMBER

 

 

准则

• 定义视图的子查询可以包含复杂的SELECT 语法,其中包括联接、分组和子查询。

• 如果你没有为使用WITH CHECK OPTION创建的视图指定约束条件名称,系统则会以SYS_Cn 格式指定默认名称。

• 可以使用OR REPLACE选项更改视图的定义,而不必在删除该视图后再重新创建,也不必对其重新授予以前授予过的对象权限。

 

从视图中检索数据

你可以从视图中检索数据,就像从任何表中检索数据一样。可以显示整个视图的内容,也可以只显示特定的行或列。

hr@TEST0924> select * from salvu50;

 

 ID_NUMBER NAME                      ANN_SALARY

---------- ------------------------- ----------

       198 OConnell                       31200

       199 Grant                          31200

...

45 rows selected.

 

修改视图

• 可以使用CREATE OR REPLACE VIEW子句修改视图EMPVU80。为每个列名添加一个别名:

hr@TEST0924> CREATE OR REPLACE VIEW empvu80(id_number, name,  sal, department_id)

  2  AS SELECT  employee_id, first_name || ' '|| last_name, salary, department_id FROM    employees WHERE   department_id = 80;

 

View created.

 

CREATE OR REPLACE VIEW子句中列出的列别名与子查询中的列具有相同的顺序。

使用OR REPLACE选项,可以创建一个视图,甚至可以创建一个与已存在的视图同名的视图,以便替换旧版本的视图。这意味着可以更改视图,而不必经过删除、重新创建对象和重新授予对象权限的过程。

注:在CREATE OR REPLACE VIEW子句中指定列别名时,请注意别名的列出顺序应与子查询中列的顺序相同。

 

创建复杂视图

创建包含组函数的复杂视图以显示两个表中的值:

hr@TEST0924> create or replace view dept_sum_vu(name,minsal,maxsal,avgsal)

  2  as select d.department_name,min(e.salary),max(e.salary),avg(e.salary) from employees e join departments d

  3  on (e.department_id=d.department_id) group by d.department_name

  4  /

 

View created.

 

示例中创建了一个复杂视图,其中包含按部门列出的部门名称、最低薪金、最高薪金和平均薪金。请注意,已为该视图指定了替代名称。如果视图中有任何列来自于函数或表达式,则需要使用替代名称。

可以使用DESCRIBE 命令查看视图的结构。通过发出SELECT 语句可显示视图的内容。

 

hr@TEST0924> select * from dept_sum_vu;

 

NAME                               MINSAL     MAXSAL     AVGSAL

------------------------------ ---------- ---------- ----------

Administration                       4400       4400       4400

Accounting                           8300      12008      10154

...

11 rows selected.

 

对视图执行DML 操作的规则

• 可以对整个视图中的数据执行DML 操作,但这些操作必须符合特定的规则,通常可以对简单视图执行DML 操作。

• 如果视图不包含以下任何内容,则可以从视图中删除行:

- 组函数

- GROUP BY 子句

- DISTINCT 关键字

- 伪列ROWNUM 关键字

 

对视图执行DML 操作的规则修改数据

如果视图包含以下内容,则不能修改视图中的数据:

• 组函数

• GROUP BY 子句

• DISTINCT 关键字

• 伪列ROWNUM 关键字

• 由表达式定义的列

可以修改视图中的数据,除非该视图包含上规则中提到的任何条件或由表达式定义的列(例如,SALARY * 12 )。

 

对视图执行DML 操作的规则插入数据

如果视图包括以下内容,则不能向视图添加数据:

• 组函数

• GROUP BY 子句

• DISTINCT 关键字

• 伪列ROWNUM 关键字

• 由表达式定义的列

• 基表中未被视图选中的NOT NULL 列

 

可以向视图添加数据,除非视图包含此上列中列出的任何项。如果视图包含的NOT NULL列在基表中没有指定默认值,则不能向视图添加数据。在视图中必须显示所有需要

的值。请记住,您要通过视图将值直接添加到基表中。

 

使用WITH CHECK OPTION子句

• 使用WITH CHECK OPTION子句可确保对视图执行的DML 操作只在视图范围内起作用:

hr@TEST0924> create or replace view empvu20

  2  as select * from employees where department_id=20

  3  with check option constraint empvu20_ck

  4  /

 

View created.

• 如果尝试使用INSERT语句插入department_id不为20 的一行,或者使用UPDATE语句更新视图中任何行的部门编号,则操作会失败,因为这违反WITH CHECK OPTION约束条件。

可以在视图中执行引用完整性检查。还可以在数据库级别强制实现约束条件。视图可以用来保护数据完整性,但此用途很有限。

WITH CHECK OPTION子句指定通过视图执行的INSERT和UPDATE不能创建该视图无法选择的行。因此,能够对要插入或更新的数据强制执行完整性约束条件和数据验证检查。如果尝试对视图未选中的行执行DML 操作,则会显示一条错误,还会显示约束条件名称(如果已指定)。

hr@TEST0924> update empvu20 set department_id=10 where employee_id=201;

update empvu20 set department_id=10 where employee_id=201

       *

ERROR at line 1:

ORA-01402: view WITH CHECK OPTION where-clause violation

 

注:如果部门编号已更改为10,则该视图将无法看到此雇员,因此不会更新任何行。

所以,使用WITH CHECK OPTION子句时,该视图只能看到部门20 中的雇员,并且不允许通过该视图更改这些雇员的部门编号。

 

拒绝DML 操作

• 通过在视图定义中添加WITH READ ONLY选项可以确保不会执行DML 操作。

• 尝试对视图中的任何行执行DML 操作都会导致产生Oracle Server 错误。

 

hr@TEST0924> create or replace view empvu10(employee_number,employee_name,job_title)

  2  as select employee_id,last_name,job_id from employees where department_id=10

  3  with read only

  4  /

 

View created.

尝试从具有只读约束条件的视图中删除任何行会导致产生错误:

hr@TEST0924> delete from empvu10 where employee_number=200;

delete from empvu10 where employee_number=200

            *

ERROR at line 1:

ORA-42399: cannot perform a DML operation on a read-only view

 

与此类似,尝试使用具有只读约束条件的视图插入行或修改行会导致同样的错误。

删除视图

因为视图是基于数据库中的基表建立的,所以删除视图不会导致丢失数据。

hr@TEST0924> drop view empvu80;

 

View dropped.

使用DROP VIEW语句可删除视图。该语句会从数据库中删除视图定义。但是,删除视图不会影响视图的基表。此外,基于已删除视图的视图或其它应用程序会变得无效。只有创建者或具有DROP ANY VIEW权限的用户才能删除视图。

bitsCN.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까? Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까? Mar 19, 2025 pm 03:51 PM

이 기사는 MySQL의 Alter Table 문을 사용하여 열 추가/드롭 테이블/열 변경 및 열 데이터 유형 변경을 포함하여 테이블을 수정하는 것에 대해 설명합니다.

MySQL 연결에 대한 SSL/TLS 암호화를 어떻게 구성합니까? MySQL 연결에 대한 SSL/TLS 암호화를 어떻게 구성합니까? Mar 18, 2025 pm 12:01 PM

기사는 인증서 생성 및 확인을 포함하여 MySQL에 대한 SSL/TLS 암호화 구성에 대해 설명합니다. 주요 문제는 자체 서명 인증서의 보안 영향을 사용하는 것입니다. [문자 수 : 159]

MySQL에서 큰 데이터 세트를 어떻게 처리합니까? MySQL에서 큰 데이터 세트를 어떻게 처리합니까? Mar 21, 2025 pm 12:15 PM

기사는 MySQL에서 파티셔닝, 샤딩, 인덱싱 및 쿼리 최적화를 포함하여 대규모 데이터 세트를 처리하기위한 전략에 대해 설명합니다.

인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)? 인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)? Mar 21, 2025 pm 06:28 PM

기사는 MySQL Workbench 및 Phpmyadmin과 같은 인기있는 MySQL GUI 도구에 대해 논의하여 초보자 및 고급 사용자를위한 기능과 적합성을 비교합니다. [159 자].

드롭 테이블 문을 사용하여 MySQL에서 테이블을 어떻게 드롭합니까? 드롭 테이블 문을 사용하여 MySQL에서 테이블을 어떻게 드롭합니까? Mar 19, 2025 pm 03:52 PM

이 기사에서는 Drop Table 문을 사용하여 MySQL에서 테이블을 떨어 뜨리는 것에 대해 설명하여 예방 조치와 위험을 강조합니다. 백업 없이는 행동이 돌이킬 수 없으며 복구 방법 및 잠재적 생산 환경 위험을 상세하게합니다.

외국 키를 사용하여 관계를 어떻게 표현합니까? 외국 키를 사용하여 관계를 어떻게 표현합니까? Mar 19, 2025 pm 03:48 PM

기사는 외국 열쇠를 사용하여 데이터베이스의 관계를 나타내고 모범 사례, 데이터 무결성 및 피할 수있는 일반적인 함정에 중점을 둡니다.

JSON 열에서 인덱스를 어떻게 생성합니까? JSON 열에서 인덱스를 어떻게 생성합니까? Mar 21, 2025 pm 12:13 PM

이 기사에서는 PostgreSQL, MySQL 및 MongoDB와 같은 다양한 데이터베이스에서 JSON 열에서 인덱스를 작성하여 쿼리 성능을 향상시킵니다. 특정 JSON 경로를 인덱싱하는 구문 및 이점을 설명하고 지원되는 데이터베이스 시스템을 나열합니다.

일반적인 취약점 (SQL 주입, 무차별 적 공격)에 대해 MySQL을 어떻게 보호합니까? 일반적인 취약점 (SQL 주입, 무차별 적 공격)에 대해 MySQL을 어떻게 보호합니까? Mar 18, 2025 pm 12:00 PM

기사는 준비된 명령문, 입력 검증 및 강력한 암호 정책을 사용하여 SQL 주입 및 무차별 적 공격에 대한 MySQL 보안에 대해 논의합니다 (159 자)

See all articles