这里是SQL初学者,在我的大学课程中,我们有以下模式。
学生(snum:整数,sname:字符串,专业:字符串,级别:字符串,年龄:整数)
类(名称:字符串,meets_at:字符串,房间:字符串,fid:整数)
已注册(snum:整数,cname:字符串)
教员(fid:整数,fname:字符串,deptid:整数)
其中一个练习如下:
找出同时参加两个班的所有学生的名字。
下面是它的SQL语句
SELECT DISTINCT S.SNAME
FROM STUDENT S
WHERE S.SNUM IN (SELECT E1.SNUM
FROM ENROLLED E1, ENROLLED E2, CLASS C1, CLASS C2
WHERE E1.SNUM = E2.SNUM AND E1.CNAME <> E2.CNAME
AND E1.CNAME = C1.NAME
AND E2.CNAME = C2.NAME AND
C1.MEETS_AT = C2.MEETS_AT);
在我的子问题中,为什么要使用注册关系和类关系的两个副本。
子查询两次引用注册
表,因为它需要检索注册了不止一次的学生;类
两次,因为它只需要检索注册了不止一个类的学生。
考虑一个更简单的查询:
select C1.NAME, C2.NAME
from CLASS C1, CLASS C2
where C1.MEETS_AT = C2.MEETS_AT
and C1.NAME <> C2.NAME;
这将为您提供同时开会的课程列表。有必要将整个类集合与自身进行比较,寻找那些在时间具有相同的集合的类。最后一行排除了同名的类。
您的子查询为同时参加多个课程的学生检索学生编号列表:
SELECT E1.SNUM
FROM ENROLLED E1,
ENROLLED E2,
CLASS C1,
CLASS C2
WHERE E1.SNUM = E2.SNUM -- the same student has enrolled twice
AND E1.CNAME <> E2.CNAME -- the enrollments are for difference classes
AND E1.CNAME = C1.NAME -- join the class table as C1 for the first enrollment
AND E2.CNAME = C2.NAME -- join the class table as C2 for the second enrollment
AND C1.MEETS_AT = C2.MEETS_AT -- match the start times for the two enrolled classes
出于兴趣,ANSI SQL的等价物是:
select E1.SNUM
from ENROLLED E1
inner join ENROLLED E2 on E1.SNUM = E2.SNUM
inner join CLASS C1 on E1.CNAME = C1.NAME
inner join CLASS C2 on E2.CNAME = C2.NAME
where E1.CNAME <> E2.CNAME
and C1.MEETS_AT = C2.MEETS_AT
和Siyual一样,我更喜欢ANSI版本,但如果你们大学的教学方式是旧的,我建议你们现在就坚持。它同样有效,很多人仍在使用它。一旦你理解了这些概念,你就可以选择你的偏好了。
表被声明两次的原因是为了比较同一查询中的表。
您必须有两个表的副本才能将表与自身进行比较。
您的查询正在查看E1,并将其与E2进行对比,其中StudentNumber相同,但类名不同。
然后它查看C1表和C2表,找到类的名称。。。然后看看全班同学是否在同一地点见面。
需要两个表的原因是不能在同一个查询中对E1进行两次比较。无法在单个查询中对照同一列的其他行检查行1。
我正在检查Angular Bootstrap UI,特别是服务并注意到一件有趣的事情。 在他们的示例中,'http://plnkr.co/edit/e5xykpqwytsljua6fxwt?p=preview',在附加到弹出窗口的控制器中,他们将选定的项包含到另一个内部属性中 为什么需要这个?JavaScript找到了什么? THX
本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使
我在这里(有点)了解jdk 5 Reentry antLock的功能 但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?
问题内容: 我的问题就像标题说的那样:为什么我们需要9个补丁的图像?他们真的那么重要吗?其实,他们真正在做什么?我没有清楚地了解9色块图像的概念。 我知道9补丁图像是可伸缩的。因此,假设我有一些完全适合我的ldpi设备的图像按钮。使用Draw 9-patch工具(android SDK的一部分),我可以标记可缩放区域,并且该图像非常适合hdpi甚至xhdpi设备。边缘会很光滑。 但这真的是很好的实
问题内容: 如果我们使用ExecutorCompletionService,则可以将一系列任务作为s 提交,并将结果作为进行交互。 但也有在的,它接受一个任务,我们得到的名单,以检索结果。 据我所知,使用一个或多个都不会有任何好处(除了我们避免使用循环,否则我们将不得不对任务进行操作),并且基本上它们是相同的想法,只是稍有不同。 那么,为什么有两种不同的方式提交一系列任务呢?我在性能上正确吗?有没