English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
子查询或称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。
一个 SELECT 语句的查询结果能够作为另一个语句的输入值。
子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。
以下是子查询必须遵循的几个规则:
子查询必须用括号括起来。
子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。
子查询通常与 SELECT 语句一起使用。基本语法如下:
SELECT column_name[, column_name] FROM table1[, table2] WHERE column_name OPERATOR (SELECT column_name[, column_name]) FROM table1[, table2] [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 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 ]
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 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)
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
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)
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)