1 实验目的
掌握SQL语言的数据查询语句,具体包括:
SELECT语句的基本用法
使用WHERE子句进行有条件的查询
使用IN,NOT IN,BETWEEN等谓词查询
利用LIKE子句实现模糊查询
利用ORDER子句为结果排序
用SQL Server的统计函数进行统计计算
用GR0UP BY子句实现分组查询的方法
连接查询的方法
2 实验任务
将学生成绩数据库(XSCJ)导入SQL SERVER 2012,并做如下查询:
查询选修了课程的学生的学号;
查询全体学生的姓名和出生年份,并将列别名改为XM和CSNF;
查询年龄在18到20(包括18岁和20岁)之间学生的学号、姓名和系。
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
用LIKE查询课程名为DB_S程的课程号和学分。
查所有有成绩的学生学号和课程号。
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄升序排列
查询选修了课程的学生人数。
计算1号课程的学生平均成绩。
查询有3人以上(含3人)同学选修课程的课程号。
查询1号课程的间接先修课。
查询每个学生的学号、姓名、选修的课程名及成绩。
找出每个学生等于他选修课程平均成绩的课程号。
拓展练习:将以下数据录入上次实验建立的BSXT数据库,并完成以下查询:
- 查询全体学生的学号和姓名和电话。
- 查询全体学生的基本情况。
- 查询带了毕业生的老师的教师号。
- 查询教师“朱龙”基本情况。
- 查询所有姓“王”同学的基本情况。
- 统计每种学历老师的人数。
- 查询1组老师所带毕业生的基本情况(包括学号,姓名,教师号,教师姓名,毕业设计题目)(注:1组老师只能带1组的学生)
- 查询所有学生的选题情况(包括没有选题的学生),包括学号,姓名,题目名称,教师名称。(注:要求老师的组号和学生的组号相一致.)
3 相关知识
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]……
FROM<表名或视图名>……|(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>][GROUP BY<列名1>][HAVING<条件表达式>]
[ORDER BY<列名2>[ASC|DESC]];
整个SELECT语句的含义是根据WHERE子句的条件表达式以FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组,通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。如果有ORDER BY子句,则结果还要按<列名2>的值升序或降序排序。SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
单表查询是指仅涉及一个表的查询,若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询等。
4 实验内容与实验结果
SELECT DISTINCT Sno
FROM SC;
SELECT Sname XM , 2015-Sage CSNF
FROM Student;
SELECT Sno, Sname,Sdept
FROM Student
WHERE Sage BETWEEN 18 AND 20;
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE '数据%' ESCAPE '\';
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
SELECT COUNT(DISTINCT Sno)
FROM SC;
SELECT AVG(CAST(Grade as int))
FROM SC
WHERE Cno= 1;
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >=3;
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno and FIRST.Cpno='1';
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(CAST(Grade as int))
FROM SC y
WHERE y.Sno=x.Sno);
SELECT Sno,Sname,Stel
FROM Student;
SELECT *
FROM Student;
SELECT DISTINCT Tno
FROM Topic;
SELECT *
FROM Teacher
WHERE Tname = '朱龙';
SELECT *
FROM Student
WHERE Sname LIKE '王%';
SELECT Tdegree,COUNT(*) as number
FROM Teacher
GROUP BY Tdegree;
SELECT Student.Sno,Sname,Teacher.Tname,Hname
FROM Student LEFT OUTER JOIN Topic ON(Student.Sno = Topic.Sno),Teacher
WHERE Teacher.Troup = '1' AND Student.Sgroup = Teacher.Troup AND Teacher.Tno = Topic.Tno;
SELECT Student.Sno,Sname,Hname,Tname
FROM Student LEFT OUTER JOIN (SELECT Hname,Tname,Sno,Troup
FROM Topic,Teacher
WHERE Topic.Tno = Teacher.Tno) TEMP ON(Student.Sno = TEMP.Sno)