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 |