数据库实验三-SQL语言-SELECT查询操作

一、实验目的
表或视图数据的各种查询(与统计)SQL命令操作,具体分为:
①了解查询的概念和方法;
②掌握SQL Server集成管理器查询子窗口中执行SELECT操作的方法;
③掌握SELECT语句在单表查询中的应用;
④掌握SELECT语句在多表查询中的应用;
⑤掌握SELECT语句在复杂查询中的使用方法。
二、实验内容
(1)基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询:
①检索年龄大于23岁的男学生的学号和姓名;
②检索至少选修一门课程的女学生姓名;
③检索王同学不学的课程的课程号;
④检索至少选修两门课程的学生学号;
⑤检索全部学生都选修的课程的课程号与课程名;
⑥检索选修了所有3学分课程的学生学号。
(2)基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询:
①统计所有学生选修的课程门数;
②求选修4号课程的学生的平均年龄;
③求学分为3的每门课程的学生平均成绩;
④统计每门课程的学生选修人数,超过3人的课程才统计,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列;
⑤检索学号比王非同学大,而年龄比他小的学生姓名;
⑥检索姓名以王打头的所有学生的姓名和年龄;
⑦在SC中检索成绩为空值的学生学号和课程号;
⑧求年龄大于女同学平均年龄的男学生的姓名和年龄;
⑨求年龄大于所有女同学年龄的男学生的姓名和年龄;
⑩检索所有比“王华”年龄大的学生姓名、年龄和性别;
⑪检索选修2号课程的学生中成绩最高的学生的学号;
⑫检索学生姓名及其所选修课程的课程号和成绩;
⑬检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。

(3)设有如下4个基本表(表结构与表内容是假设的),如表4-1、表4-2、表4-3、表4-4所示,请先创建数据库及根据表内容创建表结构,并添加表记录,实践以下各题的SQL命令操作:
①查询选修课程“8105”且成绩在80到90之间的所有记录;
②查询成绩为79,89或99的记录;
③查询9803班的学生人数;
④查询至少有20名学生选修的并以8开头的课程的平均成绩:
⑤查询最低分大于80,最高分小于95的SNO与平均分:
⑥查询9803班学生所选各课程的课程号及其平均成绩:
⑦查询选修“8105”课程的成绩高于“9809”号同学成绩的所有同学的记录:
⑧查询与学号为“9808”的同学同岁的所有学生的SNO、SNAME和AGE:
⑨查询“钱军”教师任课的课程号,选修其课程学生的学号和成绩;
⑩查询选修某课程的学生人数多于20人的教师姓名;
⑪查询同学选修编号为“8105”课程且成绩至少高于其选修编号为“8245"课程的同学的SNO及“8105”课程成绩,并按成绩从高到低次序排列;
⑫查询选修编号为“8105”课程且成绩高于所有选修编号为“8245”课程成绩的同学的CNO、SNO、GRADE;
⑬列出所有教师和同学的姓名、SEX、AGE;
⑭查询成绩比该课程平均成绩高的学生的成绩表;
⑮列出所有任课教师的TNAME和DEPT;
⑯列出所有未讲课教师的TNAME和DEPT;
⑰列出至少有4名男生的班号;
⑱查询不姓“张"的学生的记录;
⑲查询每门课最高分的学生的SNO、CNO、GRADE;
⑳查询与“李华”同性别并同班的同学的SNAME;
㉑查询“女”教师及其所上的课程;
㉒查询选修“数据库系统”课程的“男”同学的成绩表;
㉓查询所有比刘涛年龄大的教师姓名、年龄和刘涛的年龄;
㉔查询不讲授“8104”号课程的教师姓名。
三、实验结果
--1.1检索年龄大于23岁的男学生的学号和姓名;

select SNO,SNAME
from STUDENT
where SAGE>23 AND SSEX = '男';
--1.2检索至少选修一门课程的女学生姓名;

select SNAME
from STUDENT,SC
where STUDENT.SNO=SC.SNO
AND SSEX='女'
group by SNAME
having count(Cno)>=1;

--1.3检索王同学不学的课程的课程号;

SELECT Cno
FROM Course
WHERE Cno != ALL
(SELECT Course.Cno
FROM Student, SC,Course
WHERE (Sname LIKE '王%' AND Student.Sno = SC.Sno AND SC.Cno = Course.Cno));

--1.4检索至少选修两门课程的学生学号;

select SNO
from SC
group by SNO
having count(Cno)>=2;

--1.5检索全部学生都选修的课程的课程号与课程名;

SELECT SC.CNO, CNAME
FROM COURSE left join SC
on COURSE.CNO=SC.CNO
GROUP BY SC.CNO, CNAME
HAVING COUNT()=(
SELECT COUNT(
)
FROM STUDENT);

--1.6检索选修了所有3学分课程的学生学号。

SELECT SNO
FROM SC
WHERE CNO IN (
SELECT CNO
FROM COURSE
WHERE CCREDIT=3)
GROUP BY SNO
HAVING COUNT()=(
SELECT COUNT(
)
FROM COURSE
WHERE CCREDIT=3);

