MySQL(二)创建大学数据库以及多表查询

374 阅读5分钟

大学数据库创建==>传送门链接: link. 先把上次遗留下来的问题给解决

//10、创建新表stu_new,该新表中包含学号、课程号和总评成绩。其中总评成绩=daily*0.2+final*0.8,查看该新表的结构
CREATE TABLE IF NOT EXISTS `stu_new`(
   `学号` INT UNSIGNED AUTO_INCREMENT,
   `课程号` VARCHAR(100) NOT NULL,
   `总评成绩` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `学号` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*1、找出至少一门课程的期末成绩在90分以上的女学生的姓名。*/
SELECT DISTINCT sname 姓名
FROM student stu
INNER JOIN score s
WHERE sex = '女' and s.final > 90;
/*2、查询选修课程名为Java语言课程且期末成绩在90分以上的学生的学号。(distinct:去重)*/
SELECT DISTINCT studentno
FROM score
INNER JOIN course	/*INNER JOIN 两表之间取交集*/
WHERE cname = 'Java语言' AND score.final > 90;
/*3、查询选修课程号为c05103的学生的学号、姓名和期末成绩*/
SELECT stu.studentNo 学号, stu.sname 姓名, s.final 期末成绩
FROM student stu
INNER JOIN score s ON stu.studentNo = s.studentno
WHERE s.courseno = 'c05103';
/*4、统计选课门数超过两门的学生的学号及姓名*/
SELECT studentNo 学号, sname 姓名
FROM student
WHERE studentno in(	/*in常用于where表达式中,其作用是查询某个范围内的数据*/
	SELECT studentno
	FROM score
	GROUP BY studentno
	HAVING COUNT(*)> 2
);

/*5、查询选修了姓“苏”的老师的课程的学生的学号。*/
SELECT studentno 学号
FROM score
WHERE courseno IN(
	SELECT courseno
	FROM teach_course
	WHERE
		teacherno = (
		SELECT teacherno
		FROM teacher
		WHERE
			tname LIKE "苏%"
	)
)
GROUP BY studentno;

/*6、求每个学生所选修课程的期末平均分,要求显示学生的学号,姓名,及所选修课程的期末平均成绩
(期末平均成绩作为别名显示,且运用round函数使期末平均成绩保留一位小数),并按期末平均成绩从高到低排序。
TRUNCATE(X,D)	X 表示需要处理的数字,D 表示需要截取的位数。如果 D 为零,则返回的数字不含小数。*/
SELECT s.studentno 学号, stu.sname 姓名, TRUNCATE(avg(final), 1) 期末平均成绩
FROM student stu
JOIN score s ON s.studentno = stu.studentNo
GROUP BY s.studentno, stu.sname
ORDER BY 期末平均成绩 DESC;

/*7、查询19级学生的学号、姓名、课程名、期末成绩及学分(要求以别名学分显示所求学分,其中每门课程的学分等于该课程的总学时除以16)*/
SELECT stu.studentno 学号, stu.sname 姓名,
	c.cname 课程名, s.final 期末成绩,
	TRUNCATE(c.period/16, 1) 学分
FROM student stu, score s, course c
WHERE s.studentno = stu.studentNo AND c.courseno = s.courseno;

/*8、查询与“王伟”在同一个系学习的学生的基本信息*/
SELECT *
FROM student
WHERE departmentname = (
	SELECT departmentname
	FROM student
	WHERE sname = '王伟'
);

/*9、查询选修了“数据库原理"课程的学生的学号和姓名*/
SELECT stu.studentno 学号, stu.sname 姓名
FROM student stu
JOIN score s ON stu.studentNo = s.studentno
WHERE courseno
	= (SELECT courseno FROM course WHERE cname = '数据库原理');

/*10、查询期末成绩大于等于90分、总评成绩高于85分的学生的学号、课程号和总评成绩(要求以别名总评成绩显示总评成绩,其中总评成绩=平时成绩*30%+期末成绩*70%)*/
SELECT s.studentno 学号, s.courseno 课程号,
	(daily*0.3 + final*0.7) 总评成绩
FROM score s
WHERE (daily*0.3 + final*0.7) > 85 AND final > 90;

/*11、查询期末成绩比选修课程平均期末成绩低的学生的姓名、课程号和期末成绩*/
SELECT stu.sname 姓名, s.courseno 课程号, s.final 期末成绩
FROM student stu
INNER JOIN score s ON s.studentno = stu.studentNo
INNER JOIN (SELECT studentno, AVG(final) avg FROM score GROUP BY studentno) f 
	ON s.studentno = f.studentNo
WHERE final < avg;

/*12、查询期末成绩中含有高于90分的学生的学号、姓名、电话及课程名*/

SELECT stu.studentNo 学号, stu.sname 姓名,
	stu.phone 电话, c.cname 课程名
FROM student stu
	JOIN score s ON s.studentno = stu.studentNo
	JOIN course c ON c.courseno = s.courseno
WHERE final > 90;

/*13、查找score表中所有比c05103课程期末成绩都高的学生的学号、姓名和期末成绩*/
SELECT stu.studentNo 学号,stu.sname 姓名,s.final 期末成绩
FROM student stu, score s
WHERE stu.studentNo = s.studentno AND final>
      all(SELECT final FROM score WHERE courseno='c05103');

/*14、查询每一课程的间接先行课(即先行课的先行课)。*/
SELECT c.cname 课程名, c.cpno 先行课, s.cpno 间接先行课
FROM course c
JOIN course s ON s.courseno = c.cpno;
ORDER BY '先行课';


/*15、找出每个学生期末成绩超过他选修课程期末平均成绩的学生的学号及课程号*/
SELECT s.studentno 学号, s.courseno 课程号
FROM score s
INNER JOIN (SELECT studentno, avg(final) avg FROM score GROUP BY studentno) a ON
	s.studentno = a.studentno
WHERE s.final > avg;


/*16、查询年龄低于所有计数院学生的学生姓名、所在系、年龄。*/
SELECT sname 学生姓名, departmentname 所在系,
	TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) 年龄
FROM student
WHERE TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) < (
	SELECT MIN(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()))
	FROM student
	WHERE departmentname = '计数院'
);

/*17、查询选修了全部课程的学生姓名。*/
SELECT sname
FROM student
WHERE studentNo in(
	SELECT studentno
	FROM score
	GROUP BY studentno
	HAVING COUNT(*) = (
		SELECT COUNT(*)
		FROM course
		WHERE type = '选修'
	)
);

/*18、查询至少选修了学生18125111109必修的全部课程的学生学号,注意查询结果中不应该含有18125111109学生*/
SELECT studentno 
FROM	score
WHERE
	NOT EXISTS ( SELECT courseno FROM score WHERE a.studentno = studentno AND studentno = 18125111109 ) 
	AND studentno != 18125111109 
GROUP BY studentno;


/*19、查询2021年3月份苏姓老师的授课信息,包括教工号,教师姓名,课程名,授课时间。*/
/*	ON的作用:添加约束;on后面就是我们加的条件	*/
SELECT t.teacherno 教工号, t.tname 教师姓名,
	c.cname 课程名, tc.teachtime 授课时间
FROM teacher t
INNER JOIN teach_course tc ON t.teacherno = tc.teacherno
INNER JOIN course c ON tc.courseno = c.courseno
WHERE t.tname LIKE '苏%'
	AND YEAR(teachtime) = 2021
	AND MONTH(teachtime) = 3;

/*20、查询没有学生选修的课程的课程号*/
SELECT courseno 课程号
FROM course c
WHERE NOT EXISTS(
	SELECT *
	FROM score
	WHERE c.courseno = courseno
);

照旧给几张运行成功的截图 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 多表查询写起来感觉要比单表查询难得多,反正我是感觉不容易。 这次就先这样,其实还有一道附加题,我找时间做完了再分享给大家吧