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

SQLite 서브 쿼리

서브쿼리 또는 내부 쿼리 또는 내장 쿼리는 다른 SQLite 쿼리 내에서 WHERE 절에 내장된 쿼리입니다.

서브쿼리는 주 쿼리에서 사용할 데이터를 반환하며, 검색할 데이터를 추가로 제한하는 조건으로 사용됩니다.

서브쿼리는 SELECT, INSERT, UPDATE, DELETE 문 및 =, <, >, >=, <=, IN, BETWEEN 등 연산자와 함께 사용할 수 있습니다.

서브쿼리에 대해 따를 수 있는 몇 가지 규칙이 있습니다-

  • 서브쿼리는 괄호안에 위치해야 합니다.

  • 서브쿼리는 SELECT 절에서 한 개의 열만 가져올 수 있습니다.除非主查询中有多个 columns供子查询比较其选定的 columns.

  • 虽然主查询可以使用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])

예제

다음과 같은 기록을 가진 COMPANY 테이블.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           알렌       25          텍사스       15000.0
3           테디       23          노르웨이      20000.0
4           마크        25          리치-몬드   65000.0
5           대비드       27          텍사스       85000.0
6           김         22          서드-할  45000.0
7           제임스       24          휴스턴     10000.0

이제 SELECT 문을 사용하여 다음 서브쿼리를 확인해 보겠습니다.

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000) ;

이는 다음과 같은 결과를 만들어냅니다.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           마크        25          리치-몬드   65000.0
5           대비드       27          텍사스       85000.0

INSERT 문과 함께 사용된 서브쿼리

서브쿼리도 INSERT 문과 함께 사용될 수 있습니다. INSERT 문은 서브쿼리로부터 반환된 데이터를 다른 테이블에 삽입합니다. 서브쿼리에서 선택된 데이터를 문자, 날짜, 숫자 기능으로 수정할 수 있습니다.

아래는 기본 문법입니다:-

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

예제

COMPANY_BKP 테이블을 고려해 보겠습니다. 이 테이블은 COMPANY 테이블과 구조가 유사하며, COMPANY_BKP를 테이블 이름으로 사용할 수 있습니다. COMPANY 테이블을 COMPANY_BKP에 완전히 복사하려면 다음 문법을 사용하십시오:-

sqlite> 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 테이블의 백업입니다.

아래의 예제는 AGE가27세의 모든 고객의 급여를 0으로 업데이트.50배.

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

이는 두 행에 영향을 미치며, 마지막 COMPANY 테이블은 다음과 같은 기록을 가질 것입니다-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           알렌       25          텍사스       15000.0
3           테디       23          노르웨이      20000.0
4           마크        25          리치-몬드   65000.0
5           대비드       27          텍사스       42500.0
6           김         22          서드-할  45000.0
7           제임스       24          휴스턴     10000.0

DELETE 문과 함께 사용된 서브쿼리

서브쿼리는 DELETE 문과 함께 사용될 수 있습니다. 위에서 언급된 다른 문장과 마찬가지로.

아래는 기본 문법입니다:-

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

예제

COMPANY_BKP 테이블이 사용 가능하다고 가정해 보겠습니다. 이 테이블은 COMPANY 테이블의 백업입니다.

아래의 예제는 AGE가27의 모든 고객의 기록.

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

이는 두 행에 영향을 미치며, 마지막 COMPANY 테이블은 다음과 같은 기록을 가질 것입니다-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           알렌       25          텍사스       15000.0
3           테디       23          노르웨이      20000.0
4           마크        25          리치-몬드   65000.0
5           대비드       27          텍사스       42500.0
6           김         22          서드-할  45000.0
7           제임스       24          휴스턴     10000.0