--2.1统计所有学生选修的课程门数;

SELECT COUNT(DISTINCT CNO)'所有学生选修课的课程门数'
FROM SC;

--2.2求选修4号课程的学生的平均年龄;

SELECT AVG(SAGE)'选修4号课程的学生的平均年龄'
FROM SC,STUDENT
WHERE STUDENT.SNO=SC.SNO
AND CNO=4;

--2.3求学分为3的每门课程的学生平均成绩;

SELECT AVG(GRADE) '学分为3的每门课程的学生的平均成绩'
FROM SC, COURSE
WHERE SC.Cno = Course.Cno AND Course.Ccredit = 3;

--2.4统计每门课程的学生选修人数,超过3人的课程才统计,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列;

SELECT CNO, COUNT(SNO) Num
FROM SC
GROUP BY CNO
HAVING COUNT(SNO) > 3
ORDER BY COUNT(SNO) DESC, CNO ASC;

--2.5检索学号比王非同学大,而年龄比他小的学生姓名;

SELECT SNAME
FROM STUDENT
WHERE Sno > (SELECT Sno FROM Student WHERE Sname = '王非')
AND Sage < (SELECT Sage FROM Student WHERE Sname = '王非');

--2.6检索姓名以王打头的所有学生的姓名和年龄;

SELECT SNAME,SAGE
FROM STUDENT
WHERE SNAME LIKE '王%';

--2.7在SC中检索成绩为空值的学生学号和课程号;

SELECT SNO,CNO
FROM SC
WHERE GRADE IS NULL;

--2.8求年龄大于女同学平均年龄的男学生的姓名和年龄;

SELECT SNAME, SAGE
FROM Student
WHERE Ssex = '男' AND Sage > (
SELECT AVG(Sage)
FROM Student
WHERE Ssex = '女');

--2.9求年龄大于所有女同学年龄的男学生的姓名和年龄;

SELECT SNAME, SAGE
FROM Student
WHERE Ssex = '男' AND Sage > ALL(
SELECT Sage
FROM Student
WHERE Ssex = '女');

--2.10检索所有比“王华”年龄大的学生姓名、年龄和性别;
SELECT SNAME, SAGE, SSEX
FROM STUDENT
WHERE Sage >
(SELECT Sage
FROM Student
WHERE Sname = '王华');

--2.11检索选修2号课程的学生中成绩最高的学生的学号;

SELECT SNO
FROM SC
WHERE CNO=2
AND GRADE=(
SELECT MAX(GRADE)
FROM SC
WHERE CNO=2);

--2.12检索学生姓名及其所选修课程的课程号和成绩;

SELECT SNAME,CNO,GRADE
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO;

--2.13检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。

SELECT SUM(GRADE) '总成绩'
FROM SC
WHERE GRADE>=60
GROUP BY SNO
HAVING COUNT(CNO)>=4
ORDER BY '总成绩' DESC;

--3.1查询选修课程“8105”且成绩在80到90之间的所有记录;

SELECT *
FROM SC
WHERE CNO='8105'
AND GRADE between 80 and 90;

--3.2查询成绩为79,89或99的记录;

SELECT *
FROM SC
WHERE GRADE IN(79,89,99);

--3.3查询9803班的学生人数;

SELECT COUNT(*) '人数'
FROM STUDENT
WHERE CLASS='9803'

--3.4查询至少有20名学生选修的并以8开头的课程的平均成绩:

SELECT CNO,AVG(GRADE)AS 平均成绩
FROM SC
WHERE CNO LIKE '8%'
GROUP BY CNO
HAVING COUNT( DISTINCT SNO)>=20;

--3.5查询最低分大于80,最高分小于95的SNO与平均分;
select SNO,avg(GRADE) 平均成绩
from SC
group by SNO
having min(SC.GRADE) > 80 and max(SC.GRADE) <= 95

--3.6查询9803班学生所选各课程的课程号及其平均成绩:

select sc.sno, SC.CNO,avg(GRADE) as 平均成绩
from SC,STUDENT
where Student.CLASS = '9803'AND SC.SNO=STUDENT.SNO
group by SC.CNO,sc.sno

--3.7查询选修“8105”课程的成绩高于“9809”号同学成绩的所有同学的记录;

select STUDENT.*
from student,sc
where sc.sno=student.sno
and sc.cno='8105'
and grade >(
select grade
from sc
where sno='9809');

--3.8查询与学号为“9808”的同学同岁的所有学生的SNO、SNAME和AGE;

select SNO,SNAME,AGE
FROM STUDENT
WHERE AGE IN(
SELECT AGE
FROM STUDENT
WHERE STUDENT.SNO='9809');

--3.9查询“钱军”教师任课的课程号,选修其课程学生的学号和成绩;
select SC.*
from Course,TEACHER,SC
WHERE Teacher.TNO = Course.TNO
AND SC.CNO = Course.CNO
AND Teacher.TNAME = '钱军'

