子查询

收藏928

阅读10263

更新时间2025-08-21

子查询或内部查询或嵌套查询是另一个 PostgreSQL 查询中的查询并嵌入在 WHERE 子句中。

子查询用于返回将在主查询中使用的数据,作为进一步限制要检索的数据的条件。

子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句以及 =, <, >, >=, <=, IN, 等运算符一起使用。

子查询必须遵循一些规则 −

  • 子查询必须用括号括起来。

  • 一个子查询在 SELECT 子句中只能有一个列,除非主查询中有多个列,以便子查询比较其选定的列。

  • ORDER BY 不能在子查询中使用,尽管主查询可以使用 ORDER BY。 GROUP BY 可用于执行与子查询中的 ORDER BY 相同的功能。

  • 返回多于一行的子查询只能与多值运算符一起使用,例如 IN、EXISTS、NOT IN、ANY/SOME、ALL 运算符。

  • 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])

示例

考虑具有以下记录的 COMPANY 表 −

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

现在,让我们使用 SELECT 语句检查以下子查询 −

testdb=# SELECT *
   FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY
      WHERE SALARY > 45000) ;

这将产生以下结果 −

 id | name  | age |  address    | salary
----+-------+-----+-------------+--------
  4 | Mark  |  25 | Rich-Mond   |  65000
  5 | David |  27 | Texas       |  85000
(2 rows)

带有 INSERT 语句的子查询

子查询也可以与 INSERT 语句一起使用。 INSERT 语句使用从子查询返回的数据插入到另一个表中。 可以使用任何字符、日期或数字函数来修改子查询中的选定数据。

基本语法如下 −

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

示例

考虑一个 COMPANY_BKP 表,它具有与 COMPANY 表类似的结构,并且可以使用相同的 CREATE TABLE 创建,使用 COMPANY_BKP 作为表名。 现在,要将完整的 COMPANY 表复制到 COMPANY_BKP 中,语法如下 −

testdb=# INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY) ;

带有 UPDATE 语句的子查询

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

基本语法如下 −

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

示例

假设我们有 COMPANY_BKP 表可用,它是 COMPANY 表的备份。

以下示例将 COMPANY 表中 AGE 大于或等于 27 的所有客户的 SALARY 更新 0.50 倍 −

testdb=# UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

这将影响两行,最后 COMPANY 表将具有以下记录 −

 id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  1 | Paul  |  32 | California  |  10000
  5 | David |  27 | Texas       |  42500
(7 rows)

带有 DELETE 语句的子查询

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

基本语法如下 −

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

示例

假设我们有 COMPANY_BKP 表可用,它是 COMPANY 表的备份。

以下示例从 COMPANY 表中删除 AGE 大于或等于 27 的所有客户的记录 −

testdb=# DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE > 27 );

这将影响两行,最后 COMPANY 表将具有以下记录 −

 id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  5 | David |  27 | Texas       |  42500
(6 rows)

相关

视频

RELATED VIDEOS

更多

免费

phpStudy极速入门视频教程

免费

Midjourney基础课程
初级 Midjourney基础课程

11149次学习

收藏

免费

极客学院Git使用视频教程

免费

尚观shell视频教程
高级 尚观shell视频教程

15709次学习

收藏

免费

尚观Linux入门视频教程
初级 尚观Linux入门视频教程

42887次学习

收藏

免费

尚观Linux初级视频教程
初级 尚观Linux初级视频教程

40264次学习

收藏

免费

尚观Linux中级视频教程
中级 尚观Linux中级视频教程

48298次学习

收藏

免费

尚观Linux高级视频教程
高级 尚观Linux高级视频教程

41982次学习

收藏

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号