《数据库系统实验》
实验报告
题目 |
实验4——SQL语言:SELECT查询操作 |
一、实验环境:
1、操作系统:Windows 11 22H2;
2、DBMS :mysql 8.0 CE;
二、实验内容与完成情况:
4.0 数据库创建、表单创建与数据插入
按照实验3创建数据库的模板创建jxgl数据库:
create database jxgl;
use jxgl;
创建相应的表:
创建student表,student(sno,sname,ssex,sage,sdept):以sno为主键primary key:
create table student
( sno CHAR(7) primary key,
sname varchar(20),
sage INT,
ssex varchar(2),
sdept varchar(2)
);
创建course表,course(cno,cname,cpno,ccredit): 以cno为主键primary key,cpno默认为NULL:
create table course
( cno CHAR(2) primary key,
cname varchar(20),
cpno char(2) default NULL,
ccredit INT
);
创建sc表,sc(sno,cno,grade):以(sno,cno)为主键,sno为外码参照student表中的sno,cno为外码参照course表中的cno:
create table sc
( sno CHAR(7),
cno CHAR(2),
grade INT,
primary key(sno,cno),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno)
) ;
插入数据:
插入student的数据:
insert into student
values('2005001','钱横',18,'男','Cs'),
('2005002','王林',19,'女','Cs'),
('2005003','李民',20,'男','Is'),
('2005004','赵欣然',16,'女','Ma');
插入course的数据:
insert into course
values('1','数据库系统','5',4),
('2','数学分析',null,2),
('3','信息系统导论','1',3),
('4','操作系统原理','6',3),
('5','数据结构','7',4),
('6','数据处理基础',null,4),
('7','C语言','6',3);
插入表sc的数据:
insert into sc
values('2005001','1',87),
('2005001','2',67),
('2005001','3',90),
('2005002','2',95),
('2005003','3',88);
根据Action Output的结果可知,各表的数据已经成功插入。
4.1 基于jxgl数据库,使用SQL语句表达以下查询
4.1.1 检索年龄大于23岁的男学生的学号和姓名
为了有查询结果,这里对表student的内容进行调整:
select sno,sname
from student
where ssex='男' and sage>23;
查询结果:
4.1.2 检索至少选修一门课的女学生姓名
SQL语言:
select sname
from student natural join sc
where ssex='女';
查询结果:
4.1.3 检索王林不学的课程的课程号
SQL语言:
select cno
from course
where cno not in
(select cno
from student natural join sc
where sname='王林');
4.1.4 检索至少选修两门课的学生学号
SQL语言:
select distinct sno
from sc
group by sno
having count(sno)>1;
查询结果:
4.1.5 检索全部学生都选修的课程的课程号和课程名
为了有查询结果,这里对表sc的内容进行调整:
SQL语言:
select cno,cname
from sc natural join course
group by cno
having count(cno)=(select count(*)from student);
查询结果:
4.1.6 检索选修了所有3学分课程的学生平均成绩
为了有查询结果,这里对表sc的内容进行调整:
SQL语言:
select avg(grade)
from sc
where sno in(select sno
from student
where not exists(select * from course where ccredit=3 and not exists(
select * from sc where sc.cno=course.cno and sc.sno=student.sno)))
group by sno;
查询结果:
4.2 基于jxgl数据库,使用SQL语句表达以下查询
4.2.1 统计有学生选修的课程门数
SQL语言:
select count(distinct cno)
from sc;
查询结果:
4.2.2 求选修4号课程的学生的平均年龄
为了有更好的查询结果,这里对表sc的内容进行调整:
SQL语言:
select avg(sage)
from student
where sno in (select sno from sc where cno='4');
查询结果:
4.2.3 求学分为3的每门课程的学生平均成绩
SQL语言:
查询结果:
4.2.4 统计每门课程的学生选修人数,要求超过三人的课程才统计,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
为了有更好的查询结果,这里对表sc的内容进行调整:
SQL语言:
select cno,count(cno)
from sc
group by cno
having count(cno)>3
order by count(cno) desc ,cno asc;
查询结果:
4.2.5 检索学号比“王林”同学大而年龄比她小的学生姓名
SQL语言:
select sname
from student
where sno>(select s.sno from student as s where s.sname='王林')
and sage<(select s.sage from student as s where s.sname='王林');
查询结果:
SQL语言:
select sname,sage
from student
where sname like '王%';
查询结果:
为了有查询结果,这里对表sc的内容进行调整:
SQL语言:
select sno,cno
from sc
where grade is null;
查询结果:
SQL语言:
select sname,sage
from student
where ssex='男' and sage>(select avg(sage) from student where ssex='女');
查询结果:
SQL语言:
select sname,sage
from student
where ssex='男' and sage>(select max(sage) from student where ssex='女');
查询结果:
4.2.10 检索选修4门以上课程的学生总成绩(不统计不及格课程),并要求按总成绩的降序排列出来
为了更好的有查询结果,这里对表sc的内容进行调整:
select sum(grade)
from sc
group by sno
having count(cno)>4
ORDER BY sum(grade) DESC;
查询结果: