mysql中视图

#以表中的"name,age"创建视图.
mysql> select * from student;
+-----+--------+------+------+
| SNO | SNAME  | AGE  | SEX  |
+-----+--------+------+------+
| 1   | 换换   |   23 | 男   |
| 2   | 刘丽   |   22 | 女   |
| 4   | NULL   |   10 | NULL |
| 5   | 张友   |   22 | 男   |
| 6   | 刘力   |   22 | 男   |
+-----+--------+------+------+
5 rows in set (0.00 sec)

#创建视图stage.
mysql> create view stage as select sname,age from student;
Query OK, 0 rows affected (0.02 sec)

#查看视图(如果直接看,很难看出是视图还是表).
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| boy            |
| boy2           |
| boy3           |
| course         |
| sc             |
| stage          |
| student        |
+----------------+
7 rows in set (0.00 sec)

#查看视图中的数据.
mysql> select * from stage;
+--------+------+
| sname  | age  |
+--------+------+
| 换换   |   23 |
| 刘丽   |   22 |
| NULL   |   10 |
| 张友   |   22 |
| 刘力   |   22 |
+--------+------+
5 rows in set (0.00 sec)

#表中的数据如下:
mysql> select * from sc;
+-----+-----+-------+
| SNO | CNO | SCORE |
+-----+-----+-------+
| 1   | K1  |    83 |
| 2   | K1  |    85 |
| 2   | K5  |    90 |
| 5   | K1  |    92 |
| 5   | K5  |    84 |
| 5   | K8  |    80 |
+-----+-----+-------+
6 rows in set (0.00 sec)

#分组算表中的平均值,取最大的值.
mysql> select cno,avg(score)  from sc group by cno;
+-----+------------+
| cno | avg(score) |
+-----+------------+
| K1  |    86.6667 |
| K5  |    87.0000 |
| K8  |    80.0000 |
+-----+------------+
3 rows in set (0.00 sec)

#求平均值.
mysql> select cno,avg(score) as pj from sc group by cno;
+-----+---------+
| cno | pj      |
+-----+---------+
| K1  | 86.6667 |
| K5  | 87.0000 |
| K8  | 80.0000 |
+-----+---------+
3 rows in set (0.00 sec)

#查询平均值中最大的值.
mysql> select cno,avg(score) as pj from sc group by cno order by pj desc limit 1;
+-----+---------+
| cno | pj      |
+-----+---------+
| K5  | 87.0000 |
+-----+---------+
1 row in set (0.00 sec)

#直接创建视图"pj",然后队视图进行排序,就比较简单.
mysql> create view pj as select cno,avg(score) as pj from sc group by cno;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from pj;
+-----+---------+
| cno | pj      |
+-----+---------+
| K1  | 86.6667 |
| K5  | 87.0000 |
| K8  | 80.0000 |
+-----+---------+
3 rows in set (0.00 sec)
mysql> select * from pj order by pj desc limit 1;
+-----+---------+
| cno | pj      |
+-----+---------+
| K5  | 87.0000 |
+-----+---------+
1 row in set (0.00 sec)


修改视图虚拟表,物理表会变?
#表中的数据如下:
mysql> select * from sc;
+-----+-----+-------+
| SNO | CNO | SCORE |
+-----+-----+-------+
| 1   | K1  |    83 |
| 2   | K1  |    85 |
| 2   | K5  |    90 |
| 5   | K1  |    92 |
| 5   | K5  |    84 |
| 5   | K8  |    80 |
+-----+-----+-------+
6 rows in set (0.00 sec)

#创建视图"sc2"存放表sc中sno,score的值.
mysql> create view sc2 as select sno,score from sc;
Query OK, 0 rows affected (0.01 sec)

#查看视图中的数据.
mysql> select * from sc2;
+-----+-------+
| sno | score |
+-----+-------+
| 1   |    83 |
| 2   |    85 |
| 2   |    90 |
| 5   |    92 |
| 5   |    84 |
| 5   |    80 |
+-----+-------+
6 rows in set (0.00 sec)

#更新视图sc2中的数据.
mysql> update sc2 set score=99 where sno=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

#查看视图中的数据已经改变.
mysql> select * from sc2;
+-----+-------+
| sno | score |
+-----+-------+
| 1   |    99 |
| 2   |    85 |
| 2   |    90 |
| 5   |    92 |
| 5   |    84 |
| 5   |    80 |
+-----+-------+
6 rows in set (0.00 sec)

#查看物理表中的数据也已经改变.
mysql> select * from sc;
+-----+-----+-------+
| SNO | CNO | SCORE |
+-----+-----+-------+
| 1   | K1  |    99 |
| 2   | K1  |    85 |
| 2   | K5  |    90 |
| 5   | K1  |    92 |
| 5   | K5  |    84 |
| 5   | K8  |    80 |
+-----+-----+-------+
6 rows in set (0.00 sec)


如果修改虚拟表中的平均值,物理表中的数据会怎么变?
#查看之前虚拟视图中的平均值.
mysql> select * from pj;
+-----+---------+
| cno | pj      |
+-----+---------+
| K1  | 92.0000 |
| K5  | 87.0000 |
| K8  | 80.0000 |
+-----+---------+
3 rows in set (0.00 sec)
#修改视图中的平均值,查看结果如何.
mysql> update pj set pj=90 where cno="k8";
ERROR 1288 (HY000): The target table pj of the UPDATE is not updatable
mysql> 
注意:报错提示不能更新修改平均值.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章