본문 바로가기

Database/MySQL

IN과 EXIST의 차이

IN

 : 서브 쿼리에서 조건에 해당되는 행의 열을 비교하여 값 확인

 : 서브 쿼리의 결과 값을 메인 쿼리에 대입하여 조건 비교 후 결과 출력

 : IN 쿼리 -> 메인 쿼리

 : 결과에 NULL 값 포함되지 않음

 : 다중 행을 반환 시 사용하나, 단일 행 반환 시 사용해도 오류 없음

 : = 연산자는 단일 행 반환 시 사용 (결과가 여러 행인 경우에 사용 시 오류 발생)

   -> 결과 행이 단일/다중행인지 잘 모르겠으면 IN 사용

-- 출판사명이 '서울 출판사'(pubNo='1')와 '도서출판 강남'(pubNo='2')인 도서의
-- 도서명, 출판사번호 출력
SELECT bookName, pubNo
FROM book
WHERE pubNo IN ('1', '2'); 

-- 출판사명이 '도서출판 강남'이 아닌 도서의
-- 도서명, 출판사번호 출력
SELECT bookName, pubNo
FROM book
WHERE pubNo NOT IN('2');

 

 

EXISTS

 : 서브 쿼리에서 조건에 해당되는 행의 존재 여부만 확인 -> TRUE/FALSE 반환 (서브 쿼리의 결과가 행을 반환하면 참)

 : IN에 비해 성능 좋음

 : EXISTS 키워드 앞에 속성명, 수식 등 올 수 없음

 : WHERE 절에 외래키 제약조건 지정

 : NULL 값도 결과에 포함

 

 

NOT EXISTS NOT IN 차이

 : 대부분 NOT EXISTS NOT IN 결과 동일하나, 공통되는 조인 속성의 값이 NULL인 경우 결과에 차이 발생

 : NOT EXISTS -> NULL 값도 결과에 포함

 : NOT IN -> NULL 값이 결과에 포함되지 않음

-- EXISTS : 서브 쿼리 결과에 NULL 값 포함
-- NULL 값 포함하여 모든 clientNo 출력
SELECT clientHobby
FROM client
WHERE EXISTS (SELECT clientHobby
			  FROM client);
-- NULL과 공백 다 출력 : 9개


-- IN : 서브 쿼리 결과에 NULL 값 포함되지 않음
-- NULL 값을 갖지 않는 clientHobby만 출력
SELECT clientHobby
FROM client
WHERE clientHobby IN (SELECT clientHobby
			          FROM client);
-- NULL 제외, 공백 포함해서 7개

 

'Database > MySQL' 카테고리의 다른 글

테이블 복사 및 복사 시 주의사항  (0) 2021.11.26
ALL과 ANY 차이점  (0) 2021.11.26
조인 VS 서브 쿼리  (0) 2021.11.26
Subquery (서브쿼리)  (0) 2021.11.26
조인 (JOIN)  (0) 2021.11.26