草庐IT

【数据库】实验 1:数据库定义与操作语言实验

hnu后湖十级爱好者 2023-04-20 原文

文章目录


前言

本篇文章相当于是一个简单的SQL语言归纳总结,包括数据库定义和一些基本的数据操作。值得注意的是,不同的数据库系统有着自己的特点,语法不完全相同,在使用具体系统是可以查阅各产品的用户手册。


提示:以下是本篇文章正文内容,下面案例可供参考

样例选择

本实验所使用的数据库为学生-课程数据库S-T

• 学生-课程数据库模式 S-T :

学生表:Student(Sno,Sname,Ssex,Sage,Sdept)

课程表:Course(Cno,Cname,Cpno,Ccredit)

学生选课表:SC(Sno,Cno,Grade)



实验 1.1 数据库定义实验

(1)实验目的

理解和掌握数据库 DDL 语言,能够熟练地使用 SQL DDL 语句创建、修改和 删除数据库、模式和基本表。

(2)实验内容和要求

理解和掌握 SQL DDL 语句的语法,特别是各种参数的具体含义和使用方法; 使用 SQL 语句创建、修改和删除数据库、模式和基本表。掌握 SQL 语句常见语法错误的调试方法。

(3)实验重点和难点

实验重点:创建数据库、基本表。

实验难点:创建基本表时,为不同的列选择合适的数据类型,正确创建表 级和列级完整性约束,如列值是否允许为空、主码和外码等。注意:数据完整 性约束,可以在创建基本表时定义,也可以先创建表然后定义完整性约束。由于完整性约束的限制,被引用的表要先创建。

(4)实验记录

1.DDL语言

数据(结构)定义语言DDL(Data Definition Language),是用于创建和修改数据库表结构的语言

常用的语句:create, alter, drop, rename

2.SQL DDL 语句

数据库:
#创建数据库
CREATE DATABASE lab1;

#修改数据库字符集
ALTER DATABASE lab1 CHARSET utf8;

#删除数据库
DROP DATABASE lab1;
模式:

严格地说,在MySql中,Database和Schema之间的区别是不存在的。

但是,在其他数据库引擎(如SQL Server)中并非如此。 在SQL server:中,

每个表都属于数据库中称为数据库模式的一组对象。 它是容器或命名空间(查询Microsoft SQL Server 2012)

#创建模式
CREATE SCHEMA S-T AUTHORIZATION QUAN;

#修改模式
SQL标准不提供修改模式定义的操作

#删除模式  CASCADE(级联)/RESTRICT(限制) 二只必选其一
DROP SCHEMA S-T CASCADE;
基本表

数据类型

#创建基本表
mysql> CREATE TABLE Student
    -> (Sno CHAR(9) PRIMARY KEY,  /*列级完整性约束条件,Sno是主码*/
    -> Sname CHAR(20) UNIQUE,   /*Sname取唯一值*/
    -> Sex CHAR(2),
    -> Sage SMALLINT,
    -> Sdept CHAR(20)
    -> );

mysql> CREATE TABLE Course
    -> (Cno CHAR(4) PRIMARY KEY,  /*列级完整性约束条件,Cno是主码*/
    -> Cname CHAR(40) NOT NULL,    /*列级完整性约束条件,Cname不能取空值*/
    -> Cpno CHAR(4),
    -> Ccredit SMALLINT,
    -> FOREIGN KEY(Sno) REFERENCES Student(Sno),
    -> FOREIGN KEY(Cpno) REFERENCES Course(Cno)
                       /*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/
    -> );
    
mysql> CREATE TABLE SC
    -> (Sno CHAR(9),
    -> Cno CHAR(4),
    -> Grade SMALLINT,
    -> PRIMARY KEY (Sno,Cno),
    -> FOREIGN KEY(Cno) REFERENCES Course(Cno)
                       /*表级完整性约束条件,Cno是外码,被参照表是Course,被参照列是Course*/
    -> );
#修改基本表
ALTER TABLE Student ALTER COLUMN Sage INT; /*修改年龄的数据类型为整数*/

#删除基本表
mysql> DROP TABLE SC CASCADE;

实验 1.2 数据基本查询实验

(1)实验目的

