子查询或内部查询或嵌套查询是另一个SQL查询中的查询,并嵌入在WHERE子句中.
子查询用于返回将在主查询作为进一步限制要检索的数据的条件.
子查询可以与SELECT,INSERT,UPDATE和DELETE语句以及=,<之类的运算符一起使用, >,> =,< =,IN,BETWEEN等.
子查询必须遵循以下几条规则;
子查询必须括在括号内.
子查询在SELECT中只能有一列子句,除非子查询的主查询中有多列用于比较其所选列.
ORDER BY命令不能在子查询中使用,尽管主查询可以使用ORDER BY. GROUP BY命令可用于执行与子查询中的ORDER BY相同的功能.
返回多行的子查询只能用于多个值运算符,例如IN运算符.
SELECT列表不能包含对计算为BLOB,ARRAY,CLOB或NCLOB的值的任何引用./p>
子查询不能立即包含在集合函数中.
BETWEEN运算符不能与子查询一起使用.但是,BETWEEN运算符可以在子查询中使用.
子查询最常与SELECT语句一起使用.基本语法如下 :
SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])
考虑CUSTOMERS表有以下记录 :
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
现在,让我们用SELECT语句检查以下子查询.
SQL> 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 | +----+----------+-----+---------+----------+
子查询也可以与INSERT语句一起使用. INSERT语句使用从子查询返回的数据插入另一个表.子查询中的选定数据可以使用任何字符,日期或数字函数进行修改.
基本语法如下.
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]
考虑一个表CUSTOMERS_BKP,其结构与CUSTOMERS表类似.现在要将完整的CUSTOMERS表复制到CUSTOMERS_BKP表中,您可以使用以下语法.
SQL> INSERT INTO CUSTOMERS_BKP SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS) ;
子查询可以与UPDATE语句一起使用.使用带有UPDATE语句的子查询时,可以更新表中的单列或多列.
基本语法如下.
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
假设我们有可用的CUSTOMERS_BKP表,它是CUSTOMERS表的备份.对于AGE大于或等于27的所有客户,以下示例在CUSTOMERS表中将SALARY更新0.25次.
SQL> UPDATE CUSTOMERS SET SALARY = SALARY * 0.25 WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );
这会影响两行,最后CUSTOMERS表会有以下记录.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 125.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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
子查询可以与DELETE语句一起使用,就像任何其他语句一样上面提到过.
基本语法如下.
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
假设我们有一个CUSTOMERS_BKP表,它是CUSTOMERS表的备份.以下示例为AGE大于或等于27的所有客户删除CUSTOMERS表中的记录.
SQL> DELETE FROM CUSTOMERS WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 );
这会影响两行,最后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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+---------+----------+