文理学院数据库技术应用实验报告9

文理学院数据库技术应用实验报告9

实验名称数据库子查询实验日期2024年11月15日
课程名称数据库技术应用实验项目数据库子查询的使用

一、实验目的

要求,通过sql脚本导入数据库,并在stuinfo数据库中对数据进行查询。使用select子查询进行查询操作。

stuinfo数据库脚本如下:

create database stuinfo;
USE stuinfo;
CREATE TABLE student (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
sNo CHAR(10) NOT NULL,
sName VARCHAR(20) NOT NULL,
sex CHAR(2),
birthday DATE,
deptName VARCHAR(30),
remark VARCHAR(80)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE course (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
cNo CHAR(5) NOT NULL,
cName VARCHAR(30) NOT NULL,
credit TINYINT UNSIGNED,
remark VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE score (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
sId INT UNSIGNED NOT NULL,
cId INT UNSIGNED NOT NULL,
grade TINYINT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO student (id, sNo, sName, sex, birthday, deptName, remark) VALUES
(1, '1308013101', '陈斌', '男', '1993-03-20', '软件131', NULL),
(2, '1308013102', '张洁', '女', '1996-02-08', '软件131', NULL),
(3, '1308013103', '郑先超', '男', '1994-04-25', '软件131', NULL),
(4, '1308013104', '徐孝兵', '男', '1994-08-06', '软件131', NULL),
(5, '1308013105', '王群', '女', '1995-03-27', '软件131', NULL),
(6, '1309122501', '刘威', '男', '1994-07-13', '网络131', NULL),
(7, '1309122502', '沈雁斌', '男', '1994-05-28', '网络131', NULL),
(8, '1309122503', '杨群', '女', '1995-10-18', '网络131', NULL),
(9, '1309122504', '蒋维维', '男', '1994-10-19', '网络131', NULL),
(10, '1309122505', '杨璐', '女', '1995-09-26', '网络131', NULL),
(11, '1312054901', '王林林', '男', '1994-04-16', '机电131', NULL),
(12, '1312054902', '杨一超', '男', '1994-08-27', '机电131', NULL),
(13, '1312054903', '张伟', '男', '1995-01-03', '机电131', NULL),
(14, '1312054904', '田翠萍', '女', '1994-10-20', '机电131', NULL),
(15, '1312054905', '周伟', '男', '1995-09-10', '机电131', NULL);

INSERT INTO course (id, cNo, cName, credit, remark) VALUES
(1, '01001', 'C语言程序设计', 5, '计算机类专业课程'),
(2, '01002', '数据结构', 4, '计算机类专业课程'),
(3, '01003', 'Java程序设计', 4, '计算机类专业课程'),
(4, '02001', '网络基础', 3, '计算机类专业课程'),
(5, '02002', '数据库原理及应用', 4, '计算机类专业课程'),
(6, '02003', '操作系统', 4, '计算机类专业课程'),
(7, '09001', '机械设计基础', 5, NULL),
(8, '09002', '机械制造基础', 4, NULL),
(9, '09003', '机械制图', 4, NULL);


INSERT INTO score (id, sId, cId, grade) VALUES
(1, 1, 1, 72),
(2, 1, 2, 56),
(3, 1, 3, 77),
(4, 2, 1, 85),
(5, 2, 2, 73),
(6, 2, 3, 90),
(7, 3, 1, 79),
(8, 4, 1, 82),
(9, 5, 1, 63),
(10, 6, 4, 84),
(11, 6, 5, 92),
(12, 6, 6, 71),
(13, 11, 7, 87),
(14, 11, 8, 90),
(15, 11, 9, 95);

二、实验原理

Select子查询

三、实验设备、材料

mysqlNavicat软件

四、实验步骤

1、查询课程编号(cnocourse表),课程名称(cnamecourse表)及对应的成绩(gradescore表)

SELECT * FROM course;
SELECT * FROM score;
SELECT * FROM student;

SELECT 
    course.cNo, 
    course.cName, 
    score.grade
FROM 
    course
JOIN 
    score ON course.id = score.id;

2、查询学生姓名(snamestudent表)、课程名称(cnamecourse表)及对应的成绩(gradescore表);

SELECT * FROM course;
SELECT * FROM score;
SELECT * FROM student;

SELECT 
    student.sName, 
    course.cName, 
    score.grade
FROM 
    score
JOIN 
    student ON score.id = student.id
JOIN 
    course ON score.id = course.id;

3、查询选修了’计算机类专业课程(remark)’学生姓名(cName),学生编号,课程名称及对应成绩

SELECT * FROM course;
SELECT * FROM score;
SELECT * FROM student;

SELECT 
    st.sName,
    st.sNo,
    co.cName,
    sc.grade
FROM 
    score sc
JOIN 
    student st ON st.id = sc.sId
JOIN 
    course co ON co.id = sc.cId
WHERE 
    co.remark = '计算机类专业课程';

4、查询在1994年后出生的学生姓名,出生日期、及成绩;

SELECT * FROM course;
SELECT * FROM score;
SELECT * FROM student;

SELECT student.sName,student.birthday,score.grade
FROM student JOIN score ON student.id=score.sId
WHERE YEAR(student.birthday) >'1994';

5、查询网络131班学生学号,姓名,班级 ,课程id和成绩;

SELECT student.sNo,student.sName,student.deptName
FROM score JOIN student ON score.sId = student.id
WHERE student.deptName = '网络131';

子查询1:

1、查询成绩最低分及对应学生姓名和课程名称

SELECT student.sName,course.cName,score.grade
FROM score JOIN student ON student.id=score.sId
JOIN course ON course.id=score.sId
WHERE score.grade=(SELECT min(grade)FROM score);

2、查询与学号sno=1308013101的同学,在同一个班级的学生名单。

SELECT * FROM student
WHERE deptname = (SELECT deptname FROM student WHERE sno = '1308013101');

3、查询选修了01001课程且成绩高于该课程平均分的信息:学生学号,姓名,班级,课程编号、名称和成绩。

SELECT * FROM course;
SELECT * FROM score;
SELECT * FROM student;

SELECT 
    student.sNo,
    student.sName,
    student.deptName,
    course.cNo,
    course.cName,
    score.grade
FROM 
    score
JOIN 
    student ON student.id=score.sId 
JOIN 
    course ON course.id=score.cId
WHERE 
    course.cNo = '01001' 
    AND score.grade > (SELECT AVG(grade) FROM score WHERE cNo = '01001');

子查询2:

1、查询选修了课程编号con=01001的学生名单。

SELECT * FROM student WHERE id in(
SELECT sid FROM score JOIN course
on cid=course.id WHERE cno='01001')

2、查询学号=1308013101 的学生选修的课程信息

SELECT 
    course.*
FROM 
    course
JOIN 
    score ON course.id = score.cId
JOIN 
    student ON score.sId = student.id
WHERE 
    student.sNo = '1308013101';

3、查询没有选修课的女同学名单。

SELECT * FROM student WHERE sex='女' AND
id not in (SELECT sid FROM score);

4、查询有选修课的女同学名单

SELECT * FROM student WHERE sex='女' AND
EXISTS ( SELECT * FROM score WHERE student.id=sid);

5、查询比1308013101同学任何科目分低的全部学生、课程、成绩信息。

SELECT DISTINCT 
    s2.sName AS studentName,
    c2.cName AS courseName,
    sc2.grade AS Grade
FROM 
    student s2
JOIN 
    score sc2 ON s2.id = sc2.sId
JOIN 
    course c2 ON sc2.cId = c2.id
WHERE 
    EXISTS (
        SELECT 1 
        FROM score sc1 
        JOIN student s1 ON sc1.sId = s1.id
        WHERE s1.sNo = '1308013101'
          AND sc1.cId = sc2.cId
          AND sc1.grade > sc2.grade
    );

6、查询比1308013101所有成绩低的全部学生、课程、成绩信息。

SELECT 
    s.sName AS StudentName, 
    c.cName AS CourseName, 
    sc.grade AS Grade
FROM 
    student s
JOIN 
    score sc ON s.id = sc.sId 
JOIN 
    course c ON sc.cId = c.id
WHERE 
    s.sNo <> '1308013101'
    AND NOT EXISTS (
        SELECT 1
        FROM score sc_A
        WHERE sc_A.sId = (SELECT id FROM student WHERE sNo = '1308013101')
          AND sc_A.cId = sc.cId
          AND sc_A.grade <= sc.grade
    );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@杨星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值