SQL中的视图是一种虚拟表。视图还具有行和列,因为它们位于数据库中的实际表中。我们可以通过从数据库中存在的一个或多个表中选择字段来创建视图。视图可以包含表的所有行或基于特定条件的特定行。
在本文中,我们将学习如何创建,删除和更新视图。
样本表的SQL
-- ----------------------------
-- Table structure for studentdetails
-- ----------------------------
DROP TABLE IF EXISTS `studentdetails`;
CREATE TABLE `studentdetails` (
`S_ID` bigint(20) NOT NULL,
`NAME` varchar(255) NOT NULL,
`ADDRESS` varchar(255) NOT NULL,
PRIMARY KEY (`S_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of studentdetails
-- ----------------------------
INSERT INTO `studentdetails` VALUES ('1', 'Harsh', '河南平顶山');
INSERT INTO `studentdetails` VALUES ('2', 'Ashish', '河南南阳');
INSERT INTO `studentdetails` VALUES ('3', 'Pratik', '河南郑州');
INSERT INTO `studentdetails` VALUES ('4', 'Dhanraj', '河南驻马店');
INSERT INTO `studentdetails` VALUES ('5', 'Ram', '河南许昌');
-- ----------------------------
-- Table structure for studentmarks
-- ----------------------------
DROP TABLE IF EXISTS `studentmarks`;
CREATE TABLE `studentmarks` (
`ID` bigint(20) NOT NULL,
`NAME` varchar(255) NOT NULL,
`MARKS` int(11) NOT NULL,
`AGE` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of studentmarks
-- ----------------------------
INSERT INTO `studentmarks` VALUES ('1', 'Harsh', '90', '19');
INSERT INTO `studentmarks` VALUES ('2', 'Suresh', '50', '20');
INSERT INTO `studentmarks` VALUES ('3', 'Pratik', '80', '19');
INSERT INTO `studentmarks` VALUES ('4', 'Dhanraj', '95', '21');
INSERT INTO `studentmarks` VALUES ('5', 'Ram', '85', '18');
创建视图
我们可以使用 create view来创建视图,视图的数据可以来自一个或多个表。
创建视图的句法:
CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE condition;
view_name(视图名): Name for the View
table_name (表名字): Name of the table
condition(表查询条件): Condition to select rows
示例:
- 从单个表创建视图:
1.在这个例子中,我们将从表StudentDetails创建一个名为detailsview的View。
CREATE VIEW detailsview AS
SELECT t.NAME, t.ADDRESS
FROM studentdetails t
WHERE t.S_ID < 5;
要查看视图中的数据,我们可以按查询表的相同方式查询视图
SELECT * FROM DetailsView;
输出:
2.在此示例中,我们将从表StudentDetails创建名为StudentNames的视图。
CREATE VIEW studentnames AS
SELECT t.S_ID, t.NAME
FROM StudentDetails t
ORDER BY t.NAME;
查询视图
SELECT * FROM studentnames ;
输出结果
- 从多个表创建视图:
在此示例中,我们将从两个表StudentDetails和StudentMarks创建一个名为MarksView的视图。要从多个表创建View,我们可以在SELECT语句中简单地包含多个表。查询:
CREATE VIEW marksview AS
SELECT t.NAME, t.ADDRESS, p.MARKS
FROM studentdetails t, studentmarks p
WHERE t.NAME = p.NAME;
查询marksview视图的数据
SELECT * FROM marksview;
输出
删除视图
SQL允许我们删除现有的View。我们可以使用DROP语句删除或删除View。
语法:
DROP VIEW view_name;
view_name:我们要删除的视图的名称。
例如,如果我们要删除视图marksview:
DROP VIEW marksview;
更新视图
更新视图需要满足某些条件。如果这些条件中的任何一个没有满足,那么我们将不会被允许更新视图。
- 用于创建视图的SELECT语句不应包含GROUP BY子句或ORDER BY子句。
- SELECT语句不应包含DISTINCT关键字。
- 视图应具有所有NOT NULL值。
- 不应使用嵌套查询或复杂查询创建视图。
- 应该从单个表创建视图。如果使用多个表创建视图,则不允许我们更新视图。
- 我们可以使用CREATE OR REPLACE VIEW语句在视图中添加或删除字段。
语法如下:
CREATE OR REPLACE VIEW view_name AS
SELECT column1,coulmn2,..
FROM table_name
WHERE condition;
view_name :视图名
table_name :表名
condition :条件
例如,如果我们想要更新视图marksview并将字段AGE从studentmarks表添加到此视图,我们可以这样做:
CREATE OR REPLACE VIEW marksview AS
SELECT t.NAME, t.ADDRESS, p.MARKS, p.AGE
FROM StudentDetails t, StudentMarks p
WHERE t.NAME = p.NAME;
查询marksview视图:
SELECT * FROM marksview;
输出
视图中插入行
我们可以在视图中以与在表格中相同的方式插入行。我们可以使用SQL的INSERT INTO语句在视图中插入一行。语法:
INSERT view_name(column1,column2,column3,..)
VALUES(value1,value2,value3 ..);
view_name:视图的名称
示例:
在下面的示例中,我们将在视图detailsview中插入一个新行,我们在上面创建的“从单个表创建视图”的示例中
INSERT INTO detailsview(NAME, ADDRESS)
VALUES("Lisi","河南洛阳");
从视图中删除行
只需从表中删除行即可。我们可以使用SQL的DELETE语句从视图中删除行。同样从视图中删除行首先从实际表中删除该行,然后更改将反映在视图中。语法:
DELETE FROM view_name
WHERE condition;
view_name : 视图名
condition : 条件
示例:
在此示例中,我们将从上面的插入行示例中添加的视图detailsview中删除名字是“Lisi”的数据。
DELETE FROM detailsview
WHERE NAME="Lisi";
SQL中的WITH CHECK OPTION子句是一个非常有用的视图子句。它适用于可更新视图。如果视图不可更新,则没有在CREATE VIEW语句中包含此子句的含义。
- WITH CHECK OPTION子句用于防止在视图中插入行,其中不满足CREATE VIEW语句中WHERE子句中的条件。
- 如果我们在CREATE VIEW语句中使用了WITH CHECK OPTION子句,并且如果UPDATE或INSERT子句不满足条件,那么它们将返回错误。
示例:
在下面的示例中,我们使用WITH CHECK OPTION子句从StudentDetails表创建View SampleView。
CREATE VIEW sampleview AS
SELECT S_ID, NAME
FROM studentdetails
WHERE NAME IS NOT NULL
WITH CHECK OPTION;
在此视图中,如果我们现在尝试在NAME列中插入一个具有空值的新行,那么它将产生错误,因为创建的视图的条件为NAME列为NOT NULL。
例如,尽管View是可更新的,但是此视图的以下查询也无效:
INSERT INTO sampleview(S_ID)
VALUES(6);
注意:NAME列的默认值为null。
本文章参考了大量的原博客主人Harsh Agarwal的博客。我感觉写的很好,适合初级入门。