数据库原理实验报告(4)
南 京 晓 庄 学 院
《数据库原理与应用》
课程实验报告
实验四 查询设计实验
所在院(系): 信息工程学院
班级: 13软件工程转本1班 学号: 13131151 姓名: 薛伟
1. 实验目的
(1) 了解查询的目的,掌握SELECT 语句的基本语法和查询条件的表示方法。 (2) 掌握数据排序和数据联接查询的方法。 (3) 掌握SQL Server查询分析器的使用方法。
2. 实验要求
(1) 针对 “TM ”数据库,在SQL Server 查询分析器中,用T-SQL 语句实现以下单表查询
操作,并将将调试成功的T-SQL 命令,填入实验报告中。
a) b) c) d) e) f) g) h) i) a) b) c) d) e) f)
查询所有课程的详细情况。
查询来自江苏或山东的学生学号和姓名,并以中文名称显示输出的列名。 查询选修了课程的学生学号(一人选了多门课程的话,学号只显示一次)。 查询选修课程号为07253001的学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。 查询所有学生的学号、姓名和年龄。
查询选修课程号为07253001的成绩在85-95之间的学生学号和成绩,并将成绩乘以0.7输出。
查询数学与信息技术学院(DEPT_ID为07)或物理与电子工程学院(DEPT_ID为09) 姓张的学生的信息。。
查询所有核心课程(课程名中带*的)的情况。
查询缺少了成绩的学生的学号和课程号,查询结果按课程号升序排列。 查询每个学生的情况以及他(她)所选修的课程。 查询学生的学号、姓名、选修的课程名及成绩。
查询选修C 语言程序设计且成绩为85分以上的学生学号、姓名及成绩。 查询和学生柏文楠是同一个民族的学生(用自身联接实现)。 分别用等值联接和内联接查询有授课记录的老师的姓名。
用外联接查询所有老师的授课情况,输出老师的工号、姓名、职称、院系、担任的课程号和授课的学期,结果按院系和职称升序排列。如果该老师没有授课历史,在课程号和授课的学期中显示空值
(2) 在SQL Server查询分析器中,用T-SQL 语句实现下列数据联接查询操作:
(3) 在SQL Server Management Studio中新建查询,完成以上查询命令的同时,熟悉SQL 编
辑器工具栏中各快捷按钮的作用。 (4) 按要求完成实验报告。
3. 实验步骤、结果和总结实验步骤/结果
将调试成功的T-SQL 语句写在下方(标明题号)。
一、针对 “TM ”数据库,在SQL Server查询分析器中,用T-SQL 语句实现以下单表查询操作,并将将调试成功的T-SQL 命令,填入实验报告中。
(a)查询所有课程的详细情况: select * from Course
(b)查询来自江苏或山东的学生学号和姓名,并以中文名称显示输出的列名。
SELECT S_ID as 学号, S_Name as 姓名 FROM Student
WHERE Birth_Place=' 江苏' or Birth_Place=' 山东'
(c)查询选修了课程的学生学号(一人选了多门课程的话,学号只显示一次)。
(d)查询选修课程号为07253001的学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。
select S_ID, EXAM_Grade from sc where C_ID='07253001'
order by EXAM_Grade desc , S_ID asc
(e)查询所有学生的学号、姓名和年龄。
SELECT S_ID, S_NAME, year (getdate ())-year (Date_of_Birth) as 年龄 FROM Student
(f)查询选修课程号为07253001的成绩在85-95之间的学生学号和成绩,并将成绩乘以0.7输出。
Select S_ID, EXAM_Grade*0.7 as grade from SC
where C_ID='07253001' and EXAM_Grade between 85 and 95
(g)查询数学与信息技术学院(DEPT_ID为07)或物理与电子工程学院(DEPT_ID为09) 姓张的学生的信息。
select *from Student where DEPT_ID in ('07' , '09' ) and S_Name like ' 张%'
(h)查询所有核心课程(课程名中带*的)的情况。
SELECT * FROM Course WHERE C_Name like '%*%'
(i)查询缺少了成绩的学生的学号和课程号,查询结果按课程号升序排列。 select S_ID, C_ID from SC where EXAM_Grade IS NULL
order by C_ID
二、二、在SQL Server查询分析器中,用T-SQL 语句实现下列数据联接查询操作:
(a)查询每个学生的情况以及他(她)所选修的课程。 Select Student . S_ID, S_Name, Gender , Birth_Place, DEPT_ID, Class_ID, Course. C_name from Student join SC on Student. S_ID=SC . S_ID join Course on Course. C_ID=SC . C_ID
(b)查询学生的学号、姓名、选修的课程名及成绩。
select Student.S_ID, S_Name, C_Name, EXAM_Grade
from Student inner join SC on Student. S_ID=SC . S_ID inner join Course on SC . C_ID=Course . C_ID
(c)查询选修C 语言程序设计且成绩为85分以上的学生学号、姓名及成绩。
Select Student . S_ID, S_NAME, EXAM_Grade from Student , SC , Course
where Student. S_ID=SC . S_ID and Course. C_ID=SC . C_ID and C_Name='C 语言程序设 计' and EXAM_Grade>=85
(d)查询和学生柏文楠是同一个民族的学生(用自身联接实现)。
SELECT S_Name from Student
where Nationality=(select Nationality from Student where S_Name=' 柏文楠' )
(e)分别用等值联接和内联接查询有授课记录的老师的姓名。 1. 等值联接
select DISTINCT T_Name from
Teacher inner join TC on Teacher. T_ID=TC . T_ID
2. 内联接
select DISTINCT T_Name from Teacher, TC where Teacher. T_ID=TC . T_ID
(f)用外联接查询所有老师的授课情况,输出老师的工号、姓名、职称、院系、担任的课程号和授课的学期,结果按院系和职称升序排列。如果该老师没有授课历史,在课程号和授课的学期中显示空值。
select Teacher . T_ID, Teacher . T_Name, Teacher . Academic_Title, Department . DEPT_Name, TC . C_ID, TC . Semester
from Teacher Right join TC on Teacher . T_ID=TC . T_ID join Department ON Department . DEPT_ID=Teacher . DEPT_ID
order by Department. DEPT_Name , Teacher. Academic_Title
4.实验思考:
①联接查询中,输出列名时何时可以忽略列名前的表名,何时不能? 表名. 列名
若选择的字段名在各个表中是唯一的,则可以省略字段名前的表名。 ②联接查询中,INNER JOIN、 LEFT OUTER JOIN 、RIGHT OUTER JOIN、 FULL OUTER JOIN 的结果各有什么不同?
INNER JOIN :
Inner join 产生的结果集中,是A 和B 的交集
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
LEFT OUTER JOIN:
(1) Left outer join 产生表A 的完全集,而B 表中匹配的则有值,没有匹配的则以null 值取代。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
(2) 产生在A 表中有而在B 表中没有的集合。
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null
RIGHT [OUTER] JOIN
RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。
FULL [OUTER] JOIN
(1) Full outer join 产生A 和B 的并集。但是需要注意的是,对于没有匹配的记录,则会以null 做为值。可以使用IFNULL 判断。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
(2) 产生A 表和B 表没有交集的数据集。
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
③LIKE 匹配字符有几种?如果要检索的字符中包含匹配字符,该如何处理?
LIKE 通配符及实例