반응형
두 개 모두 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 테이블
쿼리 조회에 사용될 sample1 테이블
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 |