PgSQL - Notas de estudio 17: Subconsulta

Tabla de contenido

Subconsulta PostgreSQL

Uso de subconsultas en la declaración SELECT

Uso de subconsultas en la declaración INSERT

Uso de subconsultas en la declaración ACTUALIZAR

Uso de subconsultas en la declaración DELETE


Subconsulta PostgreSQL

  • La subconsulta, también conocida como consulta interna o consulta anidada, se refiere a incrustar declaraciones de consulta en la cláusula WHERE de una consulta PostgreSQL.
  • Los resultados de la consulta de una declaración SELECT se pueden utilizar como valor de entrada de otra declaración.
  • Las subconsultas se pueden usar con declaraciones SELECT, INSERT, UPDATE y DELETE y pueden usar operadores como =, <, >, >=, <=, IN, BETWEEN, etc.

Aquí hay algunas reglas que deben seguir las subconsultas:

  • Las subconsultas deben estar 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 que se comparen con las columnas seleccionadas de la subconsulta.
  • ORDER BY no se puede utilizar en subconsultas, aunque ORDER BY se puede utilizar en la consulta principal.
  • GROUP BY se puede utilizar en subconsultas y tiene la misma función que ORDER BY.
  • Las subconsultas devuelven más de una fila y solo se pueden usar con operadores multivalor, como el operador IN.
  • El operador BETWEEN no se puede utilizar con subconsultas; sin embargo, BETWEEN se puede utilizar dentro de una subconsulta.

Uso de subconsultas en la declaración SELECT

Las subconsultas se utilizan a menudo con declaraciones 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])

Uso de subconsultas en la declaración INSERT

Las subconsultas también se pueden utilizar con declaraciones INSERT. La instrucción INSERT se inserta en otra tabla utilizando los datos devueltos por la subconsulta.

Los datos seleccionados en la subconsulta se pueden modificar mediante cualquier carácter, fecha o función numérica. La sintaxis básica es la siguiente:

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

Uso de subconsultas en la declaración ACTUALIZAR

Las subconsultas se pueden utilizar junto con declaraciones ACTUALIZAR. Cuando se utiliza una subconsulta a través de la instrucción UPDATE, se actualizan una o varias columnas de la tabla. La sintaxis básica es la siguiente:

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

Uso de subconsultas en la declaración DELETE

Las subconsultas se pueden utilizar junto con la declaración DELETE, al igual que las otras declaraciones mencionadas anteriormente. La sintaxis básica es la siguiente:

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

Ejemplo:

mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(8 行记录)

/*1、在 SELECT 语句中使用子查询:*/
mydb=# SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY  WHERE SALARY > 45000) ;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  5 | David |  27 | South-Hall                                         |  85000 |
(1 行记录)

/*假设 COMPANY1 的结构与 COMPANY 表相似,且可使用相同的 CREATE TABLE 进行创建,只是表名改为 COMPANY1。*/
/*2、现在把整个 COMPANY 表复制到 COMPANY1,语法如下:*/
mydb=# INSERT INTO COMPANY1 SELECT * FROM COMPANY  WHERE ID IN (SELECT ID FROM COMPANY) ;
INSERT 0 8

/*假设,我们有 COMPANY1 表,是 COMPANY 表的备份。*/
/*2、下面的实例把 COMPANY 表中所有 AGE 大于 27 的客户的 SALARY 更新为原来的 0.50 倍:*/
mydb=# UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY1 WHERE AGE >= 27 );
UPDATE 4
mydb=# select * from company1;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  3 | Teddy |  23 | Norway                                             |  20000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
  1 | Paul  |  32 | California                                         |  10000 |
  5 | David |  27 | South-Hall                                         |  42500 |
  9 | James |  44 | Norway                                             |   2500 |
 10 | James |  45 | Texas                                              |   2500 |
(8 行记录)

/*假设,我们有 COMPANY_BKP 表,是 COMPANY 表的备份。/*
/*4、下面的实例删除 COMPANY 表中所有 AGE 大于或等于 27 的客户记录:*/
mydb=# DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY1 WHERE AGE > 27 );
DELETE 3
mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  5 | David |  27 | South-Hall                                         |  21250 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(5 行记录)

Supongo que te gusta

Origin blog.csdn.net/qq_41361442/article/details/124867527
Recomendado
Clasificación