SQL子查询

SQL子查询

子查询是另一个SQL查询中的查询,并嵌入在WHERE子句中。

重要规则:

  • 子查询可以放在许多SQL子句中,如WHERE子句,FROM子句,HAVING子句。
  • 可以将子查询与SELECTUPDATEINSERTDELETE语句以及=<>> =<=INBETWEEN等运算符一起使用。
  • 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。
  • 子查询位于比较运算符的右侧。
  • 子查询括在括号中。
  • 在子查询中,不能使用ORDER BY命令。 但GROUP BY命令可用于执行与ORDER BY命令相同的功能。

1.带有Select语句的子查询

SQL子查询最常与Select语句一起使用。

语法

SELECT column_name  
FROM table_name  
WHERE column_name expression operator   
( SELECT column_name  from table_name WHERE ... );

示例

假设EMPLOYEE表有以下记录:

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
4 Alina 29 UK 6500.00
5 Kathrin 34 Bangalore 8500.00
6 Harry 42 China 4500.00
7 Jackson 25 Mizoram 10000.00

带有SELECT语句的子查询将是:

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

这将产生以下结果:

ID NAME AGE ADDRESS SALARY
4 Alina 29 UK 6500.00
5 Kathrin 34 Bangalore 8500.00
7 Jackson 25 Mizoram 10000.00

2.带有INSERT语句的子查询

SQL子查询也可以与Insert语句一起使用。 在insert语句中,子查询返回的数据用于插入另一个表。
在子查询中,可以使用任何字符,日期函数修改所选数据。

语法:

INSERT INTO table_name (column1, column2, column3....)   
SELECT *  
FROM table_name  
WHERE VALUE OPERATOR

示例

假设有一个与EMPLOYEE类似的表EMPLOYEE_BKP。现在使用以下语法将完整的EMPLOYEE表复制到EMPLOYEE_BKP表中。

INSERT INTO EMPLOYEE_BKP  
   SELECT * FROM EMPLOYEE   
   WHERE ID IN (SELECT ID   
   FROM EMPLOYEE);

3.带有UPDATE语句的子查询

SQL的子查询可以与Update语句一起使用。 当子查询与Update语句一起使用时,可以更新表中的单个列或多个列。

语法

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

示例

假设有一个EMPLOYEE_BKP表,它是EMPLOYEE表的备份。要在EMPLOYEE表中为所有AGE大于或等于29的员工更新SALARY值更新增加 0.25 倍。

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

上面命令将影响三行,最后,EMPLOYEE表的记录更新为如下。

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
4 Alina 29 UK 1625.00
5 Kathrin 34 Bangalore 2125.00
6 Harry 42 China 1125.00
7 Jackson 25 Mizoram 10000.00

4.带有DELETE语句的子查询

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

语法

DELETE FROM TABLE_NAME  
WHERE VALUE OPERATOR  
   (SELECT COLUMN_NAME  
   FROM TABLE_NAME  
   WHERE condition);

示例

假设有一张EMPLOYEE_BKP表,它是EMPLOYEE表的备份。要从EMPLOYEE表中删除AGE大于或等于29的所有记录。参考以下语句 -

DELETE FROM EMPLOYEE  
   WHERE AGE IN (SELECT AGE FROM EMPLOYEE_BKP  
      WHERE AGE >= 29 );

这将影响三行,最后,EMPLOYEE表将具有以下记录。

ID NAME AGE ADDRESS SALARY
1 John 20 US 2000.00
2 Stephan 26 Dubai 1500.00
3 David 27 Bangkok 2000.00
7 Jackson 25 Mizoram 10000.00

目录

索引和B+树