| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 맛집
- 리뷰
- 알고리즘
- Web
- Spring
- MySQL
- Git
- jface
- 인터페이스
- 후기
- 자바스크립트
- 이펙티브
- 자바
- effective
- java
- Spring Boot
- nodejs
- JPA
- boot
- error
- node
- RCP
- kibana
- elasticsearch
- 엘라스틱서치
- javascript
- 독후감
- 스프링
- 백준
- java8
Archives
- Today
- Total
wedul
Mysql Exists와 IN절 설명과 차이점 본문
반응형
두 개 모두 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 |
