📜  SQL 中的嵌套查询

📅  最后修改于: 2021-09-10 02:09:46             🧑  作者: Mango

先决条件:SQL 基础

在嵌套查询中,查询写在查询中。内部查询的结果用于执行外部查询。我们将使用STUDENT、COURSE、STUDENT_COURSE表来理解嵌套查询。

学生

S_ID S_NAME S_ADDRESS S_PHONE S_AGE
S1 RAM DELHI 9455123451 18
S2 RAMESH GURGAON 9652431543 18
S3 SUJIT ROHTAK 9156253131 20
S4 SURESH DELHI 9156768971 18

课程

C_ID C_NAME
C1 DSA
C2 Programming
C3 DBMS

STUDENT_COURSE

S_ID C_ID
S1 C1
S1 C3
S2 C1
S3 C2
S4 C2
S4 C3

主要有两种类型的嵌套查询:

  • 独立嵌套查询:

在独立嵌套查询中,查询执行从最内层查询到最外层查询。内查询的执行独立于外查询,但内查询的结果用于外查询的执行。 IN、NOT IN、ANY、ALL 等各种运算符用于编写独立的嵌套查询。

IN:如果我们要找出谁S_IDC_NAME“DSA”或“DBMS”入学,我们可以与独立的嵌套查询和运算符的帮助下把它写。从课程表中,我们可以找到C_IDC_NAME“DSA”或DBMS”,我们可以使用这些C_ID s,从STUDENT_COURSE表发现S_ID秒。

步骤 1:C_NAME =’DSA’ 或 ‘DBMS’ 查找C_ID

COURSE中选择C_ID ,其中C_NAME = ‘DSA’ 或C_NAME = ‘DBMS’

步骤2:使用步骤C_ID 1的查找S_ID

STUDENT_COURSE中选择S_ID ,其中C_ID IN

(SELECT C_ID from COURSE where C_NAME = ‘DSA’ or C_NAME =’DBMS’);

内部查询将返回一个包含成员 C1 和 C3 的集合,外部查询将返回那些C_ID等于集合中任何成员(在本例中为 C1 和 C3)的S_ID 。因此,它将返回 S1、S2 和 S4。

注意:如果我们想找出已经注册了“DSA”或“DBMS”的STUDENT的名字,可以这样做:

STUDENT中选择 S_NAME,其中S_ID IN

(从STUDENT_COURSE中选择S_ID ,其中C_ID IN

(SELECT C_ID from COURSE where C_NAME =’DSA’ or C_NAME =’DBMS’);

NOT IN:如果我们想找出既没有注册过“DSA”也没有注册过“DBMS”的STUDENTS_ID ,可以这样做:

STUDENT中选择S_ID ,其中S_ID NOT IN

(从STUDENT_COURSE中选择S_ID ,其中C_ID IN

(SELECT C_ID from COURSE where C_NAME =’DSA’ or C_NAME =’DBMS’);

最里面的查询将返回一个包含成员 C1 和 C3 的集合。第二个内部查询将返回那些C_ID等于集合中任何成员(在本例中为 C1 和 C3)的S_ID ,即 S1、S2 和 S4。最外面的查询将返回那些S_ID s,其中S_ID不是集合的成员(S1、S2 和 S4)。所以它会返回S3。

  • 相关嵌套查询:

在相关嵌套查询中,内部查询的输出取决于外部查询中当前正在执行的行。例如;如果我们要找出学生小号谁在C_ID“C1”就读的S_NAME,它可以与合作相关的嵌套查询作为的帮助来完成:

STUDENT S where EXISTS 中选择 S_NAME

( select * from STUDENT_COURSE SC where S.S_ID = SC.S_ID and SC.C_ID =’C1′);

对于STUDENT S 的每一行,它将从STUDENT_COURSE 中找到 S. S_ID = SC 的行。 S_ID和 SC。 C_ID =’C1’。如果对于来自STUDENT S 的S_ID ,在STUDENT_COURSE SC 中至少存在一行且C_ID =’C1’,则内部查询将返回 true,相应的S_ID将作为输出返回。

本文由 Sonal Tuteja 提供。