13.2.10.5 row(행) 서브 쿼리
여기까지의 설명은 스칼라 또는 컬럼 서브 쿼리, 즉 단일 값 또는 값의 컬럼을 돌려 서브 쿼리에 대해 었습니다. 행 서브 쿼리는 단일 행을 반환하고이를 위해 여러 컬럼 값을 반환 할 수있는 서브 쿼리 변형입니다. 행 서브 쿼리의 비교를위한 정당한 연산자는 다음과 같습니다.
=> <> = <= <>! = <=>
다음 두 가지 예를 보여줍니다.
SELECT * FROM t1 WHERE (col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10); SELECT * FROM t1 WHERE ROW (col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
두 쿼리에서 테이블 t2
에 id = 10
를 가진 단일 행이 포함되어있는 경우이 서브 쿼리는 단일 행을 반환합니다. 이 행에 t1
의 하나의 행 col1
과 col2
값에 동일한 col3
및 col4
값이 포함되어있는 경우 WHERE
식은 TRUE
이며, 각 쿼리는 이러한 t1
행을 반환합니다. t2
행의 col3
및 col4
값이 어느 t1
행 col1
과 col2
값도 동일하지 않은 경우,이 식은 FALSE
이며,이 쿼리는 빈 결과 집합을 반환합니다. 서브 쿼리에 의해 행이 생성되지 않은 경우,이 식은 불명 (즉, NULL
)입니다. 서브 쿼리에 의해 여러 행이 생성되는 경우 행 서브 쿼리가 최대 1 행만 반환 할 수 없기 때문에 오류가 발생합니다.
식 (1,2)
및 ROW(1,2)
은 행 생성자라고도합니다. 이 둘은 동일합니다. 행 생성자와 하위 쿼리에서 반환되는 행에는 같은 수의 값이 포함되어 있어야합니다.
행 생성자는 두 개 이상의 열을 반환 서브 쿼리와의 비교에 사용됩니다. 서브 쿼리가 단일 컬럼을 반환하면 이것은 행이 아닌 스칼라 값으로 간주되므로 적어도 2 개의 컬럼을 반환하지 않는 서브 쿼리에서 행 생성자를 사용할 수 없습니다. 따라서 다음의 쿼리 구문 오류로 실패합니다.
SELECT * FROM t1 WHERE ROW (1) = (SELECT column1 FROM t2)
행 생성자는 다른 컨텍스트에서도 합법적입니다. 예를 들어, 다음 두 문장은 의미 적으로 동등합니다 (또한 최적화 프로그램 같은 방식으로 처리됩니다).
SELECT * FROM t1 WHERE (column1, column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
다음 쿼리는 "테이블 t2
에 존재하는 테이블 t1
의 모든 행을 검색한다 '는 요구에 응답합니다.
SELECT column1, column2, column3 FROM t1 WHERE (column1, column2, column3) IN (SELECT column1, column2, column3 FROM t2);