--3.10查询选修某课程的学生人数多于20人的教师姓名;

select distinct Teacher.TNAME
from Teacher,COURSE,SC
WHERE Course.TNO = Teacher.TNO
AND Course.CNO = SC.CNO
AND SC.CNO in(
select SC.CNO
from SC
group by SC.CNO
having count(*) > 20);

--3.11查询同学选修编号为“8105”课程且成绩至少高于其选修编号为“8245"课程的同学的SNO及“8105”课程成绩,并按成绩从高到低次序排列;

select SC.SNO,SC.GRADE
from SC
where SC.CNO = '8105'
and SC.GRADE > (
select GRADE
from SC as S2
where S2.SNO = SC.SNO
and S2.CNO = '8245')
order by SC.GRADE desc;

--3.12查询选修编号为“8105”课程且成绩高于所有选修编号为“8245”课程成绩的同学的CNO、SNO、GRADE;

select CNO,SC.SNO,GRADE
from SC
inner join Student
on Student.SNO = SC.SNO
where SC.CNO = '8105'
and SC.GRADE > (
select max(SC.GRADE)
from SC
where SC.CNO = '8245');

--3.13列出所有教师和同学的姓名、SEX、AGE;

select Student.SNAME as 姓名,Student.SEX as 性别,Student.AGE as 年龄
from Student
union
select Teacher.TNAME as 姓名,Teacher.SEX as 性别,Teacher.AGE as 年龄
from Teacher;

--3.14查询成绩比该课程平均成绩高的学生的成绩表;

select *
from sc a
where a.grade not between 0 and (
select avg(grade)
from sc b
where a.cno=b.cno);

--3.15列出所有任课教师的TNAME和DEPT;

select distinct Teacher.TNAME,Teacher.DEPT
from Teacher,Course
where Course.TNO = Teacher.TNO
and Course.TNO in (
select distinct Course.TNO
from Course);

--3.16列出所有未讲课教师的TNAME和DEPT;

select TNAME,DEPT
from Teacher
where Teacher.TNO not in (
select Course.TNO
from Course);

--3.17列出至少有4名男生的班号;

select Student.CLASS
from Student
where SEX = '男'
group by Student.CLASS
having count(*) >= 4;

--3.18查询不姓“张"的学生的记录;

select *
from Student
where SNAME not like '张%'

--3.19查询每门课最高分的学生的SNO、CNO、GRADE;

select SNO,s1.CNO,GRADE
from SC as s1
where s1.GRADE IN (
select max(s2.GRADE)
from SC as s2
where s1.CNO = s2.CNO);

--3.20查询与“李华”同性别并同班的同学的SNAME;

select SNAME
from Student
where Student.SEX = (
select Student.SEX
from Student
where Student.SNAME = '李华')
and Student.CLASS = (
select Student.CLASS
from Student
where Student.SNAME = '李华');

--3.21查询“女”教师及其所上的课程;

select Teacher.TNAME,Course.CNO,Course.CNAME
from Teacher
inner join Course
on Course.TNO = Teacher.TNO
where Teacher.SEX = '女';

--3.22查询选修“数据库系统”课程的“男”同学的成绩表;

select distinct SC.SNO,Student.SNAME,Student.SEX,Course.CNAME,SC.GRADE
from SC
inner join Student on Student.SNO = SC.SNO
inner join Course on Course.CNO = SC.CNO
where Student.SEX = '男'
and Course.CNAME = '数据库系统';

--3.23查询所有比刘涛年龄大的教师姓名、年龄和刘涛的年龄;

select Teacher.TNAME,AGE as 年龄
from Teacher
where AGE > (
select AGE
from Teacher
where Teacher.TNAME = '刘涛')
or Teacher.TNAME = '刘涛';

--3.24查询不讲授“8104”号课程的教师姓名。

select TNAME
from Teacher
where TNAME not in(
select TNAME
from Teacher
join Course
on Course.TNO = Teacher.TNO
where Course.CNO = '8104');

四、实验小结
今天,我们进行了数据库的SQL语言-SELECT查询操作实验,主要学习了如何使用SELECT语句从数据库中查询数据。在实验过程中,我们实践了简单的SELECT查询、带有WHERE子句的查询以及使用AND和OR运算符的组合查询。

实验中,我们首先创建了一个简单的数据库表,并向其中插入了一些数据。接着,使用SELECT语句来查询表中的数据。刚开始,我们执行了一些简单的查询操作,例如查询所有列或特定列的数据。之后,我们学习了如何使用WHERE子句来筛选数据,包括使用比较运算符(如=、>、<等)和逻辑运算符(如AND和OR)。

通过本次实验,我们掌握了SQL语言的基本查询功能,了解了如何通过SELECT语句从数据库中检索数据。同时,我们也认识到了实践操作的重要性,只有在实践中不断练习和总结,才能更好地掌握这些技能。

posted @ 2024-06-18 14:56  冰露奇缘  阅读(192)  评论(0)    收藏  举报