반응형
두 개 모두 where절에 조건을 보고 결과를 걸러낼때 사용하는데 정리가 잘 안되서 정리해봤다.
Exists
서브쿼리가 반화나는 결과값이 있는지를 조사한다.
단지 반환된 행이 있는지 없는지만 보고 값이 있으면 참 없으면 거짓을 반환한다.
1 | SELECT * FROM sample1; | cs |
1 | SELECT * FROM sample2; | cs |
1 | SELECT * FROM sample1 s1 WHERE EXISTS(SELECT * FROM sample2 s2 WHERE s1.no = s2.no); | cs |
그럼 반대로 조건에 맞지 않는 ROW만 추출하고 싶으면 어떻게 해야할까?
1 | SELECT * FROM sample1 s1 WHERE NOT EXISTS(SELECT * FROM sample2 s2 WHERE s1.no = s2.no); | cs |
IN
집합 내부에 값이 존재하는지 여부 확인한다.
실제로 존재하는 데이터의 값을 비교하기 때문에 Exists보다 속도가 느린경우가 있다.
두가지 경우로 사용이 가능하다.
1.집합군
1 | SELECT * FROM sample1 s1 WHERE NO IN (4, 5); | cs |
2.서브쿼리
1 | SELECT * FROM sample1 s1 WHERE NO IN (SELECT NO FROM sample2 s2); | cs |
반대로 포함되지 않은 경우를 추출하고 싶은경우에는 NOT IN 사용
1 | SELECT * FROM sample1 s1 WHERE NO NOT IN (SELECT NO FROM sample2 s2); | cs |
※ 주의
하지만 NOT IN에 경우에 조건에 맞는 데이터가 있어도 중간에 NULL이 존재하게되면 no rows selected가 나오게 되니 NVL 처리로 NULL 처리를 해야한다.
NULL이 포함된 sample3 테이블
NOT IN절
1 | SELECT * FROM sample1 s1 WHERE a IN (SELECT val FROM sample3 s3); | cs |
sample1테이블에 null 값이 포함되어 있기 때문에 검색시 no rows selected 결과가 나온다.
NVL 처리 후 확인
1 | SELECT * FROM sample1 s1 WHERE a Not IN (SELECT IFNULL (val, 'd') FROM sample3 s3); | cs |
반응형
'데이터베이스 > mysql' 카테고리의 다른 글
Mysql 묵시적 형변환 (2) | 2018.10.03 |
---|---|
Mysql 실행계획 설명 (0) | 2018.10.03 |
Mysql의 서버엔진과 스토리지 엔진 (0) | 2018.08.10 |
Mysql에서 각 유형별 상위 몇건 데이터 가져오는 방법 (0) | 2018.07.25 |
Mysql @variables를 통해 변수 생성 및 대입 연산자 소개 (0) | 2018.07.25 |