当前位置:文档之家› 数据库原理实验2数据查询

数据库原理实验2数据查询

课程名称数据库原理实验序号 2实验项目数据查询实验地点实验学时实验类型验证性指导教师实验员专业班级学号姓名年月日成绩:A教师该学生本次实验的内容丰富,完成的操作步骤详细具体,实验结果正确,在实验报告的填写中态度十分严谨,对数据分析有自己的见解。

四、实验过程(实验步骤、记录、数据、分析)实验准备:在实验一的基础上(包括数据库的建立、定义表和添加表内容)进行实验,下面分别为depts表、students表、courses表、reports表。

一、简单的选择与投影查询1、无条件查询1.1查询全体学生的详细记录。

这是一个无条件的选择查询,其命令为:其命令为:select * from students运行结果如右图,显示整张表的内容。

1.2查询全体学生的姓名(Sname)、学号(Sno)、所在系(dno)。

这是一个无条件的投影查询,其命令为:select sname,ssexfrom students运行结果如右图,显示了表中的三列。

1.3查询全体学生的姓名(Sname)、出生年份及学号(Sno)。

其命令为:select sno,sname,2017-sage as birth from students运行结果如右图,显示了三列内容。

1.4查询全体学生的姓名、出生年份和学号,要求用小写字母表示学号中的字母。

其命令为:select sname,'birth:' title,YEAR(GETDATE())-sagebirthyear,LOWER(sno) lsnofrom students运行结果如右图,显示了四列内容。

1.5查询选修了课程的学生学号。

其命令为:select distinct snofrom reports运行结果如右图,distinct短语是为了消去查询结果中的重复值。

2、条件查询(1)比较条件1.1查询d03系全体学生的学号(Sno)和姓名(Sname)。

其命令为:select sno,snamefrom studentswhere dno='d03'运行结果如右图,显示了d03系的全体学生姓名与学号。

1.2查询所有年龄在18~22岁(包括18岁和22岁)之间的学生姓名(Sname)及年龄(Sage)。

其命令为:select sno,sagefrom studentswhere sage >= 18 and sage <=20运行结果如右图,共有5名在18岁到20岁的学生。

(2)谓语条件2.1查询年龄在18~22岁(包括18岁和22岁)之间的学生姓名(Sname)及年龄(Sage)。

其命令为:select sno,sagefrom studentswhere sage between 18 and 20运行结果如右图,结果与比较条件的结果一样。

2.2查询年龄不在18-22岁之间的学生姓名(Sname)及年龄(Sage)。

其命令为:select sno,sagefrom studentswhere sage not between 18 and 20运行结果如右图,共有2个人不在18岁到20岁之间。

2.3查询系别编号为d01、d02、d03学生的学号(Sno)、姓名(Sname)和性别(Ssex)。

其命令为:select sno,sname,ssexfrom studentswhere dno='d01' or dno='d02' or dno='d03'运行结果如右图,共有6个人。

2.4查询系别编号既不是d01、d02,也不是d03的学生的姓名(Sname)和性别(Ssex)。

其命令为:select sname,ssexfrom studentswhere dno not in('d01','d02','d03')运行结果如右图,因为没有其他系别的学生,因此查询出来的是空表。

2.5查询所有姓刘的学生的姓名(Sname)、学号(Sno)和性别(Ssex)。

其命令为:select sname,sno,ssexfrom studentswhere sname like '刘%'运行结果如右图,只有一个人姓刘。

2.6查询姓“刘”而且全名不多于3个汉字的学生的姓名(sname)和所在系(dno),其命令为:select sname,dnofrom studentswhere sname like '刘__'运行结果如右图,在英文系统中下横线“_”代表一个英文字符,但在支持汉字的数据库系统中下横线“_”也代表一个汉字,所以匹配串“刘”的后面只需要跟2个“_”(下横线)2.7查询所有不姓刘的学生姓名(Sname)和年龄(Sage)。

其命令为:select sname,sagefrom studentswhere sname not like '刘%'运行结果如右图,5个人不姓刘。

2.8查询课程名为“DB_设计”的课程号(Cno)和学分(Credits)。

