首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哪条SQL语句可以找到所有还没有学生注册的班级?

哪条SQL语句可以找到所有还没有学生注册的班级?
EN

Stack Overflow用户
提问于 2010-04-23 21:14:39
回答 3查看 1.6K关注 0票数 0

比方说,在一个典型的大学数据库系统中,哪条SQL语句可以找到所有还没有学生注册的班级?(注册过程为10天,现在是第3天)。

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

详细信息:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-23 21:54:29

有一些基本技术可用于标识表A中不在表B中的记录。每种技术都有自己的优点,并且根据数据分布和数据量的不同,每种技术都可能表现良好,也可能表现不佳。此外,筛选列中出现的空值可能会导致不同的结果(尽管这似乎不太可能,但在问题中描述的特定场景中,这是一个考虑因素)。最后,并不是所有的SQL都支持所有这些语法。

最直接的可能是NOT IN:

代码语言:javascript
运行
复制
select *  
from   classes 
where id not in 
        (  select class_id 
           from registrations 
        ) 
/

接下来是相关的NOT EXISTS:

代码语言:javascript
运行
复制
select *  
from   classes 
where not exists 
        (  select null
           from registrations 
           where registrations.class_id = classes.id
        ) 
/

然后是反联接:

代码语言:javascript
运行
复制
select *  
from classes 
     full outer join registrations 
            on (classes.id = registrations.class_id )
where registrations.class_id is null 
/

最后是减号运算符:

代码语言:javascript
运行
复制
select id  
from classes 
minus
select class_id 
from registrations
/

这最后一个语法写起来相当快,但是很明显在细节上就失败了。如果我们想要更多来自类的列,这些列不在注册中,那么我们需要将其作为子查询提供给select on CLASSES。因此,它不像其他语法那样广泛适用,但在某些情况下很有用。

票数 3
EN

Stack Overflow用户

发布于 2010-04-23 21:17:36

以下是使用FULL OUTER JOIN的一种选择

代码语言:javascript
运行
复制
SELECT * 
FROM Class
  FULL OUTER JOIN StudentClass
   ON Class.Id = StudentClass.ClassId
WHERE StudentClass.ClassId IS NULL

还可以将子查询与NOT IN一起使用

代码语言:javascript
运行
复制
SELECT * 
FROM Class
WHERE Id NOT IN
(  SELECT ClassId
   FROM StudentClass
)
票数 2
EN

Stack Overflow用户

发布于 2010-04-23 21:17:52

您可以使用左连接,当没有要连接的内容时,它会保留在NULL中

代码语言:javascript
运行
复制
SELECT class
FROM classes c
    LEFT JOIN students s ON c.class = s.class
WHERE s.name IS NULL
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2698787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档