比如说,在一个典型的大学的数据库系统中,什么可能是一个SQL语句,可以找到没有学生注册的所有课程呢? (注册过程为10天,现在是第3天)。
其他SQL语句解决方案可能是什么?
详细说明:
假设大学有许多部门,每个部门都有不同的班级,如心理学1A,由不同时间的几位不同教师教授,以及心理学10,数学110等。
答案 0 :(得分:3)
用于识别表A中不在表B中的记录的基本技术。每个都有其优点,每个都可能表现良好或不好,具体取决于数据分布和数量。此外,过滤列中存在空值可能会导致不同的结果(尽管这似乎不太可能是问题中描述的特定方案中的考虑因素)。最后,并非每种SQL都支持所有这些语法。
最困难的可能是NOT IN:
select *
from classes
where id not in
( select class_id
from registrations
)
/
接下来是相关的NOT EXISTS:
select *
from classes
where not exists
( select null
from registrations
where registrations.class_id = classes.id
)
/
然后是ANTI-JOIN:
select *
from classes
full outer join registrations
on (classes.id = registrations.class_id )
where registrations.class_id is null
/
最后有MINUS运算符:
select id
from classes
minus
select class_id
from registrations
/
这种最终语法写得非常快,但显然在细节上有所下降。如果我们想要更多来自CLASSES的列,不在REGISTRATIONS中的列,那么我们需要将它作为子查询提供给CLASSES上的select。因此,它不像其他语法那样广泛适用,但在某些情况下很有用。
答案 1 :(得分:2)
以下是使用FULL OUTER JOIN
的一个选项:
SELECT *
FROM Class
FULL OUTER JOIN StudentClass
ON Class.Id = StudentClass.ClassId
WHERE StudentClass.ClassId IS NULL
您还可以将子查询与NOT IN
:
SELECT *
FROM Class
WHERE Id NOT IN
( SELECT ClassId
FROM StudentClass
)
答案 2 :(得分:1)
你可以使用左连接,当没有任何东西要加入
时,它会粘在NULL上SELECT class
FROM classes c
LEFT JOIN students s ON c.class = s.class
WHERE s.name IS NULL