美文网首页
MySQL数据库视图view

MySQL数据库视图view

作者: 泡泡龙吐泡泡 | 来源:发表于2018-09-17 16:25 被阅读51次

1. 引入

  1. 视图是一张虚拟表,它表示一张表的部分或多张表的综合的结构。
  2. 视图仅仅是表结构,没有表数据。视图的结构和数据建立在表的基础上。

2. 视图

2.1 创建视图

语法:

create [or replace] view 视图的名称
as 
select 语句

例题:

mysql> create view vw_stu
    -> as
    -> select stuname,stusex,writtenexam,labexam from stuinfo inner join stumarks using(stuno);
Query OK, 0 rows affected (0.01 sec)

多学一招:因为视图是一个表结构,所以创建视图后,会在数据库文件夹中多一个与视图名同名的.frm文件

2.2 使用视图

视图是一张虚拟表,视图的用法和表的用法是一样的。

mysql> select * from vw_stu;
+--------------+--------+-------------+---------+
| stuname      | stusex | writtenexam | labexam |
+--------------+--------+-------------+---------+
| 李斯文       | 女     |          80 |      58 |
| 李文才       | 男     |          50 |      90 |
| 欧阳俊雄     | 男     |          65 |      50 |
| 张秋丽       | 男     |          77 |      82 |
| 争青小子     | 男     |          56 |      48 |
+--------------+--------+-------------+---------+

2.3 查看视图的结构

语法:

desc 视图名

例题:

mysql> desc vw_stu;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| stuname     | varchar(10) | NO   |     | NULL    |       |
| stusex      | char(2)     | NO   |     | NULL    |       |
| writtenexam | int(11)     | YES  |     | NULL    |       |
| labexam     | int(11)     | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

2.4 查看创建视图的语法

语法:

show create view 视图名

例题:

mysql> show create view vw_stu\G;
*************************** 1. row ***************************
                View: vw_stu
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `vw_stu` AS select `stuinfo`.`stuName` AS `stuname`,`stuinfo`.`stuSex` AS `stusex`,`stumarks`.`writtenExam` AS `writtenexam`,`stumarks`.`labExam` AS `labexam` from (`stuinfo` join `stumarks` on((`stuinfo`.`stuNo` = `stumarks`.`stuNo`)))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

2.5 显示所有视图

 #方法一:
mysql> show tables;
+------------------+
| Tables_in_itcast |
+------------------+
| stu              |
| stuinfo          |
| stumarks         |
| t1               |
| t2               |
| vw_stu           |

# 方法二
mysql> select table_name from information_schema.views;
+------------+
| table_name |
+------------+
| vw_stu     |
+------------+
1 row in set (0.05 sec)
+------------------+

#方法三
mysql> show table status where comment='view' \G
*************************** 1. row ***************************
           Name: vw_stu
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

2.6 更改视图

语法:

alter view 视图名
as
select 语句

例题:

mysql> alter view vw_stu
    -> as
    -> select * from stuinfo;
Query OK, 0 rows affected (0.00 sec)

2.7 删除视图

语法:

drop view [if exists] 视图1,视图2,…

例题:

mysql> drop view vw_stu;
Query OK, 0 rows affected (0.00 sec)

2.8 视图的作用

  1. 筛选数据,放置未经许可访问敏感数据
  2. 隐藏表结构
  3. 降低SQL语句的复杂度

2.9 视图的算法

场景:找出语文成绩最高的男生和女生
我们可以将子查询封装到视图中:

mysql> create view vw_stu
    -> as
    -> select * from stu order by ch desc;
Query OK, 0 rows affected (0.00 sec)

可以将上面的子查询更改成视图,但是结果不对:

mysql> select * from vw_stu group by stusex;
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo  | stuName | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 张秋丽        | 男       |     18 |       1 | 北京           |   80 | NULL |
| s25303 | 李斯文       | 女      |     22 |       2 | 北京           |   55 |   82 |
+--------+---------+--------+--------+---------+------------+------+------+

原因:这是因为视图的算法造成的

  1. merge:合并算法,将视图的语句和外层的语句合并后在执行。
  2. temptable:临时表算法,将视图生成一个临时表,再执行外层语句
  3. undefined:未定义,MySQL到底用merge还是用temptable由MySQL决定,这是一个默认的算法,一般视图都会选择merge算法,因为merge效率高。

解决:在创建视图的时候指定视图的算法

create algorithm=temptable view 视图名
as
    select 语句

指定算法创建视图

mysql> create algorithm=temptable view vw_stu
    -> as
    ->  select * from stu order by ch desc;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from vw_stu group by stusex;   # 结果是一致的
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25321 | Tabm     | 女      |     23 |       9 | 河北          |   88 |   77 |
| s25318 | 争青小子        | 男       |     26 |       6 | 天津           |   86 |   92 |
+--------+----------+--------+--------+---------+------------+------+------+

相关文章

  • MySQL数据库视图view

    1. 引入 视图是一张虚拟表,它表示一张表的部分或多张表的综合的结构。 视图仅仅是表结构,没有表数据。视图的结构和...

  • Mysql 学习笔记

    Mysql 学习笔记(四) 视图(View) ➢从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从...

  • MySQL视图(view)

    视图概述 视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。 视图是一个虚拟...

  • mysql view(视图)

    mysql 视图是通过sql, 提前从一张表或几张表中查询出来的虚拟表, 视图不会存储数据, 不会对查询的速度产生...

  • mysql 批量修改视图定义者 DEFINER

    原文: MySQL如何批量修改视图(VIEW)的属主(DEFINER)参考: Mysql The user spe...

  • JDBC 第一章

    MySQL安装 数据库视图化工具 MySQL基本操作 JDBC MySQL安装 1.1、下载 链接:https:/...

  • SQLite 视图(View)

    SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视...

  • 视图和触发器

    视图 https://dev.mysql.com/doc/refman/5.7/en/create-view.ht...

  • 关系数据库标准语言SQL(二)

    声明:最近在准备考试,故整理数据库原理笔记。 视图 视图的创建和删除 CREATE VIEW <视图名 > [ ...

  • 简介mysql之视图

    前言 我们在前文的事务和前文的mysql语句执行流程中都谈到了视图这个概念,其实Mysql有两个视图:1.view...

网友评论

      本文标题:MySQL数据库视图view

      本文链接:https://www.haomeiwen.com/subject/ubwlnftx.html