首页 > 试题广场 >

已知某校数据库中包含如下的表数据: 学生表student(s

[单选题]
已知某校数据库中包含如下的表数据:

学生表student(sno,sname,birthday,gender)

课程表course(cid,cname)

成绩表grade(sno,cid,mark)

查询至少有一门课程与sno=1909的学生选择的课程相同的学生的学号和姓名,下列SQL语句中正确的是()

  • SELECT DISTINCT a.sno,a.sname

    FROM student a,grade b

    WHERE a.sno=1909 and a.sno=b.sno

    and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

  • SELECT DISTINCT a.sno,a.sname

    FROM student a,grade b

    WHERE a.sno<>1909 and a.sno=b.sno

    and b.cid IN (SELECT cid FROM grade WHERE sno=1909)

  • SELECT DISTINCT a.sno,a.sname

    FROM student a,grade b

    WHERE a.sno<>1909 and a.sno=b.sno

    and b.cid NOT IN (SELECT cid FROM grade WHERE sno=1909)

  • SELECT DISTINCT a.sno,a.sname

    FROM student a,grade b

    WHERE a.sno=1909 and a.sno=b.sno

    and b.cid IN (SELECT cid FROM grade WHERE sno<>1909)

<> 符号与 != 没有区别,在父查询中表示除了sno为1909之外的任何学生进行筛选,在子查询中对sno为1909的学生进行选择
发表于 2021-12-30 15:18:23 回复(0)
Q$Q头像 Q$Q
逻辑顺序:
1. 从 `student` 和 `grade` 表中选择字段 `sno`(学生编号)和 `sname`(学生姓名)。
2. 筛选条件 `a.sno<>1909` 排除 `sno` 为 1909 的学生。
3. 通过 `a.sno=b.sno` 关联 `student` 和 `grade` 表。
4. 子查询 `(SELECT cid FROM grade WHERE sno=1909)` 找出 `sno` 为 1909 的学生修过的课程(`cid`)。
5. 主查询中用 `b.cid IN` 条件,只包括修过与 `sno` 为 1909 的学生相同课程的其他学生。
结果没有重复(`DISTINCT`)。
编辑于 2023-09-22 13:43:40 回复(0)
三表查询,用in。<>为不等于
发表于 2022-01-17 23:43:44 回复(0)
a.sno<>1909 排除190***生
b.cid IN (SELECT cid FROM grade WHERE sno=1909)  有b学生选的课
发表于 2022-05-18 22:31:43 回复(0)
三表查询,先查出至少有一门和190***号相同的课程的用 in(子查询),且需要排除1909,故排除A。
发表于 2021-12-30 16:09:52 回复(0)
<>是不等于,本题需要把sno=1909的人排除然后进行筛选,三表查询用in

发表于 2022-08-18 09:38:17 回复(0)
a.son=b.son是什么意思啊
发表于 2022-01-18 15:58:38 回复(4)