PostgreSQL - Subconsultas

Una subconsulta o consulta interna o consulta anidada es una consulta dentro de otra consulta de PostgreSQL e incrustada dentro de la cláusula WHERE.

Una subconsulta se utiliza para devolver datos que se utilizarán en la consulta principal como condición para restringir aún más los datos que se recuperarán.

Las subconsultas se pueden usar con las sentencias SELECT, INSERT, UPDATE y DELETE junto con los operadores como =, <,>,> =, <=, IN, etc.

Hay algunas reglas que las subconsultas deben seguir:

  • Las subconsultas deben ir entre paréntesis.

  • Una subconsulta solo puede tener una columna en la cláusula SELECT, a menos que haya varias columnas en la consulta principal para que la subconsulta compare sus columnas seleccionadas.

  • Un ORDER BY no se puede usar en una subconsulta, aunque la consulta principal puede usar un ORDER BY. GROUP BY se puede utilizar para realizar la misma función que ORDER BY en una subconsulta.

  • Las subconsultas que devuelven más de una fila solo se pueden usar con operadores de valor múltiple, como el operador IN, EXISTS, NOT IN, ANY / SOME, ALL.

  • El operador BETWEEN no se puede utilizar con una subconsulta; sin embargo, BETWEEN se puede utilizar dentro de la subconsulta.

Subconsultas con la instrucción SELECT

Las subconsultas se utilizan con mayor frecuencia con la instrucción SELECT. La sintaxis básica es la siguiente:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Ejemplo

Considere la tabla EMPRESA que tiene los siguientes registros:

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)

Ahora, verifiquemos la siguiente subconsulta con la instrucción SELECT:

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

Esto produciría el siguiente resultado:

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

Subconsultas con la instrucción INSERT

Las subconsultas también se pueden usar con instrucciones INSERT. La instrucción INSERT utiliza los datos devueltos por la subconsulta para insertarlos en otra tabla. Los datos seleccionados en la subconsulta se pueden modificar con cualquiera de las funciones de carácter, fecha o número.

La sintaxis básica es la siguiente:

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

Ejemplo

Considere una tabla COMPANY_BKP, con una estructura similar a la tabla COMPANY y se puede crear usando la misma CREATE TABLE usando COMPANY_BKP como el nombre de la tabla. Ahora, para copiar la tabla COMPAÑÍA completa en COMPANY_BKP, la siguiente es la sintaxis:

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

Subconsultas con la instrucción UPDATE

La subconsulta se puede utilizar junto con la instrucción UPDATE. Se pueden actualizar una o varias columnas en una tabla cuando se usa una subconsulta con la instrucción UPDATE.

La sintaxis básica es la siguiente:

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

Ejemplo

Suponiendo que tenemos la tabla COMPANY_BKP disponible, que es una copia de seguridad de la tabla COMPANY.

El siguiente ejemplo actualiza SALARIO 0.50 veces en la tabla EMPRESA para todos los clientes, cuya EDAD es mayor o igual a 27 -

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

Esto afectaría a dos filas y finalmente la tabla EMPRESA tendría los siguientes registros:

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)

Subconsultas con la instrucción DELETE

La subconsulta se puede usar junto con la instrucción DELETE como con cualquier otra instrucción mencionada anteriormente.

La sintaxis básica es la siguiente:

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

Ejemplo

Suponiendo que tenemos la tabla COMPANY_BKP disponible, que es una copia de seguridad de la tabla COMPANY.

El siguiente ejemplo elimina registros de la tabla EMPRESA para todos los clientes, cuya EDAD es mayor o igual a 27 -

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

Esto afectaría a dos filas y finalmente la tabla EMPRESA tendría los siguientes registros:

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)