SQL 视图
SQL提供了视图的概念,它隐藏了数据的复杂性并限制了对数据库的不必要访问。它允许用户仅访问特定的列,而不是整个数据表。
结构化查询语言(SQL)中的视图被认为是虚拟表,它依赖于预定义SQL语句的结果集。
和SQL表一样,视图也以行和列的形式存储数据,但行在数据库中没有任何物理存在。
任何数据库管理员和用户都可以通过从一个或多个数据库表中选择列来轻松创建视图。根据需要,他们还可以删除和更新视图。
使用WHERE子句,视图可以存储表的所有记录或特定记录。
创建SQL视图
通过使用CREATE VIEW语句,您可以轻松地在结构化查询语言中创建视图。您可以从单个表或多个表中创建视图。
从单个表创建视图的语法
CREATE VIEW View_Name AS
SELECT Column_Name1, Column_Name2, ....., Column_NameN
FROM Table_Name
WHERE condition;
在语法中,View_Name是你想在SQL中创建的视图的名称。SELECT命令指定表的行和列,WHERE子句是可选的,用于从表中选择特定的记录。
从多个表创建视图的语法
你可以通过在SELECT语句中包含多个表来创建视图。
REATE VIEW View_Name AS
SELECT Table_Name1.Column_Name1, Table_Name1.Column_Name2, Table_Name2.Column_Name2, ....., Table_NameN.Column_NameN
FROM Table_Name1, Table_Name2, ....., Table_NameN
WHERE condition;
从单个表创建视图的示例
让我们考虑 Student_Details 表,它包含Stu_ID、Stu_Name、Stu_Subject和Stu_Marks列。Student_Details的数据显示在以下表中:
Student_ID | Stu_Name | Stu_Subject | Stu_Marks |
---|---|---|---|
1001 | Akhil | Math | 85 |
1002 | Balram | Science | 78 |
1003 | Bheem | Math | 87 |
1004 | Chetan | English | 95 |
1005 | Diksha | Hindi | 99 |
1006 | Raman | Computer | 90 |
1007 | Sheetal | Science | 68 |
表:学生详情
假设你想创建一个视图,包含那些分数大于85分的学生的学生ID、科目和分数。为此,你需要键入以下查询语句:
CREATE VIEW Student_View AS
SELECT Student_ID, Stu_Subject, Stu_Marks
FROM Student_Details
WHERE Stu_Marks > 85;
Select * FROM Student_View;
输出:
Student_ID | Stu_Subject | Stu_Marks |
---|---|---|
1001 | Math | 85 |
1003 | Math | 87 |
1004 | English | 95 |
1005 | Hindi | 99 |
1006 | Computer | 90 |
视图: 学生视图
从多个表创建视图示例
让我们考虑两个表, 学生详情表 和 教师详情表。 学生详情表包括学生ID,学生姓名,学生科目和学生成绩列。而教师详情表包括教师ID,教师姓名,教师科目和教师所在城市列。学生详情和教师详情的数据在下面的两个表中显示:
Student_ID | Stu_Name | Stu_Subject | Stu_Marks |
---|---|---|---|
1001 | Akhil | Math | 85 |
1002 | Balram | Science | 78 |
1003 | Bheem | Math | 87 |
1004 | Chetan | English | 95 |
1005 | Diksha | Hindi | 99 |
1006 | Raman | Computer | 90 |
1007 | Sheetal | Science | 68 |
表格:学生详情
Teacher_ID | Teacher_Name | Teacher_Subject | Teacher_City |
---|---|---|---|
2001 | Arun | Math | Gurgaon |
2002 | Manoj | Science | Delhi |
2003 | Reena | SST | Noida |
2004 | Parul | English | Gurgaon |
2005 | Nishi | Hindi | Noida |
2006 | Anuj | Computer | Delhi |
2007 | Ram | Physical Education | Delhi |
表:Teacher_Details
假设您想从Student_Details和Teacher_Details表中创建一个具有Stu_ID、Stu_Name、Teacher_ID和Teacher_Subject列的视图。
CREATE VIEW Student_Teacher_View AS
SELECT Student_Details.Student_ID, Student_Details.Stu_Name, Teacher_Details.Teacher_ID, Teacher_Details.Teacher_Subject
FROM Student_Details, Teacher_Details
WHERE Student_Details.Stu_Subject = Teacher_Details.Teacher_Subject;
要显示Student_Teacher_View的数据,您需要输入以下SELECT查询语句:
Select * FROM Student_Teacher_View;
输出:
Student_ID | Stu_Name | Teacher_ID | Teacher_Subject |
---|---|---|---|
1001 | Akhil | 2001 | Math |
1002 | Balram | 2002 | Science |
1004 | Chetan | 2004 | English |
1005 | Diksha | 2005 | Hindi |
1006 | Raman | 2006 | Computer |
查看:学生教师查看
更新SQL视图
我们还可以使用结构化查询语言修改现有数据,并将新记录插入视图中。在SQL中,只有符合以下条件的视图才能被修改:
- 只有依赖于一张表的视图可以被更新。SQL不允许更新依赖于多张表的视图。
- 视图的字段不应包含NULL值。
- 视图的定义中不能包含子查询和DISTINCT关键字。
- 如果用于创建视图的SELECT语句中包含JOIN或HAVING或GROUP BY子句,视图将无法进行更新。
- 如果视图的任何字段包含任何SQL聚合函数,则无法修改该视图。
更新视图的语法
CREATE OR REPLACE VIEW View_Name AS
SELECT Column_Name1, Column_Name2, ....., Column_NameN
FROM Table_Name
WHERE condition;
示例-更新视图
如果我们想要更新上述的Student_View,并且将Student表中的Stu_Name属性添加到该视图中,您需在SQL中键入以下的Replace查询语句:
CREATE OR REPLACE VIEW Student_View AS
SELECT Student_ID, Stu_Name, Stu_Subject, Stu_Marks
FROM Student_Details
WHERE Stu_Subject = 'Math';
上述语句更新现有的Student_View,并根据SELECT语句更新数据。
现在,您可以通过输入以下查询来查看虚拟表:
SELECT * FROM Student_View;
输出:
Student_ID | Stu_Name | Stu_Subject | Stu_Marks |
---|---|---|---|
1001 | Akhil | Math | 85 |
1003 | Bheem | Math | 87 |
查看:Student_View
将新行插入现有视图
就像数据库表的插入过程一样,我们也可以在视图中插入记录。以下SQL INSERT语句用于在视图中插入新行或记录:
INSERT INTO View_Name(Column_Name1, Column_Name2 , Column_Name3, ....., Column_NameN) VALUES(value1, value2, value3, ...., valueN);
在视图中插入新记录的示例
假设您想要在Student_View中插入一位新学生的记录,那么您需要在SQL中编写以下查询:
INSERT INTO Student_View (Student_ID, Stu_Subject, Stu_Marks) VALUES (1007, Hindi, 89);
现在,你可以通过以下查询检查新记录是否插入了Student_View中:
SELECT * FROM Student_View;
输出:
Student_ID | Stu_Subject | Stu_Marks |
---|---|---|
1001 | Math | 85 |
1003 | Math | 87 |
1004 | English | 95 |
1005 | Hindi | 99 |
1006 | Computer | 90 |
1007 | Hindi | 89 |
视图:Student_View
从视图中删除现有行
就像删除数据库表的过程一样,我们也可以从视图中删除记录。以下SQL DELETE语句用于从视图中删除现有行或记录:
DELETE FROM View_Name WHERE Condition;
示例:从视图中删除记录
假设您想要删除Student_View中科目为数学的学生记录,则需要键入以下SQL查询:
DELETE FROM Student_View WHERE Stu_Subject = 'Math' ;
现在,您可以使用以下查询检查记录是否已从Student_View中删除:
SELECT * FROM Student_View;
输出:
Student_ID | Stu_Subject | Stu_Marks |
---|---|---|
1004 | English | 95 |
1005 | Hindi | 99 |
1006 | Computer | 90 |
1007 | Hindi | 89 |
查看:学生视图
删除视图
如果不再需要,我们还可以从数据库中删除现有的视图。使用以下SQL DROP语句删除视图:
DROP VIEW View_Name;
删除视图示例
假设你想删除上面的Student_View,那么你需要在结构化查询语言中键入以下查询:
DROP VIEW Student_View;