MySQL基础知识——VIEW视图

Wesley13
• 阅读 291

点击关注上方“SQL数据库开发”,

设为“置顶或星标****”,第一时间送达干货

视图的定义

视图是可视化的表。

本章讲解如何创建、更新和删除视图。

为什么使用视图
视图在数据库中应用的比较频繁,主要基于以下几点:

  • 重用SQL语句。

  • 化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。

  • 用表的组成部分而不是整个表。

  • 护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。

  • 改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

CREATE VIEW 语句

在 SQL 中,视图是基于 SQL 语句的结果集的可视化表。

视图包含行和列,就像真正的表一样。视图中的字段是一个或多个数据库中真实表中的字段。

您可以添加 SQL 函数,在哪里添加,并将语句连接到视图,或者您可以呈现数据,就像数据来自单个表一样。

CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

注释:视图总是显示最新数据!每当用户查询视图时,数据库引擎就使用视图的 SQL 语句重新构建数据。

CREATE VIEW 实例

我们以表Customers为例

MySQL基础知识——VIEW视图

"Customer_GD"(广东客户列表)视图从"Customers"表中列出了所有广东省的客户。这个视图使用下面的 SQL 创建:

CREATE VIEW Customer_GD ASSELECT *FROM CustomersWHERE 省份='广东省'

我们可以像这样查询上面这个视图:

SELECT * FROM Customer_GD

查看一下视图中的结果:

MySQL基础知识——VIEW视图

下面的我们以"Products"表为示例

MySQL基础知识——VIEW视图

我们选取 "Products" 表中所有价格高于平均价格的产品:

CREATE VIEW [Products_Above_Average_Price] ASSELECT 名称,价格FROM ProductsWHERE 价格>(SELECT AVG(价格) FROM Products)

我们可以像这样查询上面这个视图:

SELECT * FROM [Products_Above_Average_Price]

结果如下:

MySQL基础知识——VIEW视图

我们也可以向视图添加条件。现在,我们仅仅需要查看 "大米" 类的价格:

SELECT * FROM [Products_Above_Average_Price]WHERE 名称='大米'

这样就只显示大米的价格了

MySQL基础知识——VIEW视图

更新视图

您可以使用下面的语法来更新视图:

CREATE OR REPLACE VIEW 语法

ALTER VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

现在,我们希望向 "Products_Above_Average_Price" 视图添加 "规格" 列。我们将通过下列 SQL 更新视图:

ALTER  VIEW [Products_Above_Average_Price] ASSELECT 名称,价格,规格FROM ProductsWHERE 价格>(SELECT AVG(价格) FROM Products)

我们重新查询该视图:

SELECT * FROM [Products_Above_Average_Price]

结果如下:

MySQL基础知识——VIEW视图

删除视图

可以通过 DROP VIEW 命令来删除视图。

DROP VIEW 语法

DROP VIEW view_name

例如我们要删除刚才新建的视图"Products_Above_Average_Price"

DROP VIEW [Products_Above_Average_Price]

重新查询视图后就会显示该视图无效

MySQL基础知识——VIEW视图

证明视图已经不存在了。

视图的规则和限制
视图的使用也有一些规则和限制,主要表现在:

  • 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。

  • 对于可以创建的视图数目没有限制。

  • 为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。

  • 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。

  • ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。

  • 视图不能索引,也不能有关联的触发器或默认值。

  • 视图可以和表一起使用。例如,编写一条联结表和视图的SELECT

    语句。

       我是岳哥,最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。
    
      
      
      
    
      
      
      
    
       
       
       
    
      
      
      
    
      
      
      
    
       
       
       有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
    
      
      
      
    
      
      
      
    
       
       
       数据前线
    
      
      
      
    
      
      
      
    
       
       
       
    
      
      
      
    
     
     
     
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ——End——
    
    
    
    
    
    
    
     
     
     
     
    
      
      
      后台回复关键字:1024,获取一份精心整理的技术干货
    
     
     
     
    
     
     
     
    
      
      
      后台回复关键字:进群,带你进入高手如云的交流群。
    
     
     
     
    
     
     
     
    
      
      
      推荐阅读
    
     
     
     
    
     
     
     
    
      
      
      我的电脑不联网,很安全,黑客:你还有风扇呢。。。
    
      
      
      
    
       
       
       
     
        
        
        CentOS 已死,“免费”的RHEL没了
     
        
        
        
    
       
       
       
    
      
      
      
    
       
       
       
     
        
        
        一套简单实用的SQL脚本,总有你需要的
     
        
        
        
    
       
       
       
    
      
      
      
    
       
       
       
     
        
        
        不懂就问:为什么SELECT * 会导致查询效率低?
     
        
        
        
    
       
       
       
    
      
      
      
    
       
       
       
     
        
        
        SQL 语法速成手册
    

本文分享自微信公众号 - SQL数据库开发(sql_road)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
mysql(视图 事务 索引 外键)
视图视图本质就是对查询的封装创建视图(定义视图 起名以v\_开头)createviewv\_studentsasselectclasses.nameas c\_name,students.\fromstudentsinnerjoinclassesonstudents.cls\_idclasses.id;查
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这