掌握 SQL 程序设计基本规范,熟练运用 SQL 语言实现数据基本查询,包括单表查询、分组统计查询和连接查询。

(2)实验内容和要求

针对某个数据库设计各种单表查询 SQL 语句、分组统计查询语句;设计单个表针对自身的连接查询,设计多个表的连接查询。理解和掌握 SQL 查询语句 各个子句的特点和作用,按照 SQL 程序设计规范写出具体的 SQL 查询语句,并 调试通过。

说明:简单地说,SQL 程序设计规范包含 SQL 关键字大写、表名、属性名、 存储过程名等标识符大小写混合、SQL 程序书写缩进排列等编程规范。

(3)实验重点和难点

实验重点:分组统计查询、单表自身连接查询、多表连接查询。

实验难点:区分元组过滤条件和分组过滤条件;确定连接属性,正确设计连接条件.

(4)实验记录

1.单表查询(实现投影操作)

查询学生学号和姓名

SELECT Sno,Sname
FROM Student;

2.单表查询(实现选择操作)

查询分数大于90的选课信息

SELECT *
FROM SC
WHERE Grade>90;

3.不带分组过滤条件的分组统计查询

统计每个学生的选修课数目

SELECT Student.Sno SUM(*)
FROM Student,SC
WHERE Student.Sno=SC.Sno
GROUP BY Student.Sno;

4.带分组过滤条件的分组统计查询

查询选课数大于2的学生学号和姓名

SELECT Student MAX(Student.Sname)
FROM Student,SC
WHERE Student.Sno=SC.Sno
GROUP BY Student.Sno
HAVING SUM(*)>2;

5.单表自身连接查询

查询每门课的间接先修课(先修课的先修课)

SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Con;

6.两表连接查询

查询每个学生及其选修课程的情况

SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;

7.两表连接查询(自然连接)

查询每个学生及其选修课程的情况

SELECT Student.Sno,Sname,Sex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;

8.三表连接查询

查询每个学生的学号、姓名、选修的课程名及成绩

SELECT Student.Sno,Sname,Cname,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.cno;

实验 1.3 数据高级查询实验**

(1)实验目的

掌握 SQL 嵌套查询和集合查询等各种高级查询的设计方法等。

(2)实验内容和要求

针对自定义数据库,正确分析用户查询要求,设计各种嵌套查询和集合查 询。

(3)实验重点和难点

实验重点:嵌套查询。

实验难点:相关子查询、多层 EXIST 嵌套查询。

(4)实验记录

1.IN嵌套查询

查询与”刘晨“在同一个系学习的学生

SELECT *
FROM Student
WHERE Sdept IN (SELECT Sdept
                FROM Student
    			WHERE Sname='刘晨';)

2.单层EXISTS嵌套查询

查询所有选修了1号课程的学生姓名

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *
    		 FROM SC
			 WHERE Sno=Student.Sno AND Cno='1';)

3.双层EXISTS嵌套查询

查询选修了全部课程的学生姓名=没有一门课程是他不选修的

SELECT Sname
FROM Student
WHERE NOT EXISTS
		  (SELECT *
          FROM Course
          WHERE NOT EXISTS
          			(SELEST *
                    FROM SC
                    WHERE Sno=Student.Sno
                    AND Cno=Course.Cno));

4.集合查询(交)

查询计算机科学系的学生与年龄不大于19岁的学生的交集

SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;

5.集合查询(并)

查询选修了课程1或者选修了课程2的学生

SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno='2';

6.集合查询(差)

查询计算机科学系的学生与年龄不大于19岁的学生的差集

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19;

实验 1.4 数据更新实验

(1)实验目的

熟悉数据库的数据更新操作,能够使用 SQL 语句对数据库进行数据的插入、 修改、删除操作。

(2)实验内容和要求

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

(3)实验重点和难点

实验重点:插入、修改和删除数据的 SQL。

实验难点:与嵌套SQL子查询相结合的插入、修改和删除数据的SQL 语句; 利用一个表的数据来插入、修改和删除另外一个表的数据。

(4)实验记录

1.INSERT基本语句(插入全部列的数据)

插入一条学生信息,要求每一列都给一个合理的值。

INSERT INTO Student
VALUES('201215121','李勇''男',20,'CS');

2.INSERT基本语句(插部分列的数据)

