Chapter1SQL例题集中.doc_第1页
Chapter1SQL例题集中.doc_第2页
Chapter1SQL例题集中.doc_第3页
Chapter1SQL例题集中.doc_第4页
Chapter1SQL例题集中.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章关系数据库标准语言SQL的例题代码建议读者在学习本章时,将其中的例子在Microsoft SQL Server 2000标准版的查询分析器(Query analyzer)上全部运行一遍,以真正理解标准SQL语言以及具体DBMS对标准SQL的支持情况,为在第7章中学习建立一个实际的数据库应用系统打下坚实的基础。为了在计算机上实验本章的例题,需要做好以下准备工作: 按照7.2.2节介绍的方法在自己的计算机上安装好Microsoft SQL Server 2000标准版。 按照1.2.1节的方法,即利用的企业管理器(Enterprise Manager),在SQL Server 2000上建立一个名为Student_Mis的数据库文件。 按照1.2.2介绍的方法启动查询分析器(Query Analyzer)工具,然后通过复制/粘贴方式将下面各节例题中的SQL语言代码粘贴到查询分析器的查询语句区并执行这段SQL语言代码即完成相应SQL命令的实验。说明:本章中的SQL命令也可在Windows 98+Microsoft SQL Server 7.0的环境中运行。1.2.1 基本表的定义、删除与修改本章中几乎所有例题都是围绕以下3个关系(基本表)展开的,因此首先就是要建立这三个基本表。表1.4 关系CoursesCnoCnamePre_CnoCreditsC01C02C03C04C05C06C07英语数据结构数据库DB_设计C+网络原理操作系统C05C02C03C07C054223333表1.5 关系ReportsSnoCnoGradeS01S01S02S02S02S03S03S04C01C03C01C02C03C01C02C039284909482729075表1.3 关系StudentsSnoSnameSsexSageSdeptS01S02S03S04S05S06王建平刘华范林军李伟黄河长江男女女男男男211918191820自动化自动化计算机数学数学数学1 定义基本表例1.1 建立表1.3所示的学生表Students,每个属性名的意义为Sno-学号、Sname-姓名、Ssex-性别、Sage-年龄、Sdept-所在系。这里要求Sno和Sname不能为空值,且取值唯一。CREATE TABLE Students /*列级完整性约束条件*/ (Sno CHAR(5) NOT NULL, /* Sno不能为空值*/ Sname CHAR(20) NOT NULL, /*Sname不能为空值*/ Ssex CHAR(2), Sage INT, Sdept CHAR(15), CONSTRAINT un_Sno UNIQUE(Sno), /* Sno取值唯一的约束*/ CONSTRAINT un_Sname UNIQUE(Sname); /* Sname取值唯一的约束*/说明:在Microsoft SQL Server 2000的查询分析器(Query Analyzer)中使用单条SQL语句,其末尾不需要分号“;”作为命令结尾标记。通常,SQL Server 2000对大多数末尾带有分号的SQL命令都能顺利执行,但对少数的SQL命令,末尾若带分号,则SQL Server 2000会给出错误信息提示。 比如,若在例1.59的SQL命令末尾加上一个分号“;”,SQL Server 2000就会出现“Incorrect syntax near ;”的提示,虽然SQL Server 2000实际上已经执行了该命令。例1.1-1 建立表1.4所示的课程表Courses,其属性名意义分别为Cno-课程号, Cname-课程名, Pre_Cno-先修课程号, Credits-学分。CREATE TABLE Courses (Cno CHAR(5) NOT NULL, /* Cno不能为空值*/ Cname CHAR(20) NOT NULL, /*Cname不能为空值*/ Pre_Cno CHAR(5), Credits INT, CONSTRAINT un_Cno UNIQUE(Cno); /*Cno取值唯一的约束*/例1.1-2 建立表1.5所示的成绩表Reports。其中的属性名意义分别为Sno-学号,Cno-课程号和Grade-考试成绩。 CREATE TABLE Reports ( Sno CHAR(5) NOT NULL, /* Sno不能为空值*/ Cno CHAR(5) NOT NULL, /* Cno不能为空值*/ Grade INT, CONSTRAINT Sno_Cno UNIQUE(Sno,Cno); /*Sno+Cno取值唯一的约束*/2 修改基本表例1.2 向基本表Students中增加“入学时间”属性列,其属性名为Sentrancedate,数据类型为DATETIME型。ALTER TABLE Students ADD Sentrancedate DATETIME; 例1.3 将Sage(年龄)的数据类型改为SMALLINT型。ALTER TABLE Students ALTER COLUMN Sage SMALLINT;例1.4 删除Sname(姓名)必须取唯一值的约束。ALTER TABLE Students DROP CONSTRAINT un_Sname;注意:SQL Server 2000 增加了删除属性的命令。比如,删除属性列Sentrancedate的命令为:ALTER TABLE Students DROP COLUMN Sentrancedate;说明: 为了保证后面例子能够顺利运行,请读者一定将属性列Sentrancedate从Students表中删除。 为了初学者调试SQL语句方便,这里没有在表Reports中增加参照完整性约束,甚至没有定义主键。等本章学完后,第7章的实验系统就是把这些约束全部加上了。3 删除基本表例1.5 删除Students表。DROP TABLE Students;说明:此表删除后,请立即用例1.1将其建立起来,以便后面的例子使用。4 向表中添加元组例1.6 将一个学生元组(S01,王建平,男,21,计算机)添加到基本表Students中。INSERTINTO StudentsVALUES (S01,王建平,男,21,自动化);说明: 请读者用这个命令将其余5个学生的元组也添加到基本表Students中。 向Courses表插入元组(C01,英语,4)的命令为:INSERTINTO CoursesVALUES (C01,英语,4);也请读者将其余6门课程的信息插入Courses表中。例1.7 将学习成绩的元组(S01, C01)添加到基本表Reports中。INSERTINTO Reports(Sno, Cno)VALUES (S01,C01);说明:请读者用这个命令将其余7个选课元组也添加到基本表Reports中.1.2.2 建立与删除索引1 建立索引例1.8 为学生选课数据库中的Students,Courses,Reports三个表建立索引。其中Students表按Sno(学号)升序建唯一索引,Courses表按Cno(课程号)升序建唯一索引,Reports表按Sno(学号)升序和Cno(课程号)号降序建唯一索引。其语句为:CREATE UNIQUE INDEX Stu_Sno ON Students(Sno);CREATE UNIQUE INDEX Cou_Cno ON Courses(Cno);CREATE UNIQUE INDEX Rep_Scno ON Reports(Sno ASC, Cno DESC);例1.9 在基本表Students的Sname(姓名)和Sno(学号)列上建立一个聚簇索引,而且Students中的物理记录将按照Sname值和Sno值的升序存放。其语句为:CREATE CLUSTERED INDEX Stu_Sname_Sno ON Students(Sname, Sno);2 删除索引例1.10 删除基本表Reports上的Rep_SCno索引。DROP INDEX Reports.Rep_Scno;1.3 SQL的数据查询1.3.1 简单的选择与投影查询简单的选择与投影查询指仅涉及一个基本表或一个视图的查询。1 无条件查询例1.11 查询全体学生的详细记录。这是一个无条件的选择查询,其命令为:SELECT * /*这里的“*”等价于ALL*/FROM Students;其结果为表1.3中的全部数据。例1.12 查询全体学生的姓名(Sname)、学号(Sno)、所在系(Sdept)。这是一个无条件的投影查询,其命令为:SELECT Sname, Sno, SdeptFROM Students;例1.13 查询全体学生的姓名(Sname)、出生年份及学号(Sno)。由于SELECT子句的不仅可以是表中的属性列,也可以是表达式,故可以查询经过计算的值。其命令为:SELECT Sno, Sname, 2001-SageFROM Students;例1.14 查询全体学生的姓名、出生年份和学号,要求用小写字母表示学号中的字母。其命令为:SELECT Sname, Birth: Title, 1996-Sage BirthYear, LOWER(Sno) LsnoFROM Students;例1.15 查询选修了课程的学生学号。其命令为:SELECT DISTINCT SnoFROM Reports;2 条件查询例1.16 查询数学系全体学生的学号(Sno)和姓名 (Sname)。其命令为:SELECT Sno, SnameFROM StudentsWHERE Sdept=数学;例1.17 查询所有年龄在1822岁(包括18岁和22岁)之间的学生姓名(Sname)及年龄(Sage)。其命令为:SELECT Sname, SageFROM StudentsWHERE Sage=18 AND Sage=3;1.3.2 连接查询1 不同表之间的连接查询例1.37 查询每个学生及其选修课程的情况。本查询实际上是涉及Students与Reports两个表的连接操作。这两个表之间的联系是通过公共属性Sno实现的,因此,其操作命令为:SELECT Students.*, Reports.*FROM Students, ReportsWHERE Students.Sno = Reports.Sno; 说明:若在以上等值连接中把目标列中重复的属性列去掉则为自然连接,其命令为SELECT Students.Sno, Sname, Ssex, Sage, Sdept, Cno, GradeFROM Students, ReportsWHERE Students.Sno= Reports.Sno;例1.38 查询每个学生的学号(Sno)、姓名(Sname)、选修的课程名(Cname)及成绩(Grade)。本查询涉及到三个表的连接操作,完成该查询的SQL语句如下:SELECT Students.Sno, Sname, Cname, GradeFROM Students, Reports, CoursesWHERE Students.Sno= Reports.Sno AND Reports.Cno=Courses.Cno;2 自身连接例1.39 查询每一门课的间接先修课(即先修课的先修课)。在Courses表关系中,只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程。这就需要要将Courses表与其自身连接。为方便连接运算,这里为Courses表取两个别名分别为A,B。则完成该查询的SQL语句为:SELECT A.Cno, A.Cname, B.Pre_CnoFROM Courses A, Courses BWHERE A.Pre_Cno =B.Cno;3 外连接例1.40把例1.37中的等值连接改为左连接。该左连接操作在SQL Server 2000中的命令格式为:SELECT Students.Sno, Sname, Ssex, Sdept, Cno, GradeFROM StudentsLEFT JOIN Reports ONStudents.Sno= Reports.Sno;说明:以上左连接操作也可以用如下的右连接操作代替,其结果完全一样。SELECT Students.Sno, Sname, Ssex, Sdept, Cno, GradeFROM ReportsRIGHT JOIN Students ONReports.Sno=Students.Sno;1.3.3 嵌套查询1 带谓词IN的嵌套查询例1.41 查询选修了编号为“C02”的课程的学生姓名(Sname)和所在系(Sdept)。SELECT Sname, SdeptFROM StudentsWHERE Sno IN (SELECT Sno FROM Reports WHERE Cno=C02);例1.42 查询与“李伟”在同一个系学习的学生学号(Sno)、姓名(Sname)和系名(Sdept)。该查询可构造嵌套查询实现,其SQL语句如下:SELECT Sno, Sname, SdeptFROM StudentsWHERE Sdept IN (SELECT Sdept FROM Students WHERE Sname=李伟);说明:本例中的查询也可以用自身连接来完成,其SQL语句如下:SELECT A.Sno , A.Sname , A.SdeptFROM Students A , Students BWHERE A.Sdept=B.Sdept AND B.Sname=李伟;例1.43 查询选修了课程名为“数据结构”的学生学号(Sno)和姓名(Sname)。本查询涉及学号、姓名和课程名(Cname)三个属性。学号和姓名存放在Students表中,课程名的存放在Courses表中,但Students与Courses两个表之间没有公共属性,必须通过Reports表建立它们之间的联系。所以本查询实际上涉及三个关系的连接操作。SELECT Sno, Sname /* 最后在Studenst关系中 */FROM Students /* 取出Sno和Sname */WHERE Sno IN (SELECT Sno /* 然后在SC关系中找出 */ FROM Reports /*选修了3号课程的学生学号*/ WHERE Cno IN (SELECT Cno /* 首先在Courses关系中 */ FROM Courses /*找出“数据结构”的课程号,*/ WHERE Cname = 数据结构); /*结果为C02号 */说明:本查询同样可以用连接查询实现:SELECT S.Sno, SnameFROM Students S, Reports R, Courses CWHERE S.Sno=R.Sno AND R.Cno=C.Cno AND C.Cname=数据结构;2 带有比较运算符的嵌套查询例1.44 将例1.42改为带有比较运算符的嵌套查询。由于一个学生只可能在一个系学习,因此子查询的结果是一个值,因此可以用=代替IN,其SQL语句如下:SELECT Sno , Sname, SdeptFROM StudentsWHERE Sdept = (SELECT Sdept FROM Students WHERE Sname=李伟);3 带谓词ANY或ALL的嵌套查询例1.45 查询非自动化系的不超过自动化系所有学生的年龄的学生姓名(Sname)和年龄(Sage)。其查询命令为SELECT Sname, SageFROM StudentsWHERE Sdept自动化 AND Sage=ALL (SELECT Sage FROM Students WHERE Sdept= 自动化);说明:本查询也可以用集函数来实现。其SQL语句如下:SELECT Sname, SageFROM StudentsWHERE Sdept自动化 AND Sage= (SELECT MIN(Sage) FROM Students WHERE Sdept=自动化);4 带谓词EXISTS的嵌套查询例1.46 查询所有选修了编号为“C01”课程的学生姓名(Sname)和所在系(Sdept)。本查询的SQL语句是:SELECT Sname, SdeptFROM StudentsWHERE EXISTS (SELECT * FROM Reports WHERE Sno=Students.Sno AND Cno=C01);例1.47 将例1.42改为带谓词EXISTS的查询,其SQL语句如下SELECT Sno, Sname, SdeptFROM Students AWHERE EXISTS (SELECT * FROM Students B WHERE B.Sdept=A.Sdept AND B.Sname=李伟);例1.48 查询选修了所有课程的学生姓名(Sname)和所在系。由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。其SQL语句为:SELECT Sname, SdeptFROM StudentsWHERE NOT EXISTS (SELECT * FROM Courses WHERE NOT EXISTS (SELECT * FROM Reports WHERE Sno=Students.Sno AND Cno=Courses.Cno);1.3.4 集合查询例1.49 查询计算机科学系的学生或年龄不大于20岁的学生信息。SELECT *FROM StudentsWHERE Sdept=计算机UNIONSELECT *FROM StudentsWHERE Sage=20;例1.50 查询数学系的学生且年龄不大于20岁的学生的交集,这实际上就是查询数学系中年龄不大于20岁的学生。SELECT *FROM StudentsWHERE Sdept=数学 AND Sage20;1.4 SQL的数据更新1.4.1 插入数据例1.52 设数据库中已有一个关系History_Student,其关系模式与Students完全一样,试将关系Students中的所有元组插入到关系History_Student中去,其SQL命令为:INSERTINTO History_StudentSELECT *FROM Students;1.4.2 修改数据例1.53 将学号为“S03”的学生年龄改为22岁,即要修改满足条件的一个元组的属性值。UPDATE StudentsSET Sage=22WHERE Sno=S03;例1.54 将所有学生的年龄增加1岁。即要修改多个元组的值。UPDATE StudentsSET Sage=1+Sage;例1.55 将数学系所有学生的成绩置零。由于学生所在系的信息在Students表中,而学习成绩在Reports表中,因此,可以将SELECT子查询作为WHERE子句的条件表达式。故该更新要求的SQL命令为:UPDATE ReportsSET Grade=0WHERE 数学=(SELECT SdeptFROM StudentsWHERE Students.Sno=Reports.Sno);1.4.3 删除数据例1.56 删除学号为“S04”的学生选修的课号为“C02”的记录。DELETEFROM ReportsWHERE Sno=S04 AND Cno=C02;例1.57 删除所有学生的选课记录。DELETEFROM Reports;这条DELETE语句将删除Reports的所有元组,使Reports成为空表。例1.58 删除数学系所有学生的选课记录。DELETEFROM Reports WHERE 数学=(SELECT SdeptFROM StudentsWHERE Students.Sno=Reports.Sno);1.5 SQL的视图1.5.1 定义视图1 建立视图例1.59 建立数学系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有数学系的学生,视图的属性名为Sno,Sname,Sage,Sdept。CREATE VIEW C_StudentASSELECT Sno, Sname, Sage, Sdept FROM StudentsWHERE Sdept=数学WITH CHECK OPTION例1.60 建立学生的学号(Sno)、姓名(Sname)、选修课程名(Cname)及成绩(Grade)的视图。本视图由三个基本表的连接操作导出,其SQL语句如下:CREATE VIEW Student_CRASSELECT Students.Sno, Sname, Cname, GradeFROM Students, Reports, CoursesWHERE Students.Sno= Reports.Sno AND Reports.Cno=Courses.Cno例1.61 定义一个反映学生出生年份的视图。CREATE VIEW Student_birth(Sno, Sname, Sbirth)AS SELECT Sno, Sname, 1996-SageFROM Students2 删除视图例1.62 删除视图Student_CR。DROP VIEW Student_CR;1.5.2 查询视图例1.63 在数学系的学生视图C_Student中找出年龄(Sage)小于20岁的学生姓名(Sname)和年龄(Sage)。SELECT Sname, SageFROM C_StudentWHERE Sage20;说明:本例转换后的查询语句为:SELECT Sname, Sage FROM StudentsWHERE Sdept=数学 AND Sage85; 1.5.3 更新视图例1.65 将数学系学生视图C_Student中学号为S05的学生姓名改为“黄海”。UPDATE C_StudentSET Sname=黄海WHERE Sno=S05;说明:DBMS自动转换为对基本表的更新语句如下:UPDATE StudentsSET Sname=黄海WHERE Sno=S05 AND Sdept=数学;例1.66 向数学系学生视图C_Student中插入一个新的学生记录,其中学号为“S09”,姓名为“王海”,年龄为20岁。INSERTINTO C_StudentVALUES (S09, 王海, 20, 数学);例1.67 删除数学系学生视图C_Student中学号为“S09”的记录。DELETEFROM C_StudentWHERE Sno=S091.7.3 PowerBuilder中的嵌入式SQL语句说明:本节的例子必须在PowerBuilder环境中才能运行,不懂PowerBuilder的初学者没有必要对其做上机实验。以下这些材料对制作多媒体教案有用。1 检索单行数据的SELECT语句例1.76 查询学号为“S01”的学生选修课程号“C01”课程的考试成绩。String Xno,Kno /PowerBuilder 声明两个字符串变量,分别存放学号和课程号Int Cgrage / PowerBuilder 声明一个整型变量,用于存放学习成绩SELECT Sno,Cno,Grade /本行开始的4行为一条完整的嵌入式SQL语句INTO :Xno, :Kno, :Cgrage /SQL中引用PowerBuilder的主变量前要加冒号 FROM Reports WHERE Sno=S01 AND Cno=C01; /PowerBuilder使用SQL时以分号结束以上程序段将SELECT取得的一条记录赋值给主变量Xno, Kno和Cgrage。2 INSERT语句例1.77 向表Reports中添加一条记录(S12,C05,87)。INSERT INTO Reports(Sno,Cno,Grade) VALUES (S12,C05,87);或者String Xno,Kno /PowerBuilder 声明两个字符串变量,分别存放学号和课程号Int Cgrage / PowerBuilder 声明一个整型变量,用于存放学习成绩Xno=S12 /将欲插入的值赋给主变量Xno, Kno和CgrageKno=C05Cgrage=87INSERT INTO Reports(Sno,Cno,Grade) /将主变量Xno, Kno和Cgrage的值插入表中VALUES (:Xno, :Kno, :Cgrage);3 UPDATE语句例1.78 将表“Reports”中所有成绩低于90的学生加5分。UPDATE Reports SET Grade=Grade+5 WHERE Grade90;4 DELETE语句例1.79 删除“Reports”表中所有选“C03”课程的学生信息。DELETE FROM Reports WHERE Cno=C03;5 游标的使用例1.80 查询关系Reports中的Grade信息,如果Grade的值小于85,则将其在原来基础上增加5,否则将该记录删除。这个更新操作可以通过使用游标的以下程序实现。Int Cgrade /声明一个整型变量,作为SQL的主变量DECLARE Report_Cur CURSOR FOR /声明游标Report_CurSELECT Grade /并将查询结果数据集相联系 FROM Reports;OPEN Report_Cur; /打开游标Report_CurFETCH Report_Cur INTO :Cgrade; /读取游标的第一条记录,并存入主变量DO WHILE SQLCA.SQLCode = 0 /循环结构开始,若读取成功则进入循环 IF Cgrade85 THEN /若读出的该记录成绩(Cgrade)低于85分 UPDATE Reports /则该记录的成绩(Grade)增加85分 SET Grade = Grade+5 WHERE CURRENT OF Report_Cur; /这是CURRENT型UPDATE语句ELSE /否则删除该记录 DELETE FROM Reports WHERE CURRENT OF Report_Cur;END IF FETCH Report_Cur INTO :Cgrade; /读取游标的下一条记录LOOP /循环结构结束符CLOSE Report_Cur; /关闭游标Report_Cur1.7.4 在Delphi中使用SQL语句说明:本节的例子必须在Delphi环境中才能运行,不懂Delphi的初学者没有必要对其做上机实验,第7章有一个完整的应用系统例子供上机实验之用。以下这些材料对制作多媒体教案有用。本节后面每个例子都需要的-步语句定义如下,在后面的例子中不再给出。MyQuery: =TQuery.Create(Application); /声明并创建一个TQuery类的控件MyQueryMyQuery.DatabaseName :=student; / MyQuery控件要访问的数据库别名为student 1检索单行数据的SELECT语句例1.81 查询学号为“S01”的学生选修课程号“C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论