SQL查询——查询和和xxx同学所选课程完全一样的同学
前言
今天碰到一个sql问题,想了半天才想出来,为了记录,所以写了这篇博客。
题目和环境是这样的
有四张表:学生表、教师表、课程表、成绩表
学生表(student):编号(sno)、姓名(sname)、年龄(sage)、性别(ssex)
教师表(teacher):编号(tno)、姓名(tname)
课程表(course):编号(cno)、课程名(cname)、教师编号(tno)
成绩表(sc):学生编号(sno)、课程编号(cno)、分数(score)
问题是:查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名。
这题的难点是:s001号同学所选的课程不止一门,所以查询出了s001号同学所选的所有课程,无法通过等于来限定条件进行查询。也无法通过in来限定,因为in是等于范围内的某个,从某种意义上来说,和等于效果是一样的。
答案
冥思苦想良久,终于想出了解法,可能还有更好的答案,但我暂时只想到了这一种
思路
我们可以查出s001号同学所选的所有课程编号,和所选的课程总数,然后在查询出所有“选过s001同学所选课程”的记录,再按学号分组,统计条数是否相同。只看思路可能一时间看不懂,可以先往下看代码,我代码会一步一步的来写。
代码(mysql)
- 查询s001同学所选的所有课程
SELECT cno FROM sc WHERE sno='s001';
- 查询出s001号同学所选课程的总数
SELECT COUNT(cno) FROM sc GROUP BY sno HAVING sno='s001';
- 所有“选过s001同学所选课程”的记录,并且排除s001同学的记录。这一步比较关键,要理解为什么要查这一步。这一步操作之后,临时表里的所有记录的课程,就都是s001同学选过的了。然后我就可以继续进行筛选了
SELECT * FROM sc WHERE cno IN
(SELECT cno FROM sc WHERE sno='s001') AND sno<>'s001';
- 将第三步查询出来的结果作为临时表,对临时表进行操作:按照学号进行分组,统计每位同学所选课程的总数,
SELECT temp.sno,COUNT(temp.cno)
FROM (SELECT * FROM sc WHERE cno IN
(SELECT cno FROM sc WHERE sno='s001') AND sno<>'s001') AS temp
GROUP BY temp.sno
- 在第四步的基础上进行筛选:条件是课程总数与s001同学相等
SELECT temp.sno,COUNT(temp.cno)
FROM (SELECT * FROM sc WHERE cno IN
(SELECT cno FROM sc WHERE sno='s001') AND sno<>'s001') AS temp
GROUP BY temp.sno
HAVING COUNT(temp.cno)=
(SELECT COUNT(cno) FROM sc GROUP BY sno HAVING sno='s001') ;
- 到此已经大功告成了,最后再和student表进行连接查询,查出姓名即可
SELECT temp.sno,st.`sname` FROM
(SELECT * FROM sc WHERE cno IN
(SELECT cno FROM sc WHERE sno='s001') AND sno<>'s001') AS temp
INNER JOIN student AS st ON st.`sno`=temp.sno
GROUP BY temp.sno HAVING COUNT(temp.cno)=
(SELECT COUNT(cno) FROM sc GROUP BY sno HAVING sno='s001');
经过验证,是OK的。
总结
其实我一开始,是想到用in去进行限定的,但是in根本不能完成,因为in是等于枚举里面的某一项即满足条件。
那我又想:sql里面有没有“等于某个范围里面所有值”这样的关键字,或者语法呢?但其实这种想法就是错误的,一个字段的值只可能是 一个,怎么可能会是多个呢,所以也不可能有这个语法。
最终采用了两组条件进行限制,然后查了出来。
SQL查询——查询和和xxx同学所选课程完全一样的同学相关推荐
- mysql创建储存过程 输入学生名子_创建一个存储过程,给定某学生学号,要求查询出该学生的姓名,所选课程名和成绩.(SQL SERVER)...
展开全部 /*创建存储过程*/ CREATE PROCEDURE proc_select--建立存储过程 @Sno char(10) output,--输入输出参数636f70793231313335 ...
- sql镶嵌查询_【SQL】嵌套查询与子查询
前言 sql的嵌套查询可以说是sql语句中比较复杂的一部分,但是掌握好了的话就可以提高查询效率.下面将介绍带in的子查询.带比较运算符的子查询.带any/all的子查询.带exists的子查询以及基于 ...
- mysql写出总分最高的学生姓名_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...
- sql 练习查询和“01“号的同学学习的课程完全相同的其他同学的信息
sql练习题 练习查询和"01"号的同学学习的课程完全相同的其他同学的信息 SELECT s_id,s_name,s_birth,s_sex FROM student WHERE ...
- sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...
- 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】
查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336 SQL经典50题第9题正解 题目:查询和" 01 ...
- 编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数 这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据 ...
- mysql2000名称_[转载]编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
有以下两张表, Class表 classid classname 1 高三(一)班 2 高三(二)班 3 高三(三)班 Student表 studentid studentName classid ...
- 编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数
有以下两张表, Class表 classid classname 1 高三(一)班 2 高三(二)班 3 高三(三)班 Student表 studentid studentName classid ...
最新文章
- java随机产生字母排序_Java生成含字母和数字的6位随机字符串
- 50万+Python 开发者的选择,这本书对零基础真是太太太友好了
- COCO API的克隆 - http://cocodataset.org/
- [BZOJ 2555] SubString
- 蓝桥杯 算法提高 日期计算
- Java并发编程实战————可重入内置锁
- 中国量子计算机领先美国吗,好消息!中国又一项技术领先全球,美国院士:这是划时代的成果...
- oracle querytimeout,聊聊pg jdbc的queryTimeout及next方法
- 关于生成静态页--终极解决方案
- 绝对不能错过!计算机视觉Polygon Mesh Processing读书笔记——4微分几何中的曲线
- 深度解析~iOS应用程序~生命周期
- nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
- excel常用公式--数据清洗类
- 兰花草c语言编码蜂鸣器,蜂鸣器奏乐-多种音乐分享
- CEO的行为风格会影响公司业绩吗?
- 电子电路:高频晶体管电路
- c语言中分号作用,在C语言中逗号、分号等的用法
- 考虫四级词汇思维导图
- Copy On Write机制了解一下
- 监听电源键的单击或长按事件
热门文章
- 你绝对能看懂的Kafka源代码分析-Kafka Producer设计分析
- Nature | 张宁/张泽民/朱继业合作揭示肝癌免疫微环境亚型和中性粒细胞异质性...
- 微信获取open ID
- 离散数学——数学结构
- Silverlight 2学习教程(四)
- 二分查找python实现代码_二分查找——Python实现
- python--re模块及爬取红牛分公司实战演练
- 知识蒸馏 | (1) 知识蒸馏概述
- 主机链接无线网虚拟机nat模式固定ip设置
- 汽车功能安全工程师必看!ISO 26262认证基本原理解析