SQL |子查询
在 SQL 中,子查询可以简单地定义为另一个查询中的查询。换句话说,我们可以说子查询是嵌入在另一个 SQL 查询的 WHERE 子句中的查询。
子查询的重要规则:
- 您可以将子查询放在多个 SQL 子句中:WHERE 子句、HAVING 子句、FROM 子句。
子查询可以与 SELECT、UPDATE、INSERT、DELETE 语句以及表达式运算符一起使用。它可以是相等运算符或运算符,例如 =、>、=、<= 和 Like运算符。 - 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。
- 子查询一般先执行,其输出用于完成主查询或外查询的查询条件。
- 子查询必须用括号括起来。
- 子查询位于运算符的右侧。
- ORDER BY 命令不能在子查询中使用。 GROUPBY 命令可用于执行与 ORDER BY 命令相同的函数。
- 将单行运算符与单行子查询一起使用。对多行子查询使用多行运算符。
句法:
子查询没有任何通用语法。但是,可以看到子查询最常与 SELECT 语句一起使用,如下所示:
SELECT column_name
FROM table_name
WHERE column_name expression operator
( SELECT COLUMN_NAME from TABLE_NAME WHERE ... );
样品表:
数据库
NAME | ROLL_NO | LOCATION | PHONE_NUMBER |
---|---|---|---|
Ram | 101 | Chennai | 9988775566 |
Raj | 102 | Coimbatore | 8877665544 |
Sasi | 103 | Madurai | 7766553344 |
Ravi | 104 | Salem | 8989898989 |
Sumathi | 105 | Kanchipuram | 8989856868 |
学生
NAME | ROLL_NO | SECTION |
---|---|---|
Ravi | 104 | A |
Sumathi | 105 | B |
Raj | 102 | A |
示例查询
:
- 显示 DATABASE 表中部分为 A 的学生的 NAME、LOCATION、PHONE_NUMBER
Select NAME, LOCATION, PHONE_NUMBER from DATABASE WHERE ROLL_NO IN (SELECT ROLL_NO from STUDENT where SECTION=’A’);
解释:第一个子查询执行“SELECT ROLL_NO from STUDENT where SECTION='A'”从 SECTION 为'A'的 STUDENT 表返回 ROLL_NO。然后外查询执行它并从学生的 DATABASE 表中返回 NAME、LOCATION、PHONE_NUMBER从内部子查询返回其 ROLL_NO。
输出:NAME ROLL_NO LOCATION PHONE_NUMBER Ravi 104 Salem 8989898989 Raj 102 Coimbatore 8877665544 - 插入查询示例:
表 1:学生 1
NAME ROLL_NO LOCATION PHONE_NUMBER Ram 101 chennai 9988773344 Raju 102 coimbatore 9090909090 Ravi 103 salem 8989898989 表 2:学生 2
NAME ROLL_NO LOCATION PHONE_NUMBER Raj 111 chennai 8787878787 Sai 112 mumbai 6565656565 Sri 113 coimbatore 7878787878 要将 Student2 插入 Student1 表:
INSERT INTO Student1 SELECT * FROM Student2;
输出:
NAME ROLL_NO LOCATION PHONE_NUMBER Ram 101 chennai 9988773344 Raju 102 coimbatore 9090909090 Ravi 103 salem 8989898989 Raj 111 chennai 8787878787 Sai 112 mumbai 6565656565 Sri 113 coimbatore 7878787878 - 从 Student2 表中删除其 rollno 与 Student1 表中相同且位置为 chennai 的学生
DELETE FROM Student2 WHERE ROLL_NO IN ( SELECT ROLL_NO FROM Student1 WHERE LOCATION = ’chennai’);
输出:
1 row delete successfully.
显示 Student2 表:
NAME ROLL_NO LOCATION PHONE_NUMBER Sai 112 mumbai 6565656565 Sri 113 coimbatore 7878787878 - 将学生的名字更新为 Student2 表中的极客,其位置与 Student1 表中的 Raju、Ravi 相同
UPDATE Student2 SET NAME=’geeks’ WHERE LOCATION IN ( SELECT LOCATION FROM Student1 WHERE NAME IN (‘Raju’,’Ravi’));
输出:
1 row updated successfully.
显示 Student2 表:
NAME ROLL_NO LOCATION PHONE_NUMBER Sai 112 mumbai 6565656565 geeks 113 coimbatore 7878787878