创建视图
语法格式
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_no
、st_name
、st_sex
、st_department
,对应投影输出视图字段名分别为id
、name
、sex
、department
。sqlCREATE VIEW student_view (id, name, sex, department) AS SELECT st_no, st_name, st_sex, st_department FROM student;
示例2
创建与原视图同名的视图,不会对原视图产生影响。sqlSQL> 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|