8、查询没学过"张三"老师讲授的任一门课程的学生姓名 select * from student st inner join score sc on st.s_id =sc.s_id inner join course co on sc.c_id=co.c_id inner join teacher te on co.t_id=te.t_id where te.t_name ="张三"
时间: 2023-07-15 11:11:34 浏览: 134
你的SQL语句有些问题,应该使用`NOT IN`关键字来查询没学过张三老师讲授的任一门课程的学生姓名。正确的SQL语句如下:
```
SELECT DISTINCT st.s_name
FROM student st
WHERE st.s_id NOT IN (
SELECT sc.s_id
FROM score sc
INNER JOIN course co ON sc.c_id = co.c_id
INNER JOIN teacher te ON co.t_id = te.t_id
WHERE te.t_name = '张三'
)
```
这个SQL查询语句会返回一个学生姓名的列表,这些学生都没学过张三老师讲授的任一门课程。
相关问题
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 ="张三")
这个 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 中选择了一个列,可以正确执行查询语句了。
8、select student.* from student left join (select s_id from score join (select c_id from course join teacher on course.t_id=teacher.t_id and t_name='张三')tmp2 on score.c_id=tmp2.c_id )tmp on student.s_id = tmp.s_id where tmp.s_id is null;关系代数表达式
这条 SQL 查询语句的关系代数表达式如下:
π<sub>student.*</sub> (student) - π<sub>tmp.s_id</sub> (σ<sub>tmp.s_id is not null</sub> (student ⨝<sub>s_id=s_id</sub> tmp))
其中,π 表示投影运算符,σ 表示选择运算符,⨝ 表示自然连接运算符,tmp 是一个子查询结果的别名,其代表的是选取该老师所教授的课程的成绩表中的学生 ID,然后与学生表进行左连接,最终选取左表中存在但右表中不存在的学生记录。
阅读全文