MySQL——数据查询(联合查询)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL——数据查询(联合查询)

前言

 小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优秀的同学去参加考试。这时候很多班级筛选出来的这些同学就可以临时组成一个班级,如果我们把每一个班级都当做是一张真实的表,这个临时的班级在数据库里就可以当做一个视图,也就是说,这个临时的班级其实不是真实存在的,当考试过后,这些学生还是各回各家各找各妈。。。。




0504455813bd42f4974ea1de87a579bd.png

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。


为什么要使用视图


通过前面章节的知识可以发现,数据库中关于数据的查询有时非常复杂,例如表连接、子查询等,这种查询会让程序员感到非常痛苦,因为它的逻辑太复杂、编写语句比较多,当这种查询需要重复使用时,很难每次都编写正确,从而降低了数据库的实用性。


       在具体操作表之前,有时候要求只能操作部分字段,而不是全部字段。例如,在学校里,学生的智商测试结果一般都是保密的,如果因为一时疏忽向查询中多写了关于“智商”的字段,则会让学生的智商显示给所有能够查看该查询结果的人,这时就需要限制使用者操作的字段。


       提高复杂的SQL语句的复用性和表的操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储数据值的形式存在,行和列数据来自定义视图的查询所引用的基本表,并且在具体引用视图时动态生成。


       视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务。这样程序员只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高数据库中数据的安全性。


创建视图

  虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即MySQL并没有专门的位置为视图存储数据。根据视图的概念可以发现其数据来源于查询语句,因此创建视图的基本语法为:


           CREATE[OR REPLACE] VIEW viewname[columnlist]  


           AS SELECT statement                              


        其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;


       注意! 创建视图需要登陆用户有相应的权限,查看权限方法:


       注意! 创建视图需要登陆用户有相应的权限,查看权限方法:


在单表上创建视图

mysql>  use school;   #选择数据库school


mysql>  alter table student add privacy varchar(64);# 增加私隐列                                                                                      


mysql>  ;#查询数据库用户创建和选择视图权限  


mysql>  CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图


mysql>  desc view_student;#查看视图


mysql>  select * from view_student;   #根据视图进行查询  


在多表上创建视图


 CREATE[OR REPLACE] VIEW viewname[columnlist]  


        AS SELECT statement


       其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;与单表上创建视图不同的是,SELECT子句是涉及到多表的联合查询语句。

mysql>  use school;   #选择数据库school


mysql>  alter table student add privacy varchar(64);# 增加私隐列                                                                                      


mysql>  ;#查询数据库用户创建和选择视图权限  


mysql>  CREATE VIEW view_student_class AS select student.id, student.name, class.name,  class.teacher from class inner join student  on class.id = student.class_id;#为学生表创建视图


mysql>  desc view_student_class;#查看视图


mysql>  select * from view_student_class;   #根据视图进行查询  


查看视图


创建完视图后,像表一样,我们经常需要查看视图信息。在MySQL中,有许多可以实现查看视图的语句,如DESCRIBE、SHOW TABLES、SHOW CREATE VIEW。如果要使用这些语句,首先要确保拥有SHOW VIEW的权限。本节将详细讲解查看视图的方法。


      1.使用DESCRIBE | DESC语句查看视图基本信息


       前面我们已经详细讲解过使用DESCRIBE语句来查看表的基本定义。因为视图也是一张表,只是这张表比较特殊,是一张虚拟的表,所以同样可以使用DESCRIBE语句来查看视图的基本定义。DESCRIBE语句查看视图的语法如下:


        DESCRIBE | DESC viewname;


       在上述语句中,参数viewname表示所要查看设计信息的视图名称。


      2.使用SHOW TABLES语句查看视图基本信息


       从MySQL 5.1版本开始,执行SHOW TABLES语句时不仅会显示表的名字,同时也会显示视图的名字。


       下面演示通过SHOW TABLES语句查看数据库school中的视图和表的功能,具体SQL语句如下,执行结果如下图所示。



64cec488eebf4c2c93fc00e2d997d0bc.png

 3.使用 show create view/table 语句查看视图创建信息

        SHOW CREATE TABLEVIEW   viewname;  



更新视图


 更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。更新视图时,只能更新权限范围内的数据,超出范围就不能更新了。

mysql>  use school;   #选择数据库school


mysql>  alter table student add privacy varchar(64);# 增加私隐列                                                                                      


mysql>  ;#查询数据库用户创建和选择视图权限  


mysql>  CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图


mysql>  desc view_student;#查看视图


mysql>  select * from view_student;   #根据视图进行查询


mysql>  update view_student set name='小花花' where name='小花'; #通过视图更新小花为小花花


不能更新的情况:

  1. 视图中包含SUM()、COUNT()、MAX()和MIN()等函数
  2. 视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVING等关键字
  3. 视图对应的表存在没有默认值的列,而且该列没有包含在视图里
  4. 包含子查询的视图
  5. 其他特殊情况


修改视图

 修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。ALTER语句来修改视图。


       使用ALTER语句修改视图


           ALTER VIEW viewname[columnlist]  


               AS SELECT statement                              


       这个语法中的所有关键字和参数除了alter 外,其他都和创建视图是一样的,因此不再赘述。


       【示例9.3】对于示例9.2中创建的视图view_student_class,使用一段时间后需要将表示编号的字段id加进去。步骤如下:

mysql>  use school;   #选择数据库school


mysql>  alter table student add privacy varchar(64);# 增加私隐列                                                                                      


mysql>  ;#查询数据库用户创建和选择视图权限  


mysql>  ALTER VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student  on class.id = student.class_id;#为学生班级表视图增加 class_id 字段


mysql>  desc view_student_class;#查看视图


mysql>  select * from view_student_class;   #根据视图进行查询  

删除视图



删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。


       在MySQL中,可使用DROP VIEW语句来删除视图,但是用户必须拥有DROP权限。删除视图的语法如下:


           DROP VIEW viewname [,viewnamen];


       在上述语句中,参数viewname表示所要删除视图的名称,可同时指定删除多个视图。

mysql>  use school;   #选择数据库school      


mysql>  ;#查询数据库用户创建和选择视图权限  


mysql>  CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student  on class.id = student.class_id;#为学生表创建视图


mysql>  drop view view_student_class;#删除视图

总结

       总结就是以上。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
SQL 关系型数据库 MySQL
④【数据查询】MySQL查询语句,拿来即用。
④【数据查询】MySQL查询语句,拿来即用。
70 0
|
25天前
|
SQL Oracle 关系型数据库
【MySQL】——数据查询_进阶操作(超详细)!!
聚合查询,联合查询,内外连接,子查询,合并查询爽歪歪
|
2月前
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询——in多个数据查询的示例
MySQL数据库子查询——in多个数据查询的示例
45 1
|
3月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
149 5
|
3月前
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
81 5
|
7月前
|
Oracle 关系型数据库 MySQL
MYSQL-多表联合查询汇总
MYSQL-多表联合查询汇总
|
6月前
|
SQL 关系型数据库 MySQL
MySQL DQL(数据查询语言)深度解析与实践
MySQL DQL(数据查询语言)深度解析与实践
|
6月前
|
关系型数据库 MySQL API
MySQL上亿数据查询优化:实践与技巧
MySQL亿级数据查询优化涉及索引设计、分区表、查询语句优化和数据库架构调整。例如,通过为常用查询列创建索引、使用EXPLAIN分析查询计划、避免全表扫描和SELECT *,以及采用垂直拆分、水平拆分和读写分离来提升性能。分区表能减少查询数据量,API接口测试可验证优化效果。
421 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
435 1