SQL子查询
子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中。
子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据。
子查询可以在SELECT,INSERT,UPDATE使用,而且随着运算符如DELETE语句 =, <, >, >=, <=, IN, BETWEEN 等.
这里有一些规则,子查询必须遵循:
-
子查询必须被圆括号括起来。
-
子查询只能在有一列的SELECT子句中,除非多个列中的子查询,以比较其选定列主查询。
-
ORDER BY不能在子查询中使用,主查询可以使用ORDER BY。GROUP BY可以用来在子查询中如ORDER BY执行相同的功能。
-
返回多于一个行子查询只能用于具有多个值运算符,如IN操作。
-
SELECT列表中不能包含到值计算到任何引用 BLOB, ARRAY, CLOB, 或NCLOB.
-
子查询不能立即封闭在一组函数。
-
BETWEEN 操作符不能与子查询使用;然而,操作符BETWEEN可以在子查询中使用。
子查询SELECT语句:
子查询最频繁使用的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语句使用从子查询返回的数据插入到另一个表中。在子查询中的所选择的数据可以与任何类型的字符,日期或数字函数进行修改。
其基本语法如下:
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]
示例:
考虑CUSTOMERS_BKP表的结构相似于CUSTOMERS表。考虑CUSTOMERS_BKP表的结构相似于CUSTOMERS表。
SQL> INSERT INTO CUSTOMERS_BKP SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM CUSTOMERS) ;
子查询的UPDATE语句:
子查询可以与UPDATE语句一起使用。单个或多个表中的列可以使用带有UPDATE语句子查询时被更新。
其基本语法如下:
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
示例:
假设,我们的CUSTOMERS_BKP表是CUSTOMERS表的备份。
下面的例子是在CUSTOMERS表更新0.25倍薪水,其年龄大于或等于27所有的客户:
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语句。
其基本语法如下:
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
示例:
假设,我们的CUSTOMERS_BKP表是CUSTOMERS表的备份。
下面的示例将删除CUSTOMERS表记录其年龄大于或等于27所有的客户:
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 | +----+----------+-----+---------+----------+