前言

今天碰到一个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)

  1. 查询s001同学所选的所有课程
SELECT cno FROM sc WHERE sno='s001';
  1. 查询出s001号同学所选课程的总数
SELECT COUNT(cno) FROM sc GROUP BY sno HAVING sno='s001';
  1. 所有“选过s001同学所选课程”的记录,并且排除s001同学的记录。这一步比较关键,要理解为什么要查这一步。这一步操作之后,临时表里的所有记录的课程,就都是s001同学选过的了。然后我就可以继续进行筛选了
SELECT * FROM sc WHERE cno IN
(SELECT cno FROM sc WHERE sno='s001') AND sno<>'s001';
  1. 将第三步查询出来的结果作为临时表,对临时表进行操作:按照学号进行分组,统计每位同学所选课程的总数,
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
  1. 在第四步的基础上进行筛选:条件是课程总数与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') ;
  1. 到此已经大功告成了,最后再和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同学所选课程完全一样的同学相关推荐

  1. mysql创建储存过程 输入学生名子_创建一个存储过程,给定某学生学号,要求查询出该学生的姓名,所选课程名和成绩.(SQL SERVER)...

    展开全部 /*创建存储过程*/ CREATE PROCEDURE proc_select--建立存储过程 @Sno char(10) output,--输入输出参数636f70793231313335 ...

  2. sql镶嵌查询_【SQL】嵌套查询与子查询

    前言 sql的嵌套查询可以说是sql语句中比较复杂的一部分,但是掌握好了的话就可以提高查询效率.下面将介绍带in的子查询.带比较运算符的子查询.带any/all的子查询.带exists的子查询以及基于 ...

  3. mysql写出总分最高的学生姓名_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...

  4. sql 练习查询和“01“号的同学学习的课程完全相同的其他同学的信息

    sql练习题 练习查询和"01"号的同学学习的课程完全相同的其他同学的信息 SELECT s_id,s_name,s_birth,s_sex FROM student WHERE ...

  5. sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...

  6. 【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】

    查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336 SQL经典50题第9题正解 题目:查询和" 01 ...

  7. 编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数 这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据 ...

  8. mysql2000名称_[转载]编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    有以下两张表, Class表 classid classname 1 高三(一)班 2 高三(二)班 3 高三(三)班 Student表 studentid   studentName classid ...

  9. 编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数

    有以下两张表, Class表 classid classname 1 高三(一)班 2 高三(二)班 3 高三(三)班 Student表 studentid   studentName classid ...

最新文章

  1. java随机产生字母排序_Java生成含字母和数字的6位随机字符串
  2. 50万+Python 开发者的选择,这本书对零基础真是太太太友好了
  3. COCO API的克隆 - http://cocodataset.org/
  4. [BZOJ 2555] SubString
  5. 蓝桥杯 算法提高 日期计算
  6. Java并发编程实战————可重入内置锁
  7. 中国量子计算机领先美国吗,好消息!中国又一项技术领先全球,美国院士:这是划时代的成果...
  8. oracle querytimeout,聊聊pg jdbc的queryTimeout及next方法
  9. 关于生成静态页--终极解决方案
  10. 绝对不能错过!计算机视觉Polygon Mesh Processing读书笔记——4微分几何中的曲线
  11. 深度解析~iOS应用程序~生命周期
  12. nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
  13. excel常用公式--数据清洗类
  14. 兰花草c语言编码蜂鸣器,蜂鸣器奏乐-多种音乐分享
  15. CEO的行为风格会影响公司业绩吗?
  16. 电子电路:高频晶体管电路
  17. c语言中分号作用,在C语言中逗号、分号等的用法
  18. 考虫四级词汇思维导图
  19. Copy On Write机制了解一下
  20. 监听电源键的单击或长按事件

热门文章

  1. 你绝对能看懂的Kafka源代码分析-Kafka Producer设计分析
  2. Nature | 张宁/张泽民/朱继业合作揭示肝癌免疫微环境亚型和中性粒细胞异质性...
  3. 微信获取open ID
  4. 离散数学——数学结构
  5. Silverlight 2学习教程(四)
  6. 二分查找python实现代码_二分查找——Python实现
  7. python--re模块及爬取红牛分公司实战演练
  8. 知识蒸馏 | (1) 知识蒸馏概述
  9. 主机链接无线网虚拟机nat模式固定ip设置
  10. 汽车功能安全工程师必看!ISO 26262认证基本原理解析