练习 Sql 四个表相连时一个疑问

2021-07-18 17:00:58 +08:00
 TwoSetViolin

–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别

–2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号

–3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名

–4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程编号,分数

SELECT st.*,t.t_name
from student st 
JOIN score s on st.s_id=s.s_id
JOIN course c on c.c_id=s.c_id
JOIN teacher t on t.t_id=c.t_id
where t.t_name="张三"

老师文档的答案用的是子查询的嵌套 where 方式,

select st.* from student st where st.s_id not in(
  select sc.s_id from score sc where sc.c_id in 
(select c.c_id from course c left join teacher t on t.t_id=c.t_id where  t.t_name="张三")
  )

如果不用子查询,我上面的四表相连, 最后的 where 要怎么改才可以符合题意

1546 次点击
所在节点    问与答
12 条回复
TwoSetViolin
2021-07-18 17:10:03 +08:00
尴尬,已解决,忽然发现加个!表示不等于就可以了
TwoSetViolin
2021-07-18 17:14:24 +08:00
不对,加个!并不能查出,即使去掉了 有 张三 的记录,也不是正确的结果,毕竟 每一个学生 都由 多个老师 教学,看来只能用老师文档上的子查询的那种作为答案了。
heyjei
2021-07-18 20:43:39 +08:00
你要工作日来问,这样大家摸鱼的时候就会来回答你的问题了。周末大家都忙着过生活去了。

你学了 inner join,那 right join 和 left join 学了没?你可以试试用 left join
leafre
2021-07-18 21:01:36 +08:00
子查询结果集无法使用索引,别在生产时这么写
iseki
2021-07-18 21:09:17 +08:00
select s_id from Teacher inner join Course using t_id inner join Score using c.id inner where t_name != '张三'
可不可以?
iseki
2021-07-18 21:11:05 +08:00
哦不对…写糊了…这样查出来的不对
iseki
2021-07-18 21:12:46 +08:00
应该是只能子查询了(
xiangyuecn
2021-07-18 22:22:43 +08:00
exists
not exists
iseki
2021-07-18 22:37:01 +08:00
except (也不是不能用(
TwoSetViolin
2021-07-19 08:24:07 +08:00
#3
嗯嗯,左连接有学过
#4
好的
#7 #9
搜索了一下 MySQL 不支持 EXCEPT 运算符,大概只能够用子查询了
#8
不行,我把最后一句改为 where t.t_name not exists "张三" 报错
oRbceGJ
2021-07-19 09:41:39 +08:00
left join 可以解决的
c6h6benzene
2021-07-19 11:34:27 +08:00
是不是就是“学过张三老师授课的同学”取反?

not in 或者两个查询 except 都可以吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790215

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX