目录

视图的概念:

     视图的优点:

    视图的缺点:

   视图与表的区别:

视图的创建及用法:

1.创建视图的语法:

2. 创建简单视图:

3.带条件的视图:

4.更新视图(可更新视图):

5.删除视图:

视图的示例:

示例一(简单视图):

    示例二(复杂视图):

解释:

使用视图:

示例结果:

关键点:

   总结:

视图的概念:

视图(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_namelast_namesalary 的视图,可以使用以下 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.更新视图(可更新视图):

有些视图是可更新的,即可以通过视图对基础表的数据进行插入、更新或删除。为了视图可更新,通常需要满足以下条件:

  • 视图只基于一张表。
  • 视图中不包含聚合函数(如 SUMCOUNT)。
  • 不使用 DISTINCTGROUP BYORDER 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)、子查询、聚合函数(SUMCOUNT 等)和条件过滤等操作。为了演示复杂视图,假设我们有以下三个表:

  1. employees(员工表)

    • employee_id:员工ID
    • first_name:名字
    • last_name:姓氏
    • department_id:部门ID
    • salary:薪水
  2. departments(部门表)

    • department_id:部门ID
    • department_name:部门名称
    • manager_id:部门经理ID
  3. projects(项目表)

    • project_id:项目ID
    • project_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;
解释:
  1. 基本查询结构

    • departments d 是主表。
    • 通过 LEFT JOIN 连接了 employees e,使得每个部门与它的员工关联起来。
    • 通过 LEFT JOIN 连接了 employees m,从而获取该部门经理的信息(通过 manager_idemployee_id 的关联)。
    • 通过 LEFT JOIN 连接了 projects p,获取每个部门负责的项目名称。
  2. 聚合函数

    • COUNT(e.employee_id):统计每个部门的员工总数。
    • AVG(e.salary):计算每个部门的员工平均薪水。
  3. 字符串拼接(LISTAGG)

    • LISTAGG(p.project_name, ', '):将同一部门的多个项目名称拼接成一行,以逗号分隔,并按项目名称排序。
  4. GROUP BY

    • 根据 department_name 和部门经理的名字(m.first_name, m.last_name)进行分组,这样我们可以对每个部门进行聚合操作。
使用视图:

我们可以通过视图查询每个部门的概要信息:

SELECT * FROM department_summary;
示例结果:
department_namemanager_nametotal_employeesaverage_salaryproject_names
ITAlice Johnson107000Project A, Project B, Project C
HRBob Smith55500Employee Onboarding
SalesCarol Miller86200Client Acquisition, Sales Drive
关键点:
  • 复杂性:视图涉及多个表的联结,使用了聚合函数、字符串拼接等复杂操作。
  • 性能:如果涉及的数据量较大,复杂视图的性能可能会受影响,尤其是 JOIN 操作较多时。
  • 可读性:将复杂的 SQL 逻辑封装在视图中,能够提高代码的可读性,简化查询操作。

总结:

视图是数据库开发中非常有用的工具,能够简化复杂查询、提升数据安全性和增强数据库的灵活性。在使用视图时,需要考虑其性能和可更新性问题,根据实际业务场景合理使用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