V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
TwoSetViolin
V2EX  ›  问与答

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

  •  
  •   TwoSetViolin · 2021-07-18 17:00:58 +08:00 · 1584 次点击
    这是一个创建于 1259 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 表字段

    –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 要怎么改才可以符合题意

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

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

    not in 或者两个查询 except 都可以吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1417 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:24 · PVG 01:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.