mysql 多表查询

1.查询所有的课程的名称以及对应的任课老师姓名
SELECT
	course.cname,
	teacher.tname 
FROM
	course
	INNER JOIN teacher 
ON course.teacher_id = teacher.tid;

Thinking:
课程名称和老师姓名存放在不同表中所以用到多表查询
每个课程都有一个对应老师的id,so course.teacher_id = teacher.tid 来过滤数据

2.查询平均成绩大于八十分的同学的姓名和平均成绩
SELECT
	student.sname,
	avg_num 
FROM
	student
INNER JOIN ( 
	SELECT 
		student_id, 
		avg( num ) AS avg_num 
	FROM 
		score 
		ROUP BY 
		student_id 
	HAVING avg( num ) > 80 ) AS t1 
ON t1.student_id = student.sid;

Thinking:
在成绩表中查询每个学生的平均成绩,然后取平均的成绩,so need to use group by and having,avg()
在成绩表中有对应学生成绩的id,通过学生的id分组,并且分组后的数据,再取每个学生成绩的平均值,并且返回平均成绩大于80的学生id和平均成绩
既然得到了平均成绩大于80的学生id,接下来就是从学生表中取出对应的学生姓名通过学生的id

3.查询没有报李平老师课的学生姓名
SELECT
	student.sname 
FROM
	student 
WHERE
	sid NOT IN (
	SELECT DISTINCT
		student_id 
	FROM
		score 
	WHERE
		course_id IN ( 
			SELECT 
				course.cid 
			FROM 
				course 
			INNER JOIN 
				teacher 
			ON course.teacher_id = teacher.tid 
			WHERE tname = '李平老师' )
	);

Thinking~
第一查:查询出李平老师的课程并返回课程的所有id 返回的是多个课程id
第二查:从返回的多个课程id中,查找出报这几个课程的学生id,返回的是多个学生的id,这学生有重复的,给一个去重复的操作,⚠️返回的是报名学生的id
第三查:通过学生表的id从返回的学生id数据中查询出不存在的id即可

4.查询没有同时选修物理课程和体育课程的学生姓名
SELECT
	student.sname 
FROM
	student 
WHERE sid IN (
		SELECT
			student_id 
		FROM
			score 
		WHERE course_id IN ( 
				SELECT cid FROM course WHERE cname = '物理' OR cname = '体育' ) 
		GROUP BY
			student_id 
		HAVING
			COUNT( course_id ) = 1 
	);

Thinking~
1.通过物理和体育关键词,查询出两门课程的ID
2.成绩表中有每个学生对应的没门课程的成绩,so 需要学生进行分组查询,并且过滤出选择了其中1们课程的学生id,并返回学生的id
3.在学生表中查询出相对应的学生的姓名即可

5.查询挂科超过两门(包括两门)的学生姓名和班级
SELECT
	student.sname,
	class.caption 
FROM
	class
	INNER JOIN student ON class.cid = student.class_id 
WHERE
	sid IN ( 
		SELECT student_id 
		FROM score 
		WHERE num < 60 
		GROUP BY student_id 
		HAVING COUNT( course_id ) >= 2 );

Thinking~
1.查询出出分数小于60的学生id,每个学生的多门课程,so 对分数小于60进行分组查询,并且过滤出挂科超过2门的学生id
2.我们需要用到两个表内的内容,so 多表查询,先更具sid查询出不及格的学生,然后通过这个学生的sid查询出他所在的班级名称

6.查询学生表中男女生各有多少人
SELECT
	gender,
	count( sid ) 
FROM
	student 
GROUP BY
	gender;

Thinking~
男女分组查询,并且统计count()人数

7.查询物理成绩等于100的学生的姓名
-- one
SELECT
	student.sname 
FROM
	student 
WHERE
	sid IN ( 
		SELECT student_id 
		FROM score 
		WHERE course_id = ( 
			SELECT cid 
			FROM course 
			WHERE cname = '物理' ) 
		AND num >= 100 );
-- two
SELECT sname FROM student WHERE sid IN (
	SELECT student_id
	FROM score
	INNER JOIN course on score.course_id = course.cid
	WHERE
		course.cname = '物理'
	AND score.num = 100
);

Thinking~
先查询出分数100的物理课程学生的id
然后通过返回的id,查询出学生的姓名

8.查询所有学生的学号,姓名,选课数,总成绩
SELECT
	student.sid,
	student.sname,
	t1.course_num,
	t1.total_num 
FROM
	student
LEFT JOIN ( 
	SELECT student_id, COUNT( course_id ) AS course_num, sum( num ) AS total_num 
	FROM score 
	GROUP BY student_id ) 
AS t1 ON student.sid = t1.student_id;

Thinking~
查询已经选择了课程学生,并进行分组查询对学生的id,同时用聚合函数算出课程数和总成绩
学生表中还有没有选择课程的学生,所以这里就用左连接来查询

待更新……

