先决条件: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_ID在C_NAME“DSA”或“DBMS”入学,我们可以与独立的嵌套查询和运算符的帮助下把它写。从课程表中,我们可以找到C_ID为C_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”的STUDENT的S_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 提供。