MySQL——Student、Course、Teacher、SC SQL查询练习题

题目

练习数据
数据表

  1. 学生表 Student(SId,Sname,Sage,Ssex)
    SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

  2. 课程表 Course(CId,Cname,TId)
    CId 课程编号,Cname 课程名称,TId 教师编号

  3. 教师表 Teacher(TId,Tname)
    TId 教师编号,Tname 教师姓名

  4. 成绩表 SC(SId,CId,score)
    SId 学生编号,CId 课程编号,score 分数

创建测试数据

学生表 Student
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));

insert into Student values(‘01’ , ‘赵雷’ , ‘1990-01-01’ , ‘男’);
insert into Student values(‘02’ , ‘钱电’ , ‘1990-12-21’ , ‘男’);
insert into Student values(‘03’ , ‘孙风’ , ‘1990-05-20’ , ‘男’);
insert into Student values(‘04’ , ‘李云’ , ‘1990-08-06’ , ‘男’);
insert into Student values(‘05’ , ‘周梅’ , ‘1991-12-01’ , ‘女’);
insert into Student values(‘06’ , ‘吴兰’ , ‘1992-03-01’ , ‘女’);
insert into Student values(‘07’ , ‘郑竹’ , ‘1989-07-01’ , ‘女’);
insert into Student values(‘09’ , ‘张三’ , ‘2017-12-20’ , ‘女’);
insert into Student values(‘10’ , ‘李四’ , ‘2017-12-25’ , ‘女’);
insert into Student values(‘11’ , ‘李四’ , ‘2017-12-30’ , ‘女’);
insert into Student values(‘12’ , ‘赵六’ , ‘2017-01-01’ , ‘女’);
insert into Student values(‘13’ , ‘孙七’ , ‘2018-01-01’ , ‘女’);

科目表 Course
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10))

insert into Course values(‘01’ , ‘语文’ , ‘02’);
insert into Course values(‘02’ , ‘数学’ , ‘01’);
insert into Course values(‘03’ , ‘英语’ , ‘03’);

教师表 Teacher
create table Teacher(TId varchar(10),Tname varchar(10))

insert into Teacher values(‘01’ , ‘张三’);
insert into Teacher values(‘02’ , ‘李四’);
insert into Teacher values(‘03’ , ‘王五’);

成绩表 SC
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1))

insert into SC values(‘01’ , ‘01’ , 80);
insert into SC values(‘01’ , ‘02’ , 90);
insert into SC values(‘01’ , ‘03’ , 99);
insert into SC values(‘02’ , ‘01’ , 70);
insert into SC values(‘02’ , ‘02’ , 60);
insert into SC values(‘02’ , ‘03’ , 80);
insert into SC values(‘03’ , ‘01’ , 80);
insert into SC values(‘03’ , ‘02’ , 80);
insert into SC values(‘03’ , ‘03’ , 80);
insert into SC values(‘04’ , ‘01’ , 50);
insert into SC values(‘04’ , ‘02’ , 30);
insert into SC values(‘04’ , ‘03’ , 20);
insert into SC values(‘05’ , ‘01’ , 76);
insert into SC values(‘05’ , ‘02’ , 87);
insert into SC values(‘06’ , ‘01’ , 31);
insert into SC values(‘06’ , ‘03’ , 34);
insert into SC values(‘07’ , ‘02’ , 89);
insert into SC values(‘07’ , ‘03’ , 98);

练习题目

  1. 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

  2. 查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况

  3. 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

  4. 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

  5. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

  6. 查询"李"姓老师的数量

  7. 查询学过"张三"老师授课的同学的信息

  8. 查询没学过"张三"老师授课的同学的信息

  9. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

  10. 查询没学过"张三"老师讲授的任一门课程的学生姓名

  11. 查询和"01"号的同学学习的课程完全相同的其他同学的信息

答案

-- 创建库
CREATE DATABASE school;
-- 创建学生表
CREATE TABLE Student(
Sid VARCHAR(10) PRIMARY KEY, -- 学生编号
Sname VARCHAR(10),-- 学生姓名
Sage  DATETIME,-- 学生出生年月
Ssex  VARCHAR(10)-- 学生性别
)DEFAULT CHARSET = utf8;
INSERT INTO Student VALUES('01' , '赵雷' , '1990-01-01' , '男');
INSERT INTO Student VALUES('02' , '钱电' , '1990-12-21' , '男');
INSERT INTO Student VALUES('03' , '孙风' , '1990-05-20' , '男');
INSERT INTO Student VALUES('04' , '李云' , '1990-08-06' , '男');
INSERT INTO Student VALUES('05' , '周梅' , '1991-12-01' , '女');
INSERT INTO Student VALUES('06' , '吴兰' , '1992-03-01' , '女');
INSERT INTO Student VALUES('07' , '郑竹' , '1989-07-01' , '女');
INSERT INTO Student VALUES('09' , '张三' , '2017-12-20' , '女');
INSERT INTO Student VALUES('10' , '李四' , '2017-12-25' , '女');
INSERT INTO Student VALUES('11' , '李四' , '2017-12-30' , '女');
INSERT INTO Student VALUES('12' , '赵六' , '2017-01-01' , '女');
INSERT INTO Student VALUES('13' , '孙七' , '2018-01-01' , '女');

SELECT * FROM Student;

-- 创建教师表
CREATE TABLE Teacher(
Tid VARCHAR(10) PRIMARY KEY,-- 教师编号
Tname VARCHAR(10) -- 教师姓名
)DEFAULT CHARSET = utf8;
INSERT INTO Teacher VALUES('01' , '张三');
INSERT INTO Teacher VALUES('02' , '李四');
INSERT INTO Teacher VALUES('03' , '王五');

SELECT * FROM Teacher;

-- 创建课程表
CREATE TABLE Course(
Cid VARCHAR(10) PRIMARY KEY,-- 课程编号
Cname NVARCHAR(10),-- 课程名称
Tid  VARCHAR(10), -- 教师编号
FOREIGN KEY (Tid) REFERENCES Teacher(Tid)-- 外键约束
)DEFAULT CHARSET = utf8;
INSERT INTO Course VALUES('01' , '语文' , '02');
INSERT INTO Course VALUES('02' , '数学' , '01');
INSERT INTO Course VALUES('03' , '英语' , '03');
 SELECT * FROM Course;
 
-- 创建成绩表
CREATE TABLE SC(
Sid VARCHAR(10), -- 学生编号
Cid VARCHAR(10),-- 课程编号
score DECIMAL(18,1),-- 学生成绩
FOREIGN KEY (Sid) REFERENCES Student(Sid),-- 外键约束
FOREIGN KEY (Cid) REFERENCES Course(Cid) 
)DEFAULT CHARSET = utf8;
INSERT INTO SC VALUES('01' , '01' , 80);
INSERT INTO SC VALUES('01' , '02' , 90);
INSERT INTO SC VALUES('01' , '03' , 99);
INSERT INTO SC VALUES('02' , '01' , 70);
INSERT INTO SC VALUES('02' , '02' , 60);
INSERT INTO SC VALUES('02' , '03' , 80);
INSERT INTO SC VALUES('03' , '01' , 80);
INSERT INTO SC VALUES('03' , '02' , 80);
INSERT INTO SC VALUES('03' , '03' , 80);
INSERT INTO SC VALUES('04' , '01' , 50);
INSERT INTO SC VALUES('04' , '02' , 30);
INSERT INTO SC VALUES('04' , '03' , 20);
INSERT INTO SC VALUES('05' , '01' , 76);
INSERT INTO SC VALUES('05' , '02' , 87);
INSERT INTO SC VALUES('06' , '01' , 31);
INSERT INTO SC VALUES('06' , '03' , 34);
INSERT INTO SC VALUES('07' , '02' , 89);
INSERT INTO SC VALUES('07' , '03' , 98);

SELECT * FROM SC;

-- 1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数
-- 首先是使用inner join查出所有有01课程的学生信息以及成绩信息
-- 以上查出来的就是一个虚拟表 ,已经是全部的01课程的学生的成绩信息和个人信息了。
-- 再以这个虚拟表联合成绩表,查出其中有02课程的学生的成绩信息
-- 再进行比较
SELECT  S.*,b.score AS 01score,c.score AS 02score FROM Student S 
INNER JOIN SC b ON S.Sid=b.Sid  AND b.Cid='01'
LEFT JOIN SC c ON s.sid = c.Sid AND c.Cid='02'
WHERE b.score > c.score;

-- 2.查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况
-- 第一题
-- 第一种方法
SELECT S.* FROM SC b
INNER JOIN Student S ON S.Sid=b.Sid 
WHERE b.Cid='01' AND b.Sid IN(SELECT a.Sid FROM SC a WHERE a.Cid='02');
-- 第二种方法
SELECT S.*
FROM Student S,SC a,SC b
WHERE S.Sid=a.Sid AND S.Sid=b.Sid
      AND a.Cid='01'
      AND b.Cid='02';
-- 第二题
-- 第一种方法
SELECT S.* FROM SC a INNER JOIN Student S ON S.Sid = a.Sid
WHERE a.Cid = '02'
AND a.Sid NOT IN(SELECT b.Sid FROM SC b WHERE b.Cid = '01');
-- 第二种方法
SELECT S.* FROM Student S
WHERE S.Sid IN (SELECT Sid FROM SC WHERE Cid='02')
AND S.Sid NOT IN (SELECT Sid FROM SC WHERE Cid='01');
      
-- 3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT S.Sid,S.Sname,AVG(a.score) AS average
FROM SC a,Student S
WHERE a.Sid=S.sid
GROUP BY a.Sid
HAVING average>=60;

-- 4.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
SELECT S.Sid,S.Sname,AVG(a.score) AS average
FROM SC a,Student S
WHERE a.Sid = S.Sid
GROUP BY a.Sid
HAVING average<60;

-- 5.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT S.Sid,S.Sname,COUNT(a.Cid) AS 选课总数,SUM(a.score) AS 总成绩
FROM Student S LEFT JOIN SC a ON S.Sid = a.Sid GROUP BY S.Sid;

-- 6.查询"李"姓老师的数量 
SELECT COUNT(Tname) FROM Teacher WHERE Tname LIKE '李%';

-- 7.查询学过"张三"老师授课的同学的信息
SELECT S.* FROM Student S 
WHERE S.Sid IN(SELECT a.Sid FROM SC a 
	    WHERE a.Cid IN(SELECT c.Cid FROM course c 
	    WHERE C.Tid=(SELECT t.Tid FROM Teacher t WHERE t.Tname='张三'))
GROUP BY a.Sid);

-- 8.查询没学过"张三"老师授课的同学的信息
SELECT S.* FROM Student S 
WHERE S.Sid NOT IN(SELECT a.Sid FROM SC a 
	    WHERE a.Cid IN(SELECT c.Cid FROM course c 
	    WHERE C.Tid=(SELECT t.Tid FROM Teacher t WHERE t.Tname='张三'))
GROUP BY a.Sid);

-- 9.查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT S.* FROM SC a
INNER JOIN Student S ON S.Sid=a.Sid 
WHERE a.Cid='01' AND a.Sid IN(SELECT b.Sid FROM SC b WHERE b.Cid='02');

-- 10.查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT S.* FROM Student S 
WHERE S.Sid NOT IN(SELECT a.Sid FROM SC a 
	    WHERE a.Cid IN(SELECT c.Cid FROM course c 
	    WHERE C.Tid=(SELECT t.Tid FROM Teacher t WHERE t.Tname='张三'))
GROUP BY a.Sid);

-- 11.查询和"01"号的同学学习的课程完全相同的其他同学的信息
SELECT S.* FROM SC a 
INNER JOIN Student S ON S.Sid = a.Sid
WHERE a.Sid  IN 
	(SELECT Sid FROM SC WHERE Cid IN(SELECT Cid FROM SC WHERE Sid='01'))
GROUP BY a.Sid
HAVING a.Sid != '01' AND COUNT(*)=(SELECT COUNT(*) FROM SC WHERE Sid = '01');
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC表,表结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线表示主键,斜体表示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的男生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名; (10)查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数。 (11) 在STUDENTSC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充题: (1) 统计各系的男生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL表示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做题:对每门课增加“先修课程”的属性,用来表示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。要求: 1) 修改表结构的定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入表中。 提交作业形式: 1) 建立Student数据库SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。 2) 完成查询要求的SQL语句脚本。 3) 选做题:须提交修改数据库表定义的SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值