用到的sql
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
1-1、管理员从“管理页面”进行后台登陆,新系统默认系统管理员帐号和 密码为admin和admin。 1-2、为了增加 系统安全,登陆后请你马上到“管理页面-修改密码”修改你的系统管理员密码。 1-3、“管理页面-帐号管理”你可以添加、编辑、删除管理员帐号(如果你有系统管理员权限)。 1-4、“管理页面-教师管理-添加教师”你可以添加教师帐号。 1-5、“管理页面-教师管理”你可以编辑、删除教师帐号,任课情况和班主任只是该教师当前所授课程和任哪班的班主任,若要修改请到相应的“课程管理”和“班级管理”。 1-6、“管理页面-年级管理”你可以添加、编辑、删除年级。年级的概念是“高三(2)班”中的“高三”。 1-7、“管理页面-学期管理”你可以添加、编辑、删除学期,并且必须把某一个学期设置为当前学期。学期名最好以“2006-2007第二学期”这样的格式发布。 2-1、“功能页面-系统设置”,你可以设置网站名称、网页左上方图标地址、网站主体格属性。 2-2、“功能页面-年级变迁”,新学期可以对同一年级下班级进行 批量升级,但请注意,必须从高年级开始升。比如,想将高二升为高三,再将高一升为高二。 2-3、“功能页面- 下载管理”,你可以添加、编辑、删除软件下载的分类名。 2-4、“功能页面- 软件管理”,你可以添加、编辑、删除 所有软件,包括教师添加的软件。 2-5、“功能页面-留言管理”,你可以按时间批量学生对教师留言、家长对教师留言、学生与家长留言,点击“执行删除”将在不做任何提示的情况下删除所有留言,不可 恢复。 3-1、“班级管理-班级管理”,你可以编辑、删除某个班级,同时可以查询,如“高三(2)班”只需输入“(2)班”即可。 3-2、“班级管理-批量班级添加一”,选择年级、班主任,输入班级名称,可一次性添加9个班级。 3-3、“班级管理-批量班级添加二”,选择需要添加的班级数,选择年级,输入班级的公共字部分,如“班”,也可以不输,然后点击“设定参数”。在下面的新格中输入班级名,选择班主任,添加新班级。此两种方法视情况自由选择。 4-1、“课程管理-课程管理”,你可以编辑、删除某个课程。 4-2、“课程管理-批量课程添加”,选择批量添加的课程数,输入公共字,也可以不输,点击“设定参数”,在下面出来的新格中填写课程名称,然后添加。 4-3、“课程管理-任课管理”,你可以编辑、删除某个教师相对应的任课关系。任课关系是教师、课程、班级、学期四者间的关系。 4-4、“课程管理-课程添加”,可先选择条数、教师、学期、班级,再点“设定”,然后在下面新生成的格里根据实际重新选择添加。只有存在任课关系的教师才可以登陆管理自己相应班级和课程的成绩,否则无法管理。 5-1、“学生管理-学生管理”,你可以编辑、删除某个同学。 5-2、“学生管理-批量学生添加”,先根据学生数、班级、状态、入学年月设定,学号可填可不填,即公共字。在下面生成的新格中完成填写,添加新学生。 5-3、“学生管理-按班批量学生添加”,选择班级、状态、入学年月,“起始学号”和“终止学号”为位数相同的数字,比如1200-1240,终止大于起始。 5-4、“学生管理-评语管理”,管理员无评语管理功能,评语管理是教师针对学生的评价。 5-5、“学生管理-数据导入”,管理员可以上传EXCEL文件的学生名单及成绩文件至 服务器,再将数据导入。 6-1、“成绩管理-成绩管理”,你可以编辑、删除某个学生的成绩,并且可以根据条件来显示需要的学生成绩。 6-2、“成绩管理-批量成绩添加”,可以根据成绩数、班级、课程、学期、类型来设定,根据新生成的格来输入成绩,需要一个个输入学号和对应的成绩。 6-3、“成绩管理-按班批量成绩添加”,可以选择班级、课程、学期、类型进行设定,然后下面会生成新格,列出该班的所有学生,你只需要输入对应的成绩,操作比较方便。 7-1、“管理统计-学生统计”,选定某一个班级,可以显示该班级的学生数及状态和所属班级。 7-2、“管理统计-排名统计”,选定所有条件后,列出符合条件的记 录,并按分数从高到低或从低到高进行排序。 ■■■■家长操作说明■■■■ 家长帐号是由各班的班主任管理,所以登陆帐号和密码可以从班主任处获得。在网页左边可进行登陆,登陆后左边登陆窗口变成各连接菜单,右边显示你是哪个同学的家长。 1、“修改资料”,登陆后你可以修改自己的姓名和密码,建议填写真实姓名,以便班主任更好的管理。 2、“教师留言”,可以给相关的班主任和任课教师留言,标题和内容需要都填写。 3、“子女留言”,按时间列出子女给你的留言,通过上面的“给孩子留言”连接,你也可以给你孩子发送留言。 4、“教师评语”,列出相
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值