数据库:mysql内置功能-视图

一 视图

视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。

使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

#两张有关系的表
mysql> select * from course;
+-----+--------+------------+
| cid | cname  | teacher_id |
+-----+--------+------------+
|   1 | 生物 |          1 |
|   2 | 体育 |          1 |
|   3 | 物理 |          2 |
|   4 | 语文 |          3 |
|   5 | 数学 |          4 |
|   6 | 英语 |          5 |
|   7 | 地理 |          2 |
+-----+--------+------------+
7 rows in set (0.00 sec)

mysql> select * from teacher;
+-----+-----------+
| tid | tname     |
+-----+-----------+
|   1 | 张三    |
|   2 | 李四    |
|   3 | 王五    |
|   4 | egon      |
|   5 | 张无忌 |
+-----+-----------+
5 rows in set (0.07 sec)

# 查询张三教授的课程名
mysql> select cname from course where teacher_id =(select tid from teacher where tname=‘张三‘);
+--------+
| cname  |
+--------+
| 生物 |
| 体育 |
+--------+
2 rows in set (0.00 sec)

# 子查询出临时表,作为teacher_id等判断依据
select tid from teacher where tname=‘张三‘

  

一 创建视图

# 语法:create view 视图名称 AS sql语句
mysql> create view teacher_view as select tid from teacher where tname = ‘张三‘;
Query OK, 0 rows affected (0.15 sec)

# 于是查询张三教授的课程名的sql可以改写为
mysql> select cname from course where teacher_id = (select tid from teacher_view);
+--------+
| cname  |
+--------+
| 生物 |
| 体育 |
+--------+
注意注意注意:
#1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高

#2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,
那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,
你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便

  

二 使用视图

mysql> select * from course;
+-----+--------+------------+
| cid | cname | teacher_id |
+-----+--------+------------+
| 1 | 生物 | 1 |
| 2 | 体育 | 1 |
| 3 | 物理 | 2 |
| 4 | 语文 | 3 |
| 5 | 数学 | 4 |
| 6 | 英语 | 5 |
| 7 | 地理 | 2 |
+-----+--------+------------+

mysql> create view course_view  as select * from course;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from course_view;
+-----+--------+------------+
| cid | cname  | teacher_id |
+-----+--------+------------+
|   1 | 生物 |          1 |
|   2 | 体育 |          1 |
|   3 | 物理 |          2 |
|   4 | 语文 |          3 |
|   5 | 数学 |          4 |
|   6 | 英语 |          5 |
|   7 | 地理 |          2 |
+-----+--------+------------+
7 rows in set (0.00 sec)

mysql> update course_view set cname = ‘化学‘ where cname = ‘生物‘;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> insert into course_view values(8,‘历史‘,3);  # 往视图里面插入数据
Query OK, 1 row affected (0.02 sec)

mysql> select * from course;   # 发现原始表的记录也跟着修改了
+-----+--------+------------+
| cid | cname  | teacher_id |
+-----+--------+------------+
|   1 | 化学 |          1 |
|   2 | 体育 |          1 |
|   3 | 物理 |          2 |
|   4 | 语文 |          3 |
|   5 | 数学 |          4 |
|   6 | 英语 |          5 |
|   7 | 地理 |          2 |
|   8 | 历史 |          3 |
+-----+--------+------------+
8 rows in set (0.00 sec)

  

三 修改视图

语法:ALTER VIEW 视图名称 AS SQL语句
mysql> alter view teacher_view as select * from course where cid>3;
Query OK, 0 rows affected (0.04 sec)

mysql> select * from teacher_view;
+-----+-------+------------+
| cid | cname | teacher_id |
+-----+-------+------------+
|   4 | xxx   |          2 |
|   5 | yyy   |          2 |
+-----+-------+------------+
rows in set (0.00 sec)

  

四 删除视图

语法:DROP VIEW 视图名称

DROP VIEW teacher_view

  

原文地址:https://www.cnblogs.com/mike-liu/p/9349638.html

时间: 2024-11-03 22:16:12

数据库:mysql内置功能-视图的相关文章

mysql 内置功能 视图介绍

之前的多表查询本质是把多张有关系的表连接在一起组成一张虚拟表,从而进行查询 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意

mysql内置功能—视图

一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql>

14 MySQL 内置功能--视图/触发器

#视图 select * from course inner join teacher on course.teacher_id=teacher.tid; create view course2teacher as select * from course inner join teacher on course.teacher_id=teacher.tid; #触发器 CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR

mysql 内置功能目录

mysql 内置功能 视图介绍  mysql 内置功能 视图 使用 mysql 内置功能 触发器介绍  mysql 内置功能 触发器 实验 原文地址:https://www.cnblogs.com/mingerlcm/p/9953649.html

mysql内置功能

事务 事务由一个或多个sql语句组成一个整体,如果所有的语句执行成功那么修改将会全部生效,如一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入到数据库中. 特性: 事务具体四大特性,也就是经常说的ACID 1. 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响.   2. 一

数据库:mysql内置功能-事务

一 事物 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); #原子操作 start transacti

数据库:mysql内置功能-触发器

一 触发器 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 一 创建触发器 # 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN ... END # 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN ... END # 删除前 CREATE TRIG

8.7.4 mysql 内置功能 - 存储过程

一 存储过程 一 存储过程介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: #1. 用于替代程序写的SQL语句,实现程序与sql解耦 #2. 基于网络传输,传别名的数据量小,而直接传sql数据量大 使用存储过程的缺点: #1. 程序员扩展功能不方便 补充:程序与数据库结合使用的三种方式 #方式一: MySQL:存储过程 程序:调用存储过程 #方式二: MySQL: 程序:纯SQL语句 #方式三: MySQL

mysql 内置功能 函数 date_format函数

创建数据库db12 create database db12 charset=utf8; use db12; 准备表和记录 CREATE TABLE blog ( id INT PRIMARY KEY auto_increment, NAME CHAR (32), sub_time datetime ); 插入记录 INSERT INTO blog (NAME, sub_time) VALUES ('第1篇','2015-03-01 11:31:21'), ('第2篇','2015-03-11