13.2.10 서브 쿼리 구문
서브 쿼리는 다른 문에서 SELECT
문입니다.
MySQL 4.1에서 SQL 표준에 필요한 서브 쿼리의 모든 형식과 조작뿐만 아니라 MySQL 고유의 일부 기능을 지원하고 있습니다.
서브 쿼리의 예를 보여줍니다.
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
이 예제에서는 SELECT * FROM t1 ...
이 외부 쿼리 (또는 외부 문)이며, (SELECT column1 FROM t2)
가 서브 쿼리입니다. 이를이 서브 쿼리는 외부 쿼리에 중첩되어 있다고 표현하며 실제 서브 쿼리를 다른 하위 쿼리에서 (상당한 깊이까지) 중첩 할 수 있습니다. 서브 쿼리는 항상 괄호 안에 지정해야합니다.
서브 쿼리의 주요 장점은 다음과 같습니다.
문의 각 부분을 분리 할 수 있도록 구조화 된 쿼리를 가능하게합니다.
보통이면 복잡한 결합과 합집합을 필요로하는 작업을 수행하기위한 대안을 제공합니다.
많은 사람들이 하위 쿼리를 복잡한 결합과 합집합보다 가독성을 느끼고 있습니다. 실제로 조기 SQL 인 '구조적 쿼리 언어 "를 호출하는 원래의 생각을 사람들에게 제공 한 것은 서브 쿼리의 혁신이었습니다.
SQL 표준으로 지정되어 MySQL에서 지원되는 서브 쿼리 구문에 대한 주요 사항을 설명 문의 예를 보여줍니다.
DELETE FROM t1 WHERE s11> ANY (SELECT COUNT (*) / * no hint * / FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW (5 * t2.s1,77) = (SELECT 50,11 * s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
서브 쿼리는 스칼라 (단일 값) 단일 행, 단일 열 또는 테이블 (하나 이상의 컬럼의 하나 이상의 행)을 반환 할 수 있습니다. 이들은 스칼라 열, 행 및 테이블 서브 쿼리라고합니다. 특정 유형의 결과를 반환 서브 쿼리는 종종 다음 섹션에 설명 된대로 특정 장소에서만 사용할 수 있습니다.
서브 쿼리를 사용할 수있는 문 유형에 대한 제한이 거의 없습니다. 서브 쿼리는 DISTINCT
, GROUP BY
, ORDER BY
, LIMIT
, 결합 인덱스 힌트 UNION
구조 구문, 코멘트, 함수 등의 일반 SELECT
에 포함 할 수있는 많은 키워드 나 구를 포함 할 수 있습니다.
서브 쿼리의 외부 문은 SELECT
, INSERT
, UPDATE
, DELETE
, SET
, DO
중에서도 괜찮습니다.
MySQL에서 테이블을 변경하고, 하위 쿼리 같은 테이블에서 선택 할 수 없습니다. 이것은 DELETE
, INSERT
, REPLACE
, UPDATE
, LOAD DATA INFILE
(서브 쿼리는 SET
절에서 사용할 수 있으므로) 등의 문에 적용됩니다.
최적화 프로그램이 서브 쿼리의 처리 방법은 섹션 8.2.1.18 "서브 쿼리의 최적화" 를 참조하십시오. 서브 쿼리의 사용 제한에 대한 설명 (특정 형식의 서브 쿼리 구문의 성능 문제를 포함)에 대해서는 섹션 D.4 "서브 쿼리 제한" 을 참조하십시오.