其命令为:select cno,creditsfrom courseswhere cname like 'DB\_设计' escape '\'运行结果如右图,ESCAPE‘\’短语表示\为换码字符,这样匹配串中紧跟在\后面的字符“_”不再具有通配符的含义,转义为普通的“”字符。

2.9查询以"DB_"开头,且倒数第2个汉字字符为“设”的课程的详细情况。

其命令为:select *from courseswhere cname like 'DB\_设_' escape '\'运行结果如右图,这里的匹配串为“DB\_%设_。

第1个“_”前面有换码字符“\”,所以它被转义为普通的“_”字符。

由于“%”和“设”字后面的下横线“_”的前面均没有换码字符“\”,所以它们仍作为通配符。

2.10假设某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。

试查询缺少成绩的学生的学号(Sno)和相应的课程号(Cno)。

其命令为:select sno,cnofrom reportswhere grade IS NULL运行结果如右图,没有缺少成绩的学生,因此查询结果为空。

IS不能用等号“=”代替,否则不能得到正确的查询结果。

2.11查询所有有成绩的学生学号(Sno)和课程号(Cno)。

其命令为:select sno,cnofrom reportswhere grade is not NULL运行结果如右图,3、查询结果排序3.1查询选修了C03号课程的学生的学号(Sno)和成绩(Grade),并按成绩降序排列。

其命令为:select sno,gradefrom reportswhere cno='c03'order by grade desc运行结果如右图,查询并降序排列。

3.2查询全体学生情况,查询结果按所在系的系别编号(dnot)升序排列,同一系中的学生按年龄(Sage)降序排列。

其命令为:select *from studentsorder by dno,sage desc运行结果如右图3、集函数的使用4.1查询学生总人数。

其命令为:select COUNT(*) renshufrom students运行结果如右图,学生总人数为6人。

4.2查询选修了课程的学生人数。

其命令为:select COUNT( distinct sno) renshufrom reports运行结果如右图,为了避免重复,必须在函数中使用distinct短语。

4.3计算选修C01号课程的学生平均成绩。

其命令为:select A VG(grade) 平均成绩from reportswhere cno='c01'运行结果如右图4.4查询选修C01号课程的学生最高分数。

其命令为:select max(grade) 最高分from reportswhere cno='c01'运行结果如右图4、查询结果分组5.1求各个课程号(Cno)及相应的选课人数。

其命令为:select cno,count(sno) cntsnofrom reportsgroup by cno运行结果如右图5.2查询选修了3门或3门以上课程的学生学号(Sno)。

其命令为:select snofrom reportsgroup by snohaving COUNT(cno) >=3运行结果如右图二、连接查询1、不同表之间的连接查询1.1查询每个学生及其选修课程的情况。

本查询实际上是涉及Students与Reports两个表的连接操作。

这两个表之间的联系是通过公共属性Sno实现的,因此,其操作命令为:select students.*,reports.*from students,reportswhere students.sno=reports.sno运行结果如右图1.2查询每个学生的学号(Sno)、姓名(Sname)、选修的课程名(Cname)及成绩(Grade)。

本查询涉及到三个表的连接操作,完成该查询的SQL语句如下:select students.sno,sname,cname,grade,dnamefrom students,reports,courses,deptswhere students.sno = reports.sno ando = oand students.dno = depts.dno运行结果如右图2、自身连接2.1查询每一门课的间接先修课(即先修课的先修课)。

在Courses表关系中,只有每门课的直接先修课信息,而没有先修课的先修课。

要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程。

这就需要要将Courses表与其自身连接。

为方便连接运算,这里为Courses表取两个别名分别为A,B。

则完成该查询的SQL语句为:select o,ame,B.Pre_Cnofrom courses A,courses BWHERE A.Pre_Cno = o运行结果如右图3、外连接把连接查询中1.2中的等值连接改为左连接。

该左连接操作在SQL Server 2000中的命令格式为:selectstudents.sno,sname,ssex,sage,dno,cno,gradefrom students,reportswhere students.sno =reports.sno运行结果如右图三、嵌套查询1、带谓词IN的嵌套查询1.1查询选修了编号为“C02”的课程的学生姓名(Sname)和所在系别编号(dno)。

相关主题