什么是SQL语句,可以找到没有学生注册的所有类?

时间:2010-04-23 13:14:39

标签: sql join

比如说,在一个典型的大学的数据库系统中,什么可能是一个SQL语句,可以找到没有学生注册的所有课程呢? (注册过程为10天,现在是第3天)。

其他SQL语句解决方案可能是什么?

详细说明:

假设大学有许多部门,每个部门都有不同的班级,如心理学1A,由不同时间的几位不同教师教授,以及心理学10,数学110等。

3 个答案:

答案 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