位置:首頁 > 數據庫 > PostgreSQL教學 > PostgreSQL子查詢

PostgreSQL子查詢

在另一個PostgreSQL查詢子查詢或內部查詢或嵌套查詢是查詢,並嵌入在WHERE子句中。

使用子查詢返回的數據將被用來在主查詢中作為條件,以進一步限製要檢索的數據。

可以使用子查詢的有SELECT,INSERT,UPDATE和DELETE語句,與運算符如=,<,>,>=,<=,IN等一起使用。

有幾個子查詢必須遵循的規則:

  • 必須用括號括起來的子查詢。

  • 子查詢隻能有一個在SELECT子句中的列,除非多列在主查詢的查詢來比較其選定的列。

  • ORDER BY不能使用在子查詢中,雖然主查詢就可以使用ORDER BY。GROUP BY可以用來執行相同的功能在子查詢中的ORDER BY。

  • 子查詢返回多於一行隻能用於使用多值的運算符,如為IN,EXISTS,IN,ANY / SOME,ALL運算符。

  • 之間的運算符不能用子查詢,然而,之間可以在子查詢中使用。

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_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表中的工資為原來的0.50倍,所有的客戶其年齡大於或等於27:

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 表刪除記錄其年齡大於或等於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)