本节将通过一个应用案例让读者熟练掌握在实际开发中创建并使用视图的完整过程。
掌握视图的创建、查询、更新和删除操作。
假如有来自河北和山东的三个理科学生报考北京大学(Peking University)和清华大学(Tsinghua University),现在需要对其考试的结果进行查询和管理,清华大学的录取分数线为 725,北京大学的录取分数线为 720。需要创建三个表对学生的信息进行管理,这三个表分别是学生表、报名表和成绩表,其中这三个表的主键(sid)是统一的。
stu表结构
字段名 | 数据结构 | 主键 | 外键 | 非空 | 唯一 | 自增 |
s_id | INT(11) | 是 | 否 | 是 | 是 | 否 |
s_name | VARCHAR(20) | 否 | 否 | 是 | 否 | 否 |
addr | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 |
tel | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 |
sign表结构
字段名 | 数据结构 | 主键 | 外键 | 非空 | 唯一 | 自增 |
s_id | INT(11) | 是 | 否 | 是 | 是 | 否 |
s_name | VARCHAR(20) | 否 | 否 | 是 | 否 | 否 |
s_sch | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 |
s_sign_sch | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 |
stu_mark 表结构
字段名 | 数据结构 | 主键 | 外键 | 非空 | 唯一 | 自增 |
s_id | INT(11) | 是 | 否 | 是 | 是 | 否 |
s_name | VARCHAR(20) | 否 | 否 | 是 | 否 | 否 |
mark | INT(11) | 否 | 否 | 是 | 否 | 否 |
stu 表数据
s_id | s_name | addr | tel |
1 | ZhangPeng | Heibei | 13889075861 |
2 | LiXiao | Shandong | 13953508223 |
3 | HuangYun | Shandong | 13905350996 |
sign 表数据
s_id | s_name | s_sch | s_sign_sch |
1 | ZhangPeng | High School1 | Peking University |
2 | LiXiao | High School2 | Peking University |
3 | HuangYun | High School3 | Tsing University |
mark 表数据
s_id | s_name | mark |
1 | ZhangPeng | 730 |
2 | LiXiao | 725 |
3 | HuangYun | 736 |
mysql> CREATE TABLE stu(
-> s_id INT(11) PRIMARY KEY,
-> s_name VARCHAR(20) NOT NULL,
-> addr VARCHAR(50) NOT NULL,
-> tel VARCHAR(50) NOT NULL
-> );
Query OK, 0 rows affected (0.05 sec)
上述 SQL语句执行成功后,表示学生表 stu 创建成功,这时,使用 INSERT 语句向表中插入数据,SQL语句如下所示:
mysql> INSERT INTO stu
-> VALUES (1,'zhangPeng','Hebei','13889075861'),
-> (2,'Lixiao','shandong','13953508223'),
-> (3,'HuangYun','Shandong','13905350996');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
上述 INSERT 语句执行成功后,向表中插入了三条记录,分别是学生的学号、姓名所在省份和电话号码,这时,使用 SELECT 语句查看 stu 表中的数据信息,查询结果如下所示:
mysql> SELECT * FROM stu;
+------+-----------+----------+-------------+
| s_id | s_name | addr | tel |
+------+-----------+----------+-------------+
| 1 | zhangPeng | Hebei | 13889075861 |
| 2 | Lixiao | shandong | 13953508223 |
| 3 | HuangYun | Shandong | 13905350996 |
+------+-----------+----------+-------------+
3 rows in set (0.00 sec)
从查询结果可以看出,在当前的数据库中创建了一个 stu表,并成功插入了三条记录,stu 表的主键为s_id。
首先创建报名表 sign,SQL 语句如下所示:
mysql> CREATE TABLE sign(
-> s_id INT(11) PRIMARY KEY,
-> s_name VARCHAR(20) NOT NULL,
-> s_sch VARCHAR(50) NOT NULL,
-> s_sign_sch VARCHAR(50) NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
上述 SQL语句执行成功后,表示报名表 sign 创建成功,接下来,使用 INSERT 语句向 sign 表中插人数据,SQL语句如下所示:
mysql> INSERT INTO sign
-> VALUES (1,'ZhangPeng','High School1','Peking University'),
-> (2,'LiXiao','High sehool2','Peking University'),
-> (3,'HuangYun','High School3','Tsinghua University');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
上述 SQL语句执行成功后,向表中插入了三条记录,分别是学生的学号、姓名、所在学校和报考的学校名称,这时,使用 SELECT 语句查看 sign 表中的数据信息,查询结果如下所示:
mysql> SELECT * FROM sign;
+------+-----------+--------------+---------------------+
| s_id | s_name | s_sch | s_sign_sch |
+------+-----------+--------------+---------------------+
| 1 | ZhangPeng | High School1 | Peking University |
| 2 | LiXiao | High sehool2 | Peking University |
| 3 | HuangYun | High School3 | Tsinghua University |
+------+-----------+--------------+---------------------+
3 rows in set (0.00 sec)
从查询结果可以看出,sign表创建成功,同时向表中插入了三条记录,sign 表的主键为s_id。
mysql> CREATE TABLE stu_mark(
-> s_id INT(11) PRIMARY KEY,
-> s_name VARCHAR(20) NOT NULL,
-> mark INT NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
上述 SQL语句执行成功后,表示成绩表 stu_mark 创建成功,这时,使用 INSERT 语句向表中插入数据,执行结果如下所示:
mysql> INSERT INTO stu_mark VALUES(1,'ZhangPeng',730),(2,'LiXiao',725),(3,'HuangYun',736);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
上述 SQL语句执行成功后,向表中插人了三条记录,分别是学生的学号、姓名和成绩,这时,使用 SELECT 语句查看 stu mark 表中的数据信息,查询结果如下所示:
mysql> SELECT * FROM stu_mark;;
+------+-----------+------+
| s_id | s_name | mark |
+------+-----------+------+
| 1 | ZhangPeng | 730 |
| 2 | LiXiao | 725 |
| 3 | HuangYun | 736 |
+------+-----------+------+
3 rows in set (0.00 sec)
从查询结果可以看出,stu_mark 表创建成功,同时向表中插人了三条记录,stu_mark表的主键为s_id。
视图的名称为 beida,视图的内容包含考上北大的学生学号、姓名、成绩和报考学校名称4个字段,创建 beida 视图的 SQL 语句如下所示:
mysql> CREATE
-> VIEW beida(id,name,mark,sch)
-> AS
-> SELECT stu_mark.s_id,stu_mark.s_name,stu_mark.mark,sign.s_sign_sch
-> FROM stu_mark,sign
-> WHERE stu_mark.s_id=sign.s_id
-> AND stu_mark.mark >= 720
-> AND sign.s_sign_sch='PeKing University';
Query OK, 0 rows affected (0.01 sec)
上述 SQL语句执行成功后,接下来,使用查询语句查看满足条件的学生信息,执行结果如下所示:
mysql> SELECT * FROM beida;
+----+-----------+------+-------------------+
| id | name | mark | sch |
+----+-----------+------+-------------------+
| 1 | ZhangPeng | 730 | Peking University |
| 2 | LiXiao | 725 | Peking University |
+----+-----------+------+-------------------+
2 rows in set (0.00 sec)
从上述查询结果可以看出,符合北京大学录取条件的有两名学员,分别是ZhangPeng 和 LiXiao,他们的成绩分别是 730 分和 725 分。
视图的名称为 qinghua,视图的内容包含考上清华的学生学号、姓名、成绩和报考学校名称4个字段,创建 qinghua 视图的 SQL 语句如下所示:
mysql> CREATE
-> VIEW qinghua(id,name,mark,sch)
-> AS
-> SELECT stu_mark.s_id,stu_mark.s_name,stu_mark.mark,sign.s_sign_sch
-> FROM stu_mark,sign
-> WHERE stu_mark.s_id=sign.s_id
-> AND stu_mark.mark >= 725
-> AND sign.s_sign_sch='Tsinghua University';
Query OK, 0 rows affected (0.00 sec)
上述 SQL语句执行成功后,接下来使用查询语句查看满足条件的学生信息,执行结果如下所示:
mysql> SELECT * FROM qinghua;
+----+----------+------+---------------------+
| id | name | mark | sch |
+----+----------+------+---------------------+
| 3 | HuangYun | 736 | Tsinghua University |
+----+----------+------+---------------------+
1 row in set (0.00 sec)
从上述查询结果可以看出,符合清华大学录取条件的学员是HuangYun,他的成绩是 736分。
HuangYun 的成绩在录人的时候录入错误,多录了10分,接下来对 HuangYun 的成绩进行修改,减去多录入的10分。在视图中可以使用UPDATE语句对基本表 stu_mark的数据进行更新,更新的 SQL 语句如下所示:
mysql> UPDATE stu_mark SET mark=mark-10 WHERE stu_mark.s_name='HuangYun';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
上述 SQL 语句执行成功后,表示 stu_mark 表修改成功,这时,使用查询语句查看修改后的 stu_mark 表的数据,执行结果如下所示:
mysql> SELECT * FROM stu_mark;
+------+-----------+------+
| s_id | s_name | mark |
+------+-----------+------+
| 1 | ZhangPeng | 730 |
| 2 | LiXiao | 725 |
| 3 | HuangYun | 726 |
+------+-----------+------+
3 rows in set (0.00 sec)
从上述查询结果可以看出,s_name 值为 HuangYun 的学生成绩减去了多录的 10分,变为 726 分。接下来查看 qinghua 视图表中的信息情况,执行结果如下所示:
mysql> SELECT * FROM qinghua;
+----+----------+------+---------------------+
| id | name | mark | sch |
+----+----------+------+---------------------+
| 3 | HuangYun | 726 | Tsinghua University |
+----+----------+------+---------------------+
1 row in set (0.00 sec)
从上述的查询结果可以看出,HuangYun 同学的信息依然在 qinghua 视图中,因为清华大学的录取分数线是 725 分,虽然 HuangYun 同学减去了多录的 10 分,但依然以超出分数线一分的成绩,顺利被清华大学录取。