SQL经典50查询语句案例_12(查询至少学过学号为“1001”同学所有课程的其他同学学号和姓名)

SQL经典50查询语句案例_12

12.查询至少学过学号为“1001”同学所有课程的其他同学学号和姓名

SELECT res.SId, student.StuName 
FROM
	(SELECT b.SId, COUNT(*) as number FROM
	(SELECT SId FROM
	(SELECT CId FROM sc WHERE SId = '1001')a,
sc aa
WHERE 
	a.CId = aa.CId)b GROUP BY b.SId)res,
	(SELECT COUNT(CId) as number FROM sc WHERE SId = '1001')c,
	student
WHERE res.number = c.number 
	AND res.SId <> '1001'
	AND student.SId = res.SId

在MySQL命令行中的运行情况:

在这里插入图片描述

总结: 在不使用join的情况下的解法,思路比较复杂,运用了多嵌套查询和count计数等。

——如有问题和更简单的方法请各位大佬指出!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 假设学生表为 students,课程表为 courses,选表为 selections,可以使用如下 SQL 语句查询学过“001”并且也学过编号“002”课程同学学号姓名: ``` SELECT s.id, s.name FROM students s INNER JOIN selections sel1 ON s.id = sel1.student_id INNER JOIN courses c1 ON sel1.course_id = c1.id AND c1.course_code = '001' INNER JOIN selections sel2 ON s.id = sel2.student_id INNER JOIN courses c2 ON sel2.course_id = c2.id AND c2.course_code = '002'; ``` 其中,INNER JOIN 表示内连接,ON 后面是连接条件。这个 SQL 语句的意思是先将学生表、选表和课程表连接起来,然后筛选出选了编号为“001”的课程的学生和选了编号为“002”的课程的学生,最后取交集即为结果。 ### 回答2: 要查询学过编号为“001”课程并且也学过编号为“002”课程同学学号姓名,可以使用以下SQL语句: SELECT 学号,姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 课程表 WHERE 课程编号 = '001') AND 学号 IN (SELECT 学号 FROM 课程表 WHERE 课程编号 = '002'); 在这个SQL语句中,首先使用子查询找到学过编号为“001”的课程的学生学号,然后再使用子查询找到学过编号为“002”的课程的学生学号,最后将两个子查询的结果合并并与学生表进行连接查询,获取学号姓名信息。 这样就可以得到学过“001”并且也学过“002”课程同学学号姓名了。 ### 回答3: 要查询学过编号为“001”并且也学过编号为“002”的同学学号姓名,可以使用以下SQL语句: SELECT 学号, 姓名 FROM 学生表 WHERE 学号 IN ( SELECT 学号 FROM 选表 WHERE 课程编号 = '001' ) AND 学号 IN ( SELECT 学号 FROM 选表 WHERE 课程编号 = '002' ); 解释如下: 首先,在学生表中查找学号姓名。 使用子查询来筛选学过编号为“001”的学生的学号。 再使用子查询来筛选学过编号为“002”的学生的学号。 使用AND来将两个条件组合起来,这样就可以筛选出学过“001”并且也学过“002”的同学学号姓名。 注意:以上SQL语句中的“学生表”为存储学生信息的表,包含学号姓名字段。而“选表”为存储学生选信息的表,包含学号课程编号字段。根据实际情况,请将表名和字段名替换为你实际使用的表和字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值