select student.* from student WHERE student.s_name not in( select st.s_name, st.s_id, st.s_birth from teacher t, student st, course c, score sc WHERE st.s_id=sc.s_id AND sc.c_id=c.c_id and c.t_id=t.t_id and t.t_name ="张三")
时间: 2024-02-28 11:54:22 浏览: 126
这个 SQL 查询语句的意思是从 student 表中选择所有的列,但是只取那些 s_name 不在子查询结果集中的记录。子查询中选择了四个列,而在 not in 中只能选择一个列。因此,你需要修改子查询,只选择 s_name 列,如下所示:
```
select student.* from student WHERE student.s_name not in( select st.s_name from teacher t, student st, course c, score sc WHERE st.s_id=sc.s_id AND sc.c_id=c.c_id and c.t_id=t.t_id and t.t_name ="张三")
```
这样就只在 not in 中选择了一个列,可以正确执行查询语句了。
相关问题
select student.* from student join (select c_id from score where score.s_id=01)tmp1 join (select s_id,c_id from score)tmp2 on tmp1.c_id =tmp2.c_id and student.s_id =tmp2.s_id where student.s_id not in('01') group by student.s_id,s_name,s_birth,s_sex;
这是一个 SQL 查询语句,它的作用是查询与学生 s_id 为 01 的学生在同一个课程中的其他学生信息。具体来说,它使用了三个子查询。第一个子查询是用来查询 s_id 为 01 的学生所选的课程 c_id,第二个子查询是用来查询所有学生所选的课程和对应的 s_id 和 c_id,第三个子查询是将第一个和第二个子查询的结果进行关联,找到和 s_id 为 01 的学生选了相同课程的其他学生的信息。最后,使用了 group by 子句对结果进行分组,输出了其他学生的 s_id、s_name、s_birth、s_sex 等信息。
select s.s_name , s.s_birth ,s.s_sex,sc.s_score from (select s_id, c_id, s_score, row_number() over(distribute by c_id sort by s_score desc) rowNum from score) sc left join student s on s.s_id = sc.s_id where sc.rowNum between 2 and 3;
这是一个 SQL 查询语句,用于查询学生表和成绩表中的信息。具体来说,它使用了子查询和窗口函数,以及左连接和条件筛选。
子查询部分是:
```
select s_id, c_id, s_score,
row_number() over(distribute by c_id sort by s_score desc) rowNum
from score
```
这个子查询用于给每个课程按照成绩从高到低排序,并为每个学生的排名添加一个行号。其中,`distribute by c_id` 表示按照课程 ID 进行分组,`sort by s_score desc` 表示按照成绩倒序排序。
主查询部分是:
```
select s.s_name, s.s_birth, s.s_sex, sc.s_score
from (子查询) sc
left join student s on s.s_id = sc.s_id
where sc.rowNum between 2 and 3
```
这个主查询使用了左连接,将学生表和子查询结果按照学生 ID 进行连接,并筛选出排名为第二和第三的学生信息。最终,查询结果包括学生姓名、出生日期、性别和对应课程的成绩。
阅读全文