Sql 简明教程

SQL - Sub Queries

SQL Subqueries

一个 SQL Subquery 是另一个查询中的SELECT查询。它也被称为 Inner queryNested query ,而包含它的查询是外部查询。

外部查询可以包含SELECT、INSERT、UPDATE和DELETE语句。我们可以将子查询用作列表达式,用作SQL子句中的条件,以及与操作符(如 =、>、<、>=、⇐、IN、BETWEEN等)结合使用。

Rules to be followed

以下是编写子查询时需要遵循的规则:

  1. 子查询必须用括号括起来。

  2. 子查询可以嵌套在另一个子查询中。

  3. 子查询必须始终包含SELECT查询和FROM子句。

  4. 子查询包含普通SELECT子句可以包含的所有子句:GROUP BY、WHERE、HAVING、DISTINCT、TOP/LIMIT等。但是,只有在指定TOP子句时才使用ORDER BY子句。它不能包含COMPUTE或FOR BROWSE子句。

  5. 子查询可以返回单个值、单行、单列或整个表。它们被称为标量子查询。

Subqueries with the SELECT Statement

子查询最常与SELECT语句一起使用。基本语法如下所示:

SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE  column_name
OPERATOR (SELECT column_name [,column_name ] FROM table1 [, table2 ] [WHERE]);

Example

在以下查询中,我们创建了一个名为 CUSTOMERS 的表:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

在这里,我们使用INSERT INTO语句向上面创建的表中插入记录:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

表格显示为 −

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Khilan

25

Delhi

1500.00

3

kaushik

23

Kota

2000.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00

现在让我们使用一个 SELECT 语句检查以下子查询。

SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500);

这将产生以下结果 -

ID

NAME

AGE

ADDRESS

SALARY

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

7

Muffy

24

Indore

10000.00

Subqueries with the INSERT Statement

我们还可以在 INSERT 语句中使用子查询。子查询返回的数据插入到另一个表中。

基本语法如下 −

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Example

在以下示例中,我们正在创建另一个表 CUSTOMERS_BKP,其结构与 CUSTOMERS 表类似 −

CREATE TABLE CUSTOMERS_BKP (
   ID INT NOT NULL,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

现在要将 CUSTOMERS 表的完整记录复制到 CUSTOMERS_BKP 表中,我们可以使用以下查询 −

INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS);

上面的查询生成以下输出 −

Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

Verification

使用 SELECT 语句,我们可以验证 CUSTOMERS 表中的记录是否已插入到 CUSTOMERS_BKP 表中 −

SELECT * FROM CUSTOMERS_BKP;

将显示以下形式的表 −

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

2000.00

2

Khilan

25

Delhi

1500.00

3

kaushik

23

Kota

2000.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

8500.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00

Subqueries with the UPDATE Statement

子查询还可以与 UPDATE 语句一起使用。你可以使用子查询更新表中的一个或多个列。

基本语法如下 −

UPDATE table
SET column_name = new_value
[WHERE OPERATOR [VALUE](SELECT COLUMN_NAME FROM TABLE_NAME [WHERE]);

Example

我们有可用的 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。以下示例将年龄大于或等于 27 的所有客户在 CUSTOMERS 表中的 SALARY 更新为 0.25 倍。

UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );

以下是以上查询的输出:

Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

Verification

这将影响两行,如果你使用如下所示的 SELECT 语句验证 CUSTOMERS 的内容。

SELECT * FROM CUSTOMERS;

将显示以下形式的表 −

ID

NAME

AGE

ADDRESS

SALARY

1

Ramesh

32

Ahmedabad

500.00

2

Khilan

25

Delhi

1500.00

3

kaushik

23

Kota

2000.00

4

Chaitali

25

Mumbai

6500.00

5

Hardik

27

Bhopal

2125.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00

Subqueries with the DELETE Statement

子查询也可以与 DELETE 语句一起使用;就像上面提到的任何其他语句一样。

基本语法如下 −

DELETE FROM TABLE_NAME
[WHERE OPERATOR [ VALUE ](SELECT COLUMN_NAME FROM TABLE_NAME)[WHERE)];

Example

我们有一个可用的 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。以下示例删除了年龄大于或等于 27 的所有客户的 CUSTOMERS 表中的记录。

DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );

上面的查询生成以下输出 −

OK, 2 rows affected (0.01 sec)

Verification

如果你使用如下所示的 SELECT 语句验证 CUSTOMERS 表的内容。

SELECT * FROM CUSTOMERS;

将显示以下形式的表 −

ID

NAME

AGE

ADDRESS

SALARY

2

Khilan

25

Delhi

1500.00

3

kaushik

23

Kota

2000.00

4

Chaitali

25

Mumbai

6500.00

6

Komal

22

Hyderabad

4500.00

7

Muffy

24

Indore

10000.00