【云驻共创】年轻人如何入场元宇宙?未来已来!
800
2022-05-30
前言
本文主要介绍的内容有:
表设计概述
创建表
表中数据的操纵
视图概述
创建视图
使用视图
一、表设计概述
在用文件柜管理资料的时代,当你将你的资料放进自己的文件柜中,并不是随意的将这些资料扔进某个柜子里,而是要在文件柜中创建文件,然后将相关的资料放入特定的文件中。类比于我们现代在使用数据库的条件下,我们将这种“文件”称为表(table)。表是一种结构化的文件,可以用来存储某种特定类型的数据。例如,表可以存储学生信息,选课记录或者其他信息清单。
从用户的角度出发,数据库是一个表或者多个表的集合体。下图描述的是人们在生活当中常用的学生信息表的基本构成元素。设计一张表,首先要为表设定一个名字,用来概括表的基本内容。接下来要确定表中有哪几个栏目。平时开发者设定的蓝色标题称之为表头,在数据库中称为列,或者叫做字段。所有的表都是由一个或者多个列组成的。列代表的是数据库中所有存储实体的某些属性,例如学生的学号,姓名,性别等。而下图中横向标记的是行(row),代表表中的一条记录,代表着数据库中存储的一个实体,一条数据。由此可见,表是由行和列构成的二维网格,是某种特定类型数据的结构化清单。图中行和列交汇的方格被称为单元格,也叫做值(value)。
上图的二维表对应一张数据库中的数据表,而下图则是学生信息表在数据库中对应的结构描述。数据库表是满足关系模型的一张相关数据的集合,是数据库所有数据库对象的基础数据源。在数据库中定义表的映射,就是根据表的定义来确定表的组织形式。包括列的个数,列的列名,列的类型等。由此可以看出,一张二维表由表的表头,表的列名,表的内容这三个部分组成。其中表名是表的主要标识,用户依靠表名向表中查询数据或者使用表。表的记录是表不可分割的基本项,不包含记录的表称为空表。
二、创建表
在了解表的基本组成之后,我们就可以开始创建表了。那么我们应该如何创建表呢?创建表的过程其实是对表结构进行定义,即是确定表字段的个数,字段名,字段类型,索引,完整性定义等。表结构设定的好与坏决定了使用效果。表中数据的冗余度,共享性以及完整性的高低,直接影响数据表的质量。数据表的使用,分为两类SQL语句的使用,分别是创建定义表的DDL(定义语言),对数据进行操作的DML(数据操作语言)。
上图定义了一个“school”表结构,那么如何使用DDL来创建一个表呢?
创建表需要使用create table语句,具体的create table语句语法格式,如下图蓝紫色文字所示。其中方括号内的语句是可选内容。
create table语句的功能就是创建一个数据库表,具体的语句代表的功能可以参考下图。
在已有的数据库(MY_database)中,创建一个数据库表(MY_school)的SQL语句如下图蓝字和紫字所示。其中PRIMARY KEY指定了School_id为主键,是每一条记录的唯一标识。后面的紫色语句指出了存储引擎和排序规则等信息。
将以上语句放在GaussDB平台上执行,可以得到以下结果。
GaussDB平台除了允许开发者使用SQL语句来创建表,还可以让开发者利用“表设计视图”来创建表。而且GaussDB平台为大部分的数据库操作都提供了这种方式。“表设计视图”方式虽然对初学者友好,但是在该模式下,某些复杂操作无法实现,所以不提倡开发者使用该方式作为首选方式来操作数据。
在创建表时,大部分开发者会因为考虑不周,操作不慎或表不适应新的变化,使得表的结构不再适合新的需求,这就需要开发者对表结构进行相应的修改。在GaussDB平台使用的修改表结构的语句是ALTER语句。以下便是ALTER语句的标准语法格式。其中方括号里面的内容是可选选项。
以下的例子,便是使用了ALTER语句为My_school表增加一个新字段。
三、表中数据的操纵
学习完表的创建,接下来我们要开始学习如何操纵表中的数据。这一部分主要分为三个方面,分别是如何插入数据,如何修改数据以及如何删除数据。至于如何查询语句,大家可以前往华为云数据库的其他课程中深入学习。
插入数据
这一小节主要介绍向数据库表中添加数据的基本方法。通过create table语句刚创建出来的表,可以看作一个空箱子。只有把数据装入这个箱子之后,它才能真正的被称为数据库。Create table语句属于数据定义语言,而将数据装入表中的insert语句属于DML(数据操纵语言)。下图显示的便是insert 语句的语法格式。
那么insert插入语句输入后,会产生什么效果呢?通过下图的示例,我们可以看到MY_school表是数据库中已经存在的表,并且该表中已经有了若干条数据。通过下方蓝色的insert语句,可以向数据库中插入一条“媒体与设计”专业学生的数据。其中下面两条sql语句的作用是一致的,只不过下面的那条语句相比于上面的语句,缺少了字段属性的描写。同时在撰写sql语句时,字符型字段属性对应的文字,要用单引号括起来。
以前说讲述的insert语句语法,每次都只能插入一条记录。那当我们想要插入多条语句时,又应该怎么做呢?我们可以通过带有子查询的insert语句来实现。
下图的insert语句代表,将子查询到的结果插入到表中,从而完成批量插入操作。
那么带有子查询的insert语句在日常生活中,有何妙用呢?例如,我们可以通过该语句,来拷贝成绩表,存储到一个备份表中。
要完成这个备份操作,就要求我们首先要创建新表,且新表的表结构和原来的表结构完全一致。然后通过带有子查询结果的insert语句,将原来的表的数据插入到新表中,具体的sql语句实现,大家可以参考下图。
2.修改数据
开发者日常开发中,插入数据之后,由于多种原因,时常需要更改其中的数据。那么我们应该如何更改数据呢?我们通常使用update语句来修改表中的数据。update语句和insert语句同样属于DML。update语句的具体语法格式如下所示,其中的new_value一般是字面量形式,可以是子查询语句,也可以是列的表达式。Update语句可以一次修改一个或者一个以上的字段的值。
我们通过一个小案例来学习使用update语句。小案例的内容是通过update语句将所有课程的学时增加2。.实现代码如蓝字所示。
现在是将所有的学时都增加了2,现实生活中,我们有时候需要将某一课程的学分增加,又该如何处理呢,就如下面那个案例,将所有的3学分课程的学时增加一倍,那么我们可以通过where来限制哪些课程可以增加学分。具体的代码如蓝字所示。
3.删除数据
在数据库的实际应用中,表中的数据可能会随着时间的推移而失效,也可能因操作不当使数据出现错误。还可能因为数据来源不准确造成表中的数据不正确。那么这时候就需要清理删除掉这些数据。那么在数据库表中,我们又如何实现删除表数据的操作呢?我们可以通过delete from语句来删除数据,具体的语法格式和注意事项如下所示。
下面分别是通过delete语句完成删除操作的示例。第一个示例是直接删去“媒体与设计”学院的数据,可以通过where字句找到信息,然后用delete from 语句直接删除。而第二个示例比较复杂,需要删除某位具体的学生的所有的课程信息,删除的具体信息在表score中,但是条件却是以班级编号为字段给出的,这个字段不在表score。为此我们用子查询,将班级编号为“A1011901”的所有学生全部查出来,然后将这些在score表中存在的学生全部删除。
DELETE FROM语句和DROP TABLE语句都具有删除的作用,但是它们有本质的区别,那便是DROP TABLE语句会丢弃整个数据表。如果用水杯和水的关系比喻表和表中数据的关系,那么DELETE FROM语句是倒掉杯子里的水,而DROP TABLE语句则是将杯子和水一起丢掉。
四、视图概述
表这种sql对象实际存储在数据库中,它们是持久的,基础的数据源。而在sql中还存在另一种被称为虚拟视图的关系对象,也就是视图(view)。
那么视图主要应用在什么场景下呢?首先,让我们设想这样的一个业务场景,当我们在一个项目的实际开发过程中,出现了新的需求并涉及复杂的需求的时候,我们不可避免的需要从多个表中提取业务相关数据进行处理。这就有可能频繁的进行多个表的连接操作,这些操作可能逻辑复杂,效率也比较低下。另外数据库设计范式要求我们尽量减少冗余字段,因此很多数据表都没有我们所谓的计算字段。例如,采购单的数据表一般会有价格,数量,税率,含税金额等字段,但多半没有不含税金额,税额等信息,但这些字段在很多报表中都会用到,需要频繁计算。而要解决这些问题最简单的办法就是创建新的表,这些表作为暂时存储数据的中间表,将与新业务的相关数据整合在一起,进行了某种信息重组,可以简化新业务的相关数据库操作,下方的图片展示的就是这种情况。
一个可能很复杂的select语句,从table1,table2两张表中分别提取了业务相关数据,组成了一张新表。但是一般认为,在数据库应用系统的运行过程中,创建新表或者中间表是非常浪费资源的操作,特别是当相关业务涉及的资源特别巨大的时候。那么如何更好的解决这个问题呢?我们可以使用视图来解决这个问题。
那什么是视图呢?从数据库管理系统的角度来看,数据库通常采用三级模式和两级映射的结构。其中内模式对应的是存储文件,它反映了数据库的物理结构和存储方式。模式对应的是表,反映了数据库中数据的整体逻辑结构。而外模式是数据库用户能够看到的,使用的,局部数据的逻辑结构和特征描述,是与某一个应用相关数据的逻辑表示,是数据库的数据视图。视图是一种和表并列的数据库对象,是从若干个表中按照某种条件抽取的数据所组成的“表”。视图与表不同的是,视图中的数据还是存储在数据源中,因此可以将视图看成是逻辑中存在的表。视图不能单独存在,它依赖于数据库中的基本表存在。视图可以是一个数据表的一部分,也可以是多个表的联合组成的新的数据集。
那么视图和表有那些区别呢?我们通常用insert语句将实际数据存储到数据库中。而数据库中的数据实际上会保存到计算机的存储设备。而通过select语句查询数据,就是从存储设备中读取数据,进行各种计算之后,将数据返回给用户。但是当我们使用视图的时候,数据库系统并不会将数据保存到存储设备之中,也不会将数据保存到其他任何地方。视图实际上保存的是select语句。我们从视图中读取数据时,系统会在内部执行相应的select语句m,并创建出一张临时表。所以说表与视图的最大区别就是是否保存了实际数据。
视图的组成和实质,让视图具有下图中描述的特性。
这些特性决定了视图拥有以下的优点,例如第四点,视图隐藏了数据库和应用无关的部分,而用户与视图交互,使得视图具有逻辑上的独立性。同时,视图通过对基础表的过滤,对用户隐藏数据,从而增强了安全性。
五、创建视图
当我们了解完视图是什么之后,我们开始学习如何使用视图。创建视图和创建表的方式很相似。我们知道视图是基于表来创建的。那么最简单的创建视图方式,就是基于单表的创建方式。在GaussDB平台中,建立视图是使用CREATE VIEW语句,具体的语法格式及注意事项可以参考下图。其中需要注意的是下图紫色字体中的AS,表示的是‘依照’,‘如同’的意思,此处的AS不可以省略。它与select语句中定义别名的as不具备相同的功能。
Select语句中的字段排列顺序和视图的排列顺序是相同的。而with check option选项的意思是,使用这个选项建立的视图进行更新,插入等操作的时候,检查新数据是否符合WHERE设置的条件,如果不符合,那么对于视图中数据的修改就不能进行。如果建立视图时不选择这个选项,并且这个视图是从单个基表导出的并去掉了这个基本表的某些行和某些列,但保留了主键,那么我们称之为行列子集视图,这个子集视图都是可以修改数据的。
下面这个例子就是在GaussDB平台中,使用创建视图语句,根据表My_school,创建单表视图(v_school)。具体实现语句见蓝字部分。值得注意的是,关系数据系统执行create view语句的时候,只是把视图定义存储到数据字典,并不执行其中的select语句,直有对视图进行查询等操作时,系统才会按视图的定义从基本表中将数据查出。
那么基于多个基本表是如何创建视图的呢?建立多表视图也是使用CREATE VIEW语句,具体的语法格式及注意事项可以参考下图。
与基础表一样,在创建视图之后,由于定义时考虑不周全,或者需求的变化,需要对视图的结构进行维护。维护视图包括修改视图和删除视图两种操作。
修改视图的语法格式和表的修改格式类似,修改视图本质就是给指定视图换了一个select语句。具体的语法格式和注意事项如下图所示。
下面是通过ALTER VIEW语句完成修改视图操作的示例和结果,主要是为已知视图增加一个新的字段。
当视图不再被需要,可以通过DROP VIEW语句实现删除视图操作,并且可以一次删除多个视图。删除视图不会影响表中的基本数据。具体的语法格式和注意事项,可以查看下图。
六、使用视图
在使用视图方面,也有增删查改这4个操作,与使用表的操作类似。但是视图毕竟不是表,在增删查改等操作方面仍有一定的限制。
在这些操作中,查询操作的限制是最少的,使用也是最多的。由于create语句只是将select语句存进字典中,当然也就不会有任何的数据显示出来。只有对视图进行查询操作时,系统才会按照视图定义,从基本表中将数据查出来。也就是说,只有在视图上进行了查询操作,才真正发挥了视图的作用。下图就是一个简单的视图查询案例。
查询操作是读操作,查询视图不会修改表中的数据,所以查询视图操作限制很少。插入更新,删除等操作涉及数据的写操作,都属于广义的更新操作。数据库管理系统对于视图的这类更新操作具有严格的限制。那为什么会有这些限制呢?这是因为视图归根结底还是由基本表派生出来的,如果基础表可以更新,那么视图就可以更新,反之亦然。但是视图发生了更新,基本表却无法更新,那就无法保证数据的一致性。由此,系统就会限制视图的更新。常见的有代表性的更新视图的限制如下图所示。
我们进行插入视图的的操作时,要严格按照以上的限制处理。不然在实际开发项目就会报错。插入操作的具体语法格式和示例如下图所示,它的语法格式和基本表的插入操作格式是一致的,大家可以举一反三。
七、总结
本文主要介绍了表和视图的相关概念和常规的操作,大家可以搭配GaussDB平台来学习,毕竟实践永远是学习的最佳方式。数据库除了表,还有数据库设计和建模,数据查询,SQL语言的等知识,华为云数据库体提供了一站式的开发教学课程,大家可以按需学习。争取早日吃透数据库的相关知识。
参考链接
华为云在线课程:https://edu.huaweicloud.com/courses
本文整理自华为云社区【内容共创】活动第15期。
查看活动详情:
https://bbs.huaweicloud.com/blogs/345822
相关任务详情:任务24.
华为云数据库之表与视图
GaussDB数据库 上云必读 云原生 云数据库 GaussDB(for MySQL) 数据库
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。