English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Sottoclausola SQL PostgreSQL

子查询或称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。

一个 SELECT 语句的查询结果能够作为另一个语句的输入值。

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

以下是子查询必须遵循的几个规则:

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

  • 子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。

  • ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。

  • 子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。

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

[ WHERE ) ]

创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:

w3codeboxdb# select * from 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
1 | Paul | 32 | California | 10000

Ora, utilizziamo la sottoquery nell'istruzione SELECT:

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

I risultati ottenuti sono i seguenti:

 id | name | age | address | salary
id | name | age | address | salary
  3 | Teddy | 23 | Norway | 20000
  5 | David | 27 | Texas | 85000
(2 righe)

La sottoquery utilizzata nell'istruzione INSERT

La sottoquery può anche essere utilizzata insieme all'istruzione INSERT. I dati restituiti dalla sottoquery dell'istruzione INSERT vengono inseriti in un'altra tabella.

I dati selezionati nella sottoquery possono essere modificati con qualsiasi funzione di carattere, data o numero.

La subquery può essere combinata con la statement DELETE, come menzionato nelle altre statement.

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

[ WHERE ) ]

Supponiamo che la struttura di COMPANY_BKP sia simile a quella di COMPANY e possa essere creata utilizzando lo stesso CREATE TABLE, ma con il nome della tabella cambiato in COMPANY_BKP. Ora copiamo l'intera tabella COMPANY in COMPANY_BKP, la sintassi è la seguente:

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

La sottoquery utilizzata nell'istruzione UPDATE

La sottoquery può essere utilizzata insieme all'istruzione UPDATE. Quando si utilizza una sottoquery con l'istruzione UPDATE, una o più colonne della tabella vengono aggiornate.

La subquery può essere combinata con la statement DELETE, come menzionato nelle altre statement.

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

[ WHERE ) ]

Esempio online

下面的示例把 COMPANY 表中所有 AGE 大于 27 的客户的 SALARY 更新为原来的 0.50 倍:

Di seguito è riportato un esempio di aggiornamento del SALARY di tutti i clienti con AGE maggiore di 27 nella tabella COMPANY a 0.50 volte il valore originale:

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

 Questo influenzerà due righe, l'ultimo record nella tabella COMPANY è il seguente:
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
  w3codeboxdb=# UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27);
  7 | James | 24 | Houston | 10000
1 | Paul | 32 | California | 10000

(7 righe)

La subquery utilizzata nella statement DELETE

La subquery può essere combinata con la statement DELETE, come menzionato nelle altre statement.

Sintassi di base:
DELETE FROM TABLE_NAME
   [ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)

[ WHERE ) ]

Esempio online

Supponiamo di avere una tabella COMPANY_BKP, che è una copia di backup della tabella COMPANY.

Di seguito è riportato un esempio di eliminazione di tutti i record dei clienti con AGE maggiore o uguale a 27 nella tabella COMPANY:

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

 Questo influenzerà due righe, l'ultimo record nella tabella COMPANY è il seguente:
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
(6 righe)