SQL 첫걸음 - 5장 상관 서브쿼리(5/5)

2020-11-01

1. EXISTS

서브쿼리를 사용해 검색할 때, ‘데이터가 존재하는지 아닌지’ 판별하기 위해 조건을 지정 할 수도 있음.

이런 경우 EXISTS 술어를 사용해 조사

997E124D5B960D820F 99BBCE4D5B960D9309 16134123123123

  • 서브쿼리의 WHERE 구는 no2 = no라는 조건식.. no2는 sample552의 열이고 no는 sample551의 열.
  • 이때, no가 3과 5일 때만 서브쿼리가 행을 반환.
  • EXISTS 술어에 서브쿼리를 지정하면 서브쿼리가 행을 반환할 경우에 참을 돌려줌.
  • 결과가 한 줄이라도, 그 이상이라도 참이 됨. 반면 반환되는 행이 없을 경우에는 거짓이 됨.

2. NOT EXISTS

EXISTS와 반대로 행이 존재하지 않을 경우 참이 됨.

99BAD9345B96142826

UPDATE 명령 뿐 아니라 SELECT 명령이나 DELETE 명령에서도 이와 같이 사용 가능.

3. 상관 서브쿼리

sample552테이블 no2열의 값과 sample551테이블 no열 값이 같은 행이 있지 않다면

해당 행의 a열 값을 ‘없음’으로 update

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

UPDATE 명령(부모)에서는 WHERE 구에 괄호로 묶은 부분이 서브쿼리(자식)가 됨.

부모명령에서는 sample551를 갱신.

자식인 서브쿼리에서는 sample552 테이블의 no2열 값이 부모의 no열 값과 일치하는 행을 검색.

이처럼 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 ‘상관 서브쿼리’라 부름

단순 서브쿼리 VS 상관 서브쿼리

  • 단순 서브쿼리
DELETE 
  FROM sample54 
 WHERE a = (SELECT MIN(a) 
              FROM 5ample54);
  • 서브쿼리 부분만 따로 떼어내어 실행 가능.
SELECT MIN(a) 
  FROM sample54 ;
  • 상관 서브쿼리
 UPDATE sample551 
    SET a = '있음' 
  WHERE EXISTS (SELECT * 
                  FROM sample552 
                 WHERE no2=no);
  • 서브쿼리 부분만 따로 떼어내어 실행 불가.
SELECT * 
  FROM sample552 
 WHERE no2=no

SQL Error : Unknown column ‘no’ in ‘where clause’

no 열은 부모명령(UPDATE)에서 쓰인 sample551테이블의 열이기 때문.(부모명령과 연관)

sample551과 sample552의 두 열의 이름이 ‘no’로 같다면 각 열이 어느 테이블의 것인지 명시적으로 나타내야함.

열명 앞에 ‘테이블명.’을 붙여 테이블을 지정.

열에 테이블명 붙이기

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

4. IN

스칼라 값끼리 비교할 때는 = 연산자 사용.

다만 집합을 비교할 때는 사용할 수 없는데 IN을 사용하면 집합안의 값이 존재하는지를 조사 가능.

sample551 테이블에서 no열값이 3이거나 5일 행만 조회

SELECT * 
  FROM sample551 
 WHERE no IN (3,5);
  • IN의 오른쪽을 서브쿼리로 지정
  1. (SELECT no2 FROM sample552) 서브쿼리 결과 » no2가 3,5인 행 2개 조회

  2. sample551 테이블에서 no열값이 3이거나 5일 행만 조회

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

이 처럼 특정 열의 값이 ‘무엇 또는(OR) 무엇’이라는 조건식을 지정하는 경우 IN을 사용

IN은 집합 안에 값이 포함되어 있으면 참. 반대로 NOT IN으로 지정하면 집합에 값이 포함되어 있지 않은 경우 참.

IN 과 NULL

IN을 사용해도 NULL값은 비교할 수 없음.

(NULL = NULL을 제대로 계산할 수 없으므로)

즉, NULL을 비교할 때는 IS NULL을 사용해야 함.

sample552 테이블에 no2값이 null인 행이 있어도 조회되지 않음.

SELECT * 
  FROM sample552 
 WHERE no2 
    IN (null);

또한 NOT IN의 경우, 집합 안에 NULL값이 있으면 설령 왼쪽 값이 집합 안에 포함되어 있지 않아도 참을 반환하지 않음.

그 결과는 ‘불명(UNKNOWN)’이 됨.

9982804A5B97A9D536 51231251231

출처 : https://smilejh.tistory.com/