数据库原理及应用——数据更新和视图创建

简介: (1)所使用的学生管理库中的三张表:(2)数据更新具体完成以下例题:(3)视图操作具体完成以下例题:

 实验三  数据更新和视图创建

一、实验目的:

    1. 熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作;
    2. 熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。

    二、实验要求:

    (1)针对“学生课程SC”数据库设计单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERT、UPDATE和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。

    (2)针对给定的数据库模式,以及相应的应用需求,创建视图、创建带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握视图消解执行原理,掌握可更新视图和不可更新视图的区别。

    三、实验重点和难点:

    实验重点:

    (1)插入、修改和删除数据的SQL。

    (2)创建视图。

    实验难点:

      1. 与嵌套SQL子查询相结合的插入、修改和删除数据的SQL语句;利用一个表的数据来插入、修改和删除另外一个表的数据。
      2. 可更新的视图和不可更新的视图之区别, WITH CHECK OPTION的验证。

      四、相关知识:(电子教材:P113---P127)

      SQL Server提供了很多方法更新表中数据。以插入记录为例,可以使用INSERT语句、VALUES子句将特定值集合插入一行;可以使用数据库接口API(ADO、OLE DB、ODBC和DB-Library)中的函数进行数据插入等。本实验主要掌握INSERT、UPDATE和DELETE语句的基本用法。

      (1)插入操作,其语句的一般格式为

      INSERT INTO table_or_view [(colum_list)]

      VALUES (date_values);

      此语句是使date_values作为一行数据记录插入已命名的表或视图table_or_view中。

      Column_list是由逗号分隔的table_or_view的列名列表,用来指定为其提供数据的列。如果没有指定column_list,表或视图中的所有列都将接收数据。

      如果column_list没有为表或视图中的所有列命名,将在列表中没有命名的任何列中插入一个NULL值(或者在默认情况下为这些列定义的默认值)。在列的列表中没有指定的所有列都必须允许NULL值或者指定的默认值。否则SQL Server将返回一个错误。

      (2)修改操作语句的一般格式为

      UPDATE  表名 SET  <列名>=<表达式>[,<列名>=<表达式>]……

      [where  <条件>];

      其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句用于指定修改方法,即用<表达式>的值取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。

      (3)删除语句的一般格式为

      DELETE FROM  <表名>

      [WHERE <条件>];

      其功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句,则表示要删除表中的所有元组,但表的定义仍在字典中。

      (4)视图

      视图是根据子模式建立的虚拟表。一个视图可以由一个表构造,也可以由多个表构造。利用集成管理中心和视图创建向导进行创建,查看和修改视图就如同对表的操作一样,非常容易。

      视图一经定义,就可以和基本表一样被查询、删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

      视图的作用因应用需求的使用差异性而不同程度地体现。

      五、实验内容

      (1)所使用的学生管理库中的三张表:

      1、STUDENT(学生信息表)

      SNO(学号)

      SNAME(姓名)

      SEX(性别)

      SAGE(年龄)

      SDEPT(所在系)

      95001

      李勇

      20

      CS

      95002

      刘晨

      19

      IS

      95003

      王名

      18

      MA

      95004

      张立

      19

      IS

      95005

      李明

      22

      CS

      95006

      张小梅

      23

      IS

      95007

      封晓文

      20

      MA

      2.COURSE(课程表)

      CNO(课程号)

      CNAME(课程名)

      CPNO(先行课)

      CCREDIT(学分)

      1

      数据库

      5

      4

      2

      数学

      2

      3

      信息系统

      1

      4

      4

      操作系统

      6

      3

      5

      数据结构

      7

      4

      6

      数据处理

      2

      7

      PASCAL语言

      6

      4

      3、SC(选修表)

      SNO(学号)

      CNO(课程号)

      Grade(成绩)

      95001

      1

      92

      95001

      2

      85

      95001

      3

      88

      95002

      2

      90

      95002

      3

      80

      95003

      1

      78

      95003

      2

      80

      95004

      1

      90

      95004

      4

      60

      95005

      1

      80

      95005

      3

      89

      95006

      3

      80

      95007

      4

      65

      (2)数据更新具体完成以下例题:

      1.插入一条学号为“95050”,姓名为“陈冬”的选课记录。

      注:除学号、姓名为真实数据,其他数据随意。

      insert

          into student(Sno,Sname,Ssex,Sage,Sdept)

          values('95050','陈冬','男','18','IS');

      image.gif编辑

      2.将一新学生记录(学号:99999;姓名:风清扬;性别:男;年龄:20;所在系:  

      计算机科学与技术系’CS’)插入学生表中;

      插入一条该生选课记录(‘99999’,’4’,’60’)。

      insert

          into student

          values('99999','风清扬','男','20','CS');

      insert

          into sc

          values('99999','4','60');

      image.gif编辑

      3.对每一个系,求学生的平均年龄,并把结果存入数据库。

      (提示:对于这道题,首先要在数据库中建立一个有两个属性列的新表,其中一列存放系名,另一列存放相应系的学生平均年龄。

      CREATE TABLE Deptage(所在系 CHAR(20),平均年龄SMALLINT);

      然后对数据库的学生表按所在系分组求平均年龄,再把所在系和平均年龄存入新表中。)

      create table Dept_age

          (Sdept char(15),

           Avg_age smallint);

      insert

          into dept_age(Sdept,Avg_age)

          select Sdept,avg(Sage)

          from student

          group by Sdept;

      image.gif编辑

      4.将学号“95001”的学生年龄改为22岁。

      update student

          set Sage=22

          where Sno='95001';

      image.gif编辑

      5.将所有学生的年龄增加一岁。

      update student

           set Sage=Sage+1;

      image.gif编辑

      6.将课程“数据库”的成绩用五级制显示,成绩>=90为优秀,90>成绩>=80为良好,80>成绩>=70为中等,70>成绩>=60为及格,成绩<60为不及格。

      select Sno,Cno,

          (case when grade>=90 then'优秀'when grade>=80 then'良好'

          when grade>=70 then'中等'when grade>=60 then'及格'else'不及格'end)as grade

          from sc

          where Cno='1';

      image.gif编辑

      7.将计算机科学系“CS”全体学生的成绩置零。

      select Sno,Cno,

          (case when grade>=90 then'优秀'when grade>=80 then'良好'

          when grade>=70 then'中等'when grade>=60 then'及格'else'不及格'end)as grade

          from sc

          where Cno=

                (select Cno

                 from course

                 where Cname='数据库');

      image.gif编辑

      8.删除“信息系统”课程成绩小于李明学生成绩的记录。

      delete

      from sc

      where Sno in(

      select Sno

      from sc

      where (Grade<(

            select Grade

            from sc

            where Sno=(

                select Sno

                from student

                where Sname='李明')

            and (Cno=(

                select Cno

                from course

                where Cname='信息系统')

                )

            ))

      )

      image.gif编辑

      9.删除学号为“95006”的学生记录。(提示:注意外键的约束

      set foreign_key_checks=0;

      delete

         from student

         where Sno='95006';

      set foreign_key_checks=1;

      image.gif编辑

      10. 删除计算机科学系“CS”所有学生的选课记录

      delete

         from sc

         where Sno in

               (select Sno

                from student

                where Sdept='CS');

      image.gif编辑

      (3)视图操作具体完成以下例题:

      1. 建立信息系“IS”学生的视图

      create view IS_Student

         as

         select Sno,Sname,Ssex,Sage

         from student

         where Sdept='IS';

      image.gif编辑

      2.建立信息系IS”学生的视图,并要求进行修改和插入操作时仍须保证该视图只有信息系的学生。

      create view IS_student

         as

         select Sno,Sname,Ssex,Sage

         from student

         where Sdept='IS'

         with check option;

      image.gif编辑

      3.建立信息系IS”选修了“1”号课程的学生视图

      create view IS_S1(Sno,Sname,Grade)

         as

         select student.Sno,Sname,Grade

         from student,sc

         where Sdept='IS'

                and student.Sno=sc.Sno

                and sc.Cno='1';

      image.gif编辑

      4. 建立信息系IS”选修了“1”号课程且成绩在90分以上的学生视图

      create view IS_S2

         as

         select Sno,Sname,Grade

         from is_s1

         where Grade>=90;

      image.gif编辑

      5. 定义一个反映学生出生年份的视图(提示:将年龄数值属性体现为“出生年份”

      create view BT_S(Sno,Sname,Sbirth)

         as

         select Sno,Sname,2021-Sage

         from student;

      image.gif编辑

      六、实验结果与分析(概括、分析与总结):

      上述结果中,部分题有多解法,这里只写了一种方法,运用到一些关键词update、delete等,以及创建视图create view……,其中还用了一些语句加以修饰,例如:with check option可以表示对视图进行更改等操作时要保证更新、插入或删除的行满足视图定义中的谓词条件;set foreign_key_checks=0可以在删除元组时关闭外键的介入进而删除元组,删除后在等于1即可;这些关键词等,可以轻松的解决题目。

      七、实验心得:

      本次实验,将本节的数据更新以及视图进行实践。通过实践,不仅可以加强对查询语句的记忆以及其他关键词的用法,使得mysql语句有了更深的记忆,其次对插入、删除或更新等关键词有了进一步的使用,还进而学习到了创建视图。对本次实验,收获颇多,对于今后的学习有了更好的理解和帮助。

      相关文章
      |
      11天前
      |
      人工智能 容灾 关系型数据库
      【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
      12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
      |
      2月前
      |
      架构师 数据库
      大厂面试高频:数据库乐观锁的实现原理、以及应用场景
      数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
      大厂面试高频:数据库乐观锁的实现原理、以及应用场景
      |
      2月前
      |
      存储 缓存 网络安全
      南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
      南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
      |
      2月前
      |
      缓存 NoSQL 数据库
      运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
      本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
      |
      2月前
      |
      SQL Java 数据库连接
      在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
      在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
      61 3
      |
      2月前
      |
      存储 Java 关系型数据库
      在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
      在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
      72 2
      |
      3月前
      |
      XML 存储 数据库
      XML在数据库中有哪些应用?
      【10月更文挑战第17天】XML在数据库中有哪些应用?
      61 2
      |
      11天前
      |
      存储 Oracle 关系型数据库
      数据库传奇:MySQL创世之父的两千金My、Maria
      《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
      39 3
      |
      11天前
      |
      安全 关系型数据库 MySQL
      MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
      《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
      41 3
      |
      11天前
      |
      SQL 关系型数据库 MySQL
      数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
      《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
      53 2