본문 바로가기

DEVELOPMENT/SQL

[SQL] 상관 서브쿼리

EXISTS

 

서브쿼리를 사용해 검색할 때 '데이터가 존재하는지 아닌지' 판별하기 위해 조건을 지정할 수도 있다. 이런 경우 EXISTS 술어를 사용해 조사할 수 있다.

-- EXISTS를 사용해 '있음'으로 갱신하기
UPDATE sample1 SET a = '있음' WHERE
 EXISTS (SELECT * FROM sample2 WHERE no2 = no);

 

 

NOT EXISTS

 

'없음'의 경우, 행이 존재하지 않는 상태가 참이 되므로 이때는 NOT EXISTS를 사용한다. NOT을 붙이는 것으로 값을 부정할 수 있다.

-- NOT EXISTS를 사용해 '없음'으로 갱신하기
UPDATE sample1 SET a = '없음' WHERE
 NOT EXISTS (SELECT * FROM sample2 WHERE no2 = no);

 

 

상관 서브쿼리

 

서브쿼리에는 명령 안에 중첩구조로 된 SELECT 명령이 존재한다. 

UPDATE sample1 SET a = '있음' WHERE
 EXISTS (SELECT * FROM sample2 WHERE no2 = no);

UPDATE 명령(부모)에서 WHERE 구에 괄호로 묶은 부분이 서브쿼리(자식)가 된다. 부모 명령에서는 sample1을 갱신한다. 자식인 서브쿼리에서는 sample2 테이블의 no2 열 값이 부모의 no 열 값과 일치하는 행을 검색한다.

이처럼 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 '상관 서브쿼리' 라 부른다. 상관 서브쿼리를 사용함으로써 두 테이블에 걸쳐 조작할 수 있다.

상관 서브쿼리가 아닌 단순한 서브쿼리는 단독 쿼리로 실행할 수 있다. 하지만 상관 서브쿼리에서는 부모 명령과 연관되어 처리되기 때문에 서브쿼리 부분만을 떼어내어 실행시킬 수 없다.

 

 

IN

 

스칼라 값끼리 비교할 때는 = 연산자를 사용한다. 다만 집합을 비교할 때는 IN을 사용하면 집합 안의 값이 존재하는지를 조사할 수 있다. 서브쿼리를 사용할 때 IN을 통해 비교하는 경우도 많다.

-- 형식
열명 IN(집합)

-- IN을 사용해 조건식 기술
SELECT * FROM sample1 WHERE no IN(3, 5);

-- IN의 오른쪽을 서브쿼리로 지정하기
SELECT * FROM sample1 WHERE no IN
 (SELECT no2 FROM sample2);

IN에서는 오른쪽에 집합을 지정한다. 왼쪽에 지정된 값과 같은 값이 집합 안에 존재하면 참을 반환한다.

집합은 상수 리스트를 괄호로 묶어 기술한다. 집합 부분은 서브쿼리로도 지정할 수 있다.

 

 

 

'DEVELOPMENT > SQL' 카테고리의 다른 글

[SQL] 제약조건  (0) 2023.05.30
[SQL] 테이블 작성/삭제/변경  (0) 2023.05.30
[SQL] 서브쿼리  (0) 2023.05.30
[SQL] GROUP BY  (0) 2023.05.30
[SQL] 집계함수  (0) 2023.05.30