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

PostgreSQL 서브 쿼리

서브쿼리 또는 내부 쿼리, 중첩 쿼리는 PostgreSQL 쿼리의 WHERE 절에 포함된 쿼리 문을 의미합니다.

SELECT 문의 쿼리 결과는 다른 문의 입력 값으로 사용될 수 있습니다.

서브쿼리는 SELECT, INSERT, UPDATE, DELETE 문과 함께 사용할 수 있으며, =, <, >, >=, <=, IN, BETWEEN와 같은 연산자를 사용할 수 있습니다.

서브쿼리가 따라야 할 몇 가지 규칙은 다음과 같습니다:

  • 서브쿼리는 괄호로 감싸져야 합니다.

  • 서브쿼리는 SELECT 절에서 한 개의 열만 가져올 수 있으며, 메인 쿼리에서 여러 열이 있으면 서브쿼리의 선택된 열과 비교할 수 있습니다.

  • ORDER BY는 서브쿼리에서 사용할 수 없지만, 메인 쿼리에서는 사용할 수 있습니다. 서브쿼리에서 GROUP BY를 사용할 수 있으며, ORDER BY와 같은 기능을 가집니다.

  • 서브쿼리가 여러 행을 반환하면, IN 연산자와 같은 다중 값 연산자와 함께 사용해야 합니다.

  • BETWEEN 연산자는 서브쿼리와 함께 사용할 수 없지만, 서브쿼리 내에서 사용할 수 있습니다.

SELECT 문의 서브쿼리는

서브쿼리는 일반적으로 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
(7 rows)

이제, SELECT 문에서 서브쿼리를 사용해 보겠습니다:

w3codeboxdb=# 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로 변경됩니다. 지금 whole COMPANY 테이블을 COMPANY_BKP에 복사하면 다음과 같은 문법을 사용합니다:

w3codeboxdb=# 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 테이블에서 모든 AGE가大于 27 고객의 SALARY를 원래의 0 배로 업데이트합니다.50 배:

w3codeboxdb=# 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 테이블에서 모든 AGE가大于或等于 27 고객 기록:

w3codeboxdb=# 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)