[SQL] 24. 상관 서브쿼리

uuuu.jini·2023년 1월 30일
0

SQL 첫걸음

목록 보기
24/36
post-thumbnail

서브쿼리의 일종인 상관 서브쿼리를 EXISTS 술어로 조합시켜 사용하는 방법

EXISTS (SELECT 명령)

EXISTS 술어를 사용하면 서브쿼리가 반환하는 결괏값이 있는지를 조사할 수 있다. 스칼라 값을 반환할 필요가 없다.

1. EXISTS


서브쿼리 사용해 검색 시 데이터가 존재하는지 아닌지 판별하기 위해 조건을 지정할 수 있다.

sample552에 no열의 값과 같은 행이 있다면 sample551 테이블의 a값을 있음이라는 값으로 갱신, 없으면 없음이라는 값으로 갱신

UPDATE sample551 SET a = "있음" WHERE EXISTS (SELECT * FROM sample552 WHERE no2 = no);

EXISTS 술어에 서브쿼리 지정시 서브쿼리가 행을 반환할 경우 참을 돌려준다.

2. NOT EXISTS


없음의 경우 행이 존재하지 않는 상태가 참이 되므로 NOT EXISTS를 사용한다.

UPDATE sample551 SET a = "없음" WHERE NOT EXISTS
	(SELECT * FROM sample552 WHERE no2 = no);

3. 상관 서브쿼리


서브쿼리에는 명령 안에 중첩구조로 된 SELECT 명령이 존재한다. 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 상관 서브쿼리라고 부른다.

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

- 테이블명 붙이기

만약 부모와 서브의 열의 이름이 같은 경우 잘 동작하지 않을 수 있다. (열이 애매하다는 내용의 에러 발생)

열이 어떤 테이블의 것인지 명시적으로 나타낼 필요가 있다.

  • 테이블명.열명

4. IN


IN 을 사용하면 집합 안의 값이 존재하는지를 조사할 수 있다.
WHERE no = 3 OR no = 5; -> WHERE no IN (3,5);

열명 IN(집합)

왼쪽에 지정된 값과 같은 값이 집합 안에 존재하면 참을 반환, 집합은 상수 리스트를 괄호로 묶어 기술

SELECT * FROM sample551 WHERE no IN
	(SELECT no2 FROM sample552);

서브쿼리는 스칼라 서브쿼리일 필요 없다. (1번,2번 패턴만 가능 -> 열이 복수로 지정되면 비교 불가, IN 은 하나의 열만 검사)

NOT IN 으로 지정시 집합에 값이 포함되어 있지 않을 경우 참이 된다.

- IN 과 NULL

IN에서는 집합 안에 NULL 값이 있어도 무시하지는 않습니다. 다만 NULL=NULL 을 제대로 계산할 수 없으므로 IN을 사용해도 NULL을 비교할 수는 없다. 즉, NULL을 비교시 IS NULL을 사용해야 한다.

(NOT IN의 경우, 집합 안에 NULL 값이 있으면 설령 왼쪽 값이 집합 안에 포함되어 있지 않아도 참을 반환하지 않는다. 불명(UNKNOWN)이 된다. NULL인 경우 비교할 수 없으므로 참,거짓이 아닌 NULL을 반환)

profile
멋쟁이 토마토

0개의 댓글