Skip to content

创建视图

语法格式

sql
ViewStmt ::= 
    CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name 
    [opt_column_list] 
    AS {SelectStmt | joined_table | '(' joined_table ')' alias_clause}
    [view_opt] 
    [opt_comment]

view_opt ::= 
    | WITH READ ONLY
    | WITH CHECK OPTION

参数说明

  • [OR REPLACE]:指定视图存在则替换,用于更新视图定义。
  • [IF NOT EXISTS]:创建视图时存在同名视图则忽略错误,该关键字无法验证已有同名视图与当前创建视图结构一致。
  • view_name:视图名。
  • [opt_column_list]:指定视图中各字段名,当不指定时,字段名将从SELECT子句中抽取,若SELECT子句中的输出项目不是字段而是表达式,则视图字段名将由系统生成,视图创建者可根据实际情况选择是否指定视图字段名。
  • SelectStmt:SELECT子句,定义了视图的数据来源。
  • joined_table:表连接结构。
  • '(' joined_table ')' alias_clause:JOIN操作后的结果集以及指定的临时表别名。
  • [view_opt]:视图可执行操作选项。
    • WITH READ ONLY:创建的视图是只读视图,不能进行更新、插入、删除操作。
    • WITH CHECK OPTION:可以进行插入和更新操作,但应该满足WHERE子句的条件。
  • [opt_comment]:对视图进行注释。

示例

  • 示例1
    创建名为student_view的视图用于展示学生的基本信息。基表为学生信息表student,基表的字段分别为st_nost_namest_sexst_department,对应投影输出视图字段名分别为idnamesexdepartment

    sql
    CREATE VIEW student_view (id, name, sex, department) AS SELECT st_no, st_name, st_sex, st_department FROM student;
  • 示例2
    创建与原视图同名的视图,不会对原视图产生影响。

    sql
    SQL> CREATE TABLE test_view_tab1(id INT, name VARCHAR);
    SQL> CREATE VIEW view1 AS SELECT * FROM test_view_tab1;
    SQL> SELECT * FROM VIEW1;
    ID	|NAME
    -----------
    
    SQL> CREATE VIEW view1 AS SELECT id FROM test_view_tab1; -- 创建一个与原始图列不同的视图,此处会返回警告
    SQL> SELECT * FROM VIEW1; -- 不会对原存储过程产生影响
    ID	|NAME
    -----------
  • 示例3
    创建一个视图,将多个表通过内连接合并,查询最终结果。

    sql
    -- 表1:存储用户基本信息
    SQL> CREATE TABLE table1 (
        id INT PRIMARY KEY,
        name VARCHAR(50),
        email VARCHAR(100)
    );
    
    -- 表2:存储用户的订单信息
    SQL> CREATE TABLE table2 (
        order_id INT PRIMARY KEY,
        user_id INT,          -- 外键关联到 table1.id
        product VARCHAR(50),
        FOREIGN KEY (user_id) REFERENCES table1(id)
    );
    
    -- 表3:存储订单的物流信息
    SQL> CREATE TABLE table3 (
        tracking_id INT PRIMARY KEY,
        order_id INT,
        status VARCHAR(20),
        FOREIGN KEY (order_id) REFERENCES table2(order_id)   -- 外键关联到 table2.order_id
    );
    
    -- 向 table1 插入用户数据
    SQL> INSERT INTO table1 (id, name, email) VALUES(1, 'Alice', 'alice@example.com'), (2, 'Bob', 'bob@example.com');
    
    -- 向 table2 插入订单数据
    SQL> INSERT INTO table2 (order_id, user_id, product) VALUES(101, 1, 'Laptop'), (102, 1, 'Phone'), (103, 2, 'Tablet');
    
    -- 向 table3 插入物流数据
    SQL> INSERT INTO table3 (tracking_id, order_id, status) VALUES(1001, 101, 'Shipped'), (1002, 102, 'Pending'), (1003, 103, 'Delivered');
    
    SQL> CREATE VIEW alice_orders_with_tracking AS
    SELECT 
      t1.id AS user_id,
      t1.name,
      t1.email,
      t1.order_id AS t1_order_id,  -- 来自 table2 的 order_id
      table3.order_id AS table3_order_id,  -- 来自 table3 的 order_id
      t1.product,
      table3.tracking_id,
      table3.status
    FROM (
      (table1 JOIN table2 ON table1.id = table2.user_id) AS t1 
      JOIN table3 ON t1.order_id = table3.order_id
    ) 
    WHERE t1.name = 'Alice' WITH CHECK OPTION COMMENT 'Alice的订单信息';
    
    SQL> SELECT*FROM alice_orders_with_tracking;
    
    USER_ID | NAME | EMAIL | T1_ORDER_ID | TABLE3_ORDER_ID | PRODUCT | TRACKING_ID | STATUS | 
    ------------------------------------------------------------------------------
    1 | Alice| alice@example.com| 101 | 101 | Laptop| 1001 | Shipped|
    1 | Alice| alice@example.com| 102 | 102 | Phone| 1002 | Pending|