插入一条课程记录,给出必要的几个字段值。

INSERT INTO Course(Cno,Cname,Ccredit)
VALUES('2','数学',2);

3.批量数据INSERT语句

  • 创建一个新的学生表,把所有选了1号课程的学生插入到新的学生表中。

    CREATE TABLE NewStudent AS SELECT * FROM Student WITH NO DATA;
    /*WITH NO DATA 子句使得SELECT查询只生成一个结果模式,不查询出实际数据*/
    INSERT INTO NewStudent
    SELECT S.*
    FROM Student S,SC C
    WHERE S.Sno=C.Sno AND C.Cno='1';
    
  • 创建一个学生选课统计表,记录每个学生及其选课总数和总学分等信息

    CREATE TABLE CourseStat
    (Sno CHAR(9),
     quantity REAL,
     totalcredits 
    );
    INSERT INTO CourseStat
    SELECT Student.Sno,COUNT(*),SUM(Ccredit)
    FROM Student,Course,SC
    WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
    GROUP BY Student.Sno;
    

4.UPDATE语句(修改部分记录的部分列值)

将计算机科学系全体学生成绩下降10%

UPDATE SC
SET Grade=Grade*0.9
WHERE Sno IN
		(SELECT Sno
        FROM Student
        WHERE Sdept='CS');

5.UPDATE语句(利用一个表中的数据修改另一个表中的数据)

利用Course表中学分来修改SC表中的Grade,其中Grade=Course.Ccredit*Grade

UPDATE SC
SET SC.Grade=Course.Ccredit*SC.Grade
FROM Course
WHERE SC.Cno=Course.Cno;

6.DELET基本语句(删除给定条件的所有记录)

删除学生李勇的所有选课记录

DELETE FROM Student
WHERE Sname='李勇'DELETE RFOM SC
WHERE Sno = (SELECT SC.Sno
             FROM SC,Student
             WHERE SC.Sno=Student.Sno AND Student.Sname='李勇'
)

实验 1.5 视图**

(1)实验目的

熟悉SQL语言有关视图的操作,能够熟练使用 SQL语句来创建需要的视图, 定义数据库外模式,并能使用所创建的视图实现数据管理。

(2)实验内容和要求

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

(3)实验重点和难点

实验重点:创建视图。

实验难点:可更新的视图和不可更新的视图的区别, WITH CHECK OPTION 的验证。

(4)实验记录

1.创建视图(省略视图列名)

省略则隐含该视图由子查询中SELECT子句目标列中的诸字段组成

建立信息系学生的视图

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Stept='IS';

2.创建视图(不能省略视图列名的情况)

  • 某个目标列不是单纯的属性名,而是聚集函数列表达式
  • 多表连接时选出了几个同名列作为视图的字段
  • 需要在视图中为某个列启用新的更合适的名字

建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)

CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno AND 
	  Student.Stept='IS' AND
	  SC.Cno='1';

3.创建视图(WITH CHECK OPTION)

WITH CHECK OPTION 表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图中定义的谓词条件(即子查询中的条件表达式)

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

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Stept='IS'
WITH CHECK OPTION;

4.可更新的视图(行列子集视图)

行列子集视图:从单个基本表导出,并且只是去掉了基本表的某些列和某些行,但是保留了主码

建立信息系学生的视图

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Stept='IS';

5.不可更新的视图

DB2规定以下视图不允许更新:

  • 视图由两个以上基本表导出
  • 视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作
  • 视图的字段来自聚集函数
  • 视图定义中含有GROUP BY子句
  • 视图定义中含有DISTINCT短语
  • 视图定义中含有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表
  • 一个不允许更新的视图上定义的视图

将SC表中成绩在平均成绩之上的元祖定义成一个视图

CREATE VIEW GOOD_SC
AS
SELECT Sno,Cno,Grade
FROM SC
WHERE Grade >
			(SELECT AVG(Grade)
            FROM SC);

6.删除视图(RESTRICT/CASCADE)

删除视图GOOD_SC

DROP VIEW GOOD_SC CASCADE; /*删除了视图GOOD_SC和由它导出的所有视图*/

总结

查询是重点,连接查询是重中之重

有关【数据库】实验 1:数据库定义与操作语言实验的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

随机推荐