Oracle数据库视图基础详细教程
视图是数据库开发中非常有用的工具,能够简化复杂查询、提升数据安全性和增强数据库的灵活性。在使用视图时,需要考虑其性能和可更新性问题,根据实际业务场景合理使用。
目录
视图的概念:
视图(view)类似一个虚表,建立与基表之上。不会占用物理的空间(还有一种占用物理空间的视图叫做物化视图MATERIALIZED VIEW,物化视图又称快照),视图的定义语句会存储在数据字典中,会根据基表的更新而更新数据,而一个视图当然也可以从另一个视图中产生,相当于把一个SQL语句打包起来然后起一个别名,在你查询这个视图内容的时候,视图对应的SQL会再执行一次,然后把结果反馈给你,也就是将你写的SQL的结果封装成一张虚拟表,基于它创建时指定的SQL语句返回的结果集。
需要注意的是,对于视图的操作其实是对视图对应SQL内字段所属基表的操作,虽然可能会受到一些限制。单表视图是可以增删改的。
在 Oracle 数据库中,视图(View)是一种虚拟表,它并不存储数据,而是通过查询基础表中的数据生成的。视图可以简化复杂查询、提高数据的安全性、为用户隐藏复杂的表结构等。
视图的优点:
1.便捷整合:不用害怕丢失SQL语句。对于需要多次执行的SQL,在权限允许的情况下也可以建一个视图。有些SQL分组统计以后需要连接另一张表,那么就可以建一个视图用视图去连接。
2.保密:有些表内的隐私字段或敏感字段,如果不希望使用者看见,就可以把使用者需要使用的字段创建一个视图。这样使用者就不知道基表,以及基表的表结构
3.简化权限:不用对于不同用户去授予表字段权限,而是直接建视图,将视图的权限给对应用户就可以。
视图的缺点:
1.耗费时间:因为需要把视图的查询转换为基本表的查询。
2.修改不便:需要把对于视图的操作转换为对基表的操作,简单的视图会比较方便但是复杂视图会繁琐和限制比较多。
单表视图:增删改查
多表视图:只能修改和查询
视图与表的区别:
1. 视图不占用物理空间,但表占用物理空间。
2. 表存储数据内容,而视图仅是数据的展现方式。
3. 创建或删除视图只会影响视图本身,不会影响基础表。
下面是关于 Oracle 数据库中视图的概念及创建的详细教程。
视图的创建及用法:
1.创建视图的语法:
CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
语法详解:
CREATE VIEW
:用于创建一个新视图。OR REPLACE
:可选项,若视图已存在则替换。view_name
:视图名称,必须唯一。SELECT
语句:定义视图的查询逻辑。WHERE
子句:条件筛选,定义从基础表中查询哪些数据。
2. 创建简单视图:
例如,我们有一个名为 employees
的表,包含以下字段:
employee_id
first_name
last_name
salary
department_id
我们希望创建一个只显示 first_name
、last_name
和 salary
的视图,可以使用以下 SQL:
CREATE VIEW employee_salaries AS
SELECT first_name, last_name, salary
FROM employees;
3.带条件的视图:
如果希望创建一个只显示薪水大于 5000 的员工视图,可以加上 WHERE
条件:
CREATE VIEW high_salary_employees AS
SELECT first_name, last_name, salary
FROM employees
WHERE salary > 5000;
4.更新视图(可更新视图):
有些视图是可更新的,即可以通过视图对基础表的数据进行插入、更新或删除。为了视图可更新,通常需要满足以下条件:
- 视图只基于一张表。
- 视图中不包含聚合函数(如
SUM
、COUNT
)。 - 不使用
DISTINCT
、GROUP BY
、ORDER BY
。 - 没有
JOIN
。
例如,以下视图是可更新的:
CREATE VIEW updateable_view AS
SELECT employee_id, first_name, last_name, salary
FROM employees;
可以通过该视图更新基础表中的 salary
列:
UPDATE updateable_view
SET salary = 6000
WHERE employee_id = 101;
5.删除视图:
如果不再需要某个视图,可以使用 DROP VIEW
删除它:
DROP VIEW view_name;
例如,删除 employee_salaries
视图:
DROP VIEW employee_salaries;
视图的示例:
示例一(简单视图):
假设我们有两张表:employees
(员工表)和 departments
(部门表),我们希望创建一个显示每个员工名字、薪资及其部门名称的视图:
CREATE VIEW employee_department AS
SELECT e.first_name, e.last_name, e.salary, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
通过这个视图,可以简化查询操作:
SELECT * FROM employee_department WHERE salary > 5000;
示例二(复杂视图):
复杂视图通常涉及多个表的联结(JOIN
)、子查询、聚合函数(SUM
、COUNT
等)和条件过滤等操作。为了演示复杂视图,假设我们有以下三个表:
-
employees(员工表)
employee_id
:员工IDfirst_name
:名字last_name
:姓氏department_id
:部门IDsalary
:薪水
-
departments(部门表)
department_id
:部门IDdepartment_name
:部门名称manager_id
:部门经理ID
-
projects(项目表)
project_id
:项目IDproject_name
:项目名称department_id
:负责该项目的部门ID
目标:我们想创建一个视图,展示每个部门的员工总数、部门名称、部门经理名字、该部门员工的平均薪水,以及负责的项目名称。
SQL 代码:
CREATE OR REPLACE VIEW department_summary AS
SELECT
d.department_name,
CONCAT(m.first_name, ' ', m.last_name) AS manager_name,
COUNT(e.employee_id) AS total_employees,
AVG(e.salary) AS average_salary,
LISTAGG(p.project_name, ', ') WITHIN GROUP (ORDER BY p.project_name) AS project_names
FROM
departments d
LEFT JOIN
employees e ON d.department_id = e.department_id
LEFT JOIN
employees m ON d.manager_id = m.employee_id
LEFT JOIN
projects p ON d.department_id = p.department_id
GROUP BY
d.department_name, m.first_name, m.last_name;
解释:
-
基本查询结构:
departments d
是主表。- 通过
LEFT JOIN
连接了employees e
,使得每个部门与它的员工关联起来。 - 通过
LEFT JOIN
连接了employees m
,从而获取该部门经理的信息(通过manager_id
和employee_id
的关联)。 - 通过
LEFT JOIN
连接了projects p
,获取每个部门负责的项目名称。
-
聚合函数:
COUNT(e.employee_id)
:统计每个部门的员工总数。AVG(e.salary)
:计算每个部门的员工平均薪水。
-
字符串拼接(LISTAGG):
LISTAGG(p.project_name, ', ')
:将同一部门的多个项目名称拼接成一行,以逗号分隔,并按项目名称排序。
-
GROUP BY:
- 根据
department_name
和部门经理的名字(m.first_name, m.last_name
)进行分组,这样我们可以对每个部门进行聚合操作。
- 根据
使用视图:
我们可以通过视图查询每个部门的概要信息:
SELECT * FROM department_summary;
示例结果:
department_name | manager_name | total_employees | average_salary | project_names |
---|---|---|---|---|
IT | Alice Johnson | 10 | 7000 | Project A, Project B, Project C |
HR | Bob Smith | 5 | 5500 | Employee Onboarding |
Sales | Carol Miller | 8 | 6200 | Client Acquisition, Sales Drive |
关键点:
- 复杂性:视图涉及多个表的联结,使用了聚合函数、字符串拼接等复杂操作。
- 性能:如果涉及的数据量较大,复杂视图的性能可能会受影响,尤其是
JOIN
操作较多时。 - 可读性:将复杂的 SQL 逻辑封装在视图中,能够提高代码的可读性,简化查询操作。
总结:
视图是数据库开发中非常有用的工具,能够简化复杂查询、提升数据安全性和增强数据库的灵活性。在使用视图时,需要考虑其性能和可更新性问题,根据实际业务场景合理使用。
更多推荐
所有评论(0)