저자 : 아사이 아츠시
출판 : 한빛미디어
발매 : 2015.11.01
1. EXISTS
- 서브쿼리를 사용해 검색할 때, '데이터가 존재하는지 아닌지' 판별하기 위해 조건을 지정 할 수도 있음.
이런 경우 EXISTS 술어를 사용해 조사
- 서브쿼리의 WHERE 구는 no2 = no라는 조건식.. no2는 sample552의 열이고 no는 sample551의 열.
이때, no가 3과 5일 때만 서브쿼리가 행을 반환.
- EXISTS 술어에 서브쿼리를 지정하면 서브쿼리가 행을 반환할 경우에 참을 돌려줌.
결과가 한 줄이라도, 그 이상이라도 참이 됨. 반면 반환되는 행이 없을 경우에는 거짓이 됨.
2. NOT EXISTS
- EXISTS와 반대로 행이 존재하지 않을 경우 참이 됨.
- UPDATE 명령 뿐 아니라 SELECT 명령이나 DELETE 명령에서도 이와 같이 사용 가능.
3. 상관 서브쿼리
1 2 3 4 | -- sample552테이블 no2열의 값과 sample551테이블 no열 값이 같은 행이 있지 않다면 -- 해당 행의 a열 값을 '없음'으로 update UPDATE sample551 SET a = '있음' WHERE EXISTS (SELECT * FROM sample552 WHERE no2 = no); | cs |
- UPDATE 명령(부모)에서는 WHERE 구에 괄호로 묶은 부분이 서브쿼리(자식)가 됨.
부모명령에서는 sample551를 갱신. 자식인 서브쿼리에서는 sample552 테이블의 no2열 값이 부모의 no열 값과 일치하는 행을 검색.
이처럼 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것을 '상관 서브쿼리'라 부름
- 단순 서브쿼리 VS 상관 서브쿼리
1 2 3 4 5 | /* 단순 서브쿼리 */ DELETE FROM sample54 WHERE a = (SELECT MIN(a) FROM 5ample54); -- 서브쿼리 부분만 따로 떼어내어 실행 가능. SELECT MIN(a) FROM sample54 ; | cs |
1 2 3 4 5 6 7 8 9 | /* 상관 서브쿼리 */ UPDATE sample551 SET a = '있음' WHERE EXISTS (SELECT * FROM sample552 WHERE no2=no); -- 서브쿼리 부분만 따로 떼어내어 실행 불가. SELECT * FROM sample552 WHERE no2=no -- SQL Error : Unknown column 'no' in 'where clause' -- no 열은 부모명령(UPDATE)에서 쓰인 sample551테이블의 열이기 때문.(부모명령과 연관) | cs |
- sample551과 sample552의 두 열의 이름이 'no'로 같다면 각 열이 어느 테이블의 것인지 명시적으로 나타내야함.
열명 앞에 '테이블명.'을 붙여 테이블을 지정.
1 2 3 | -- 열에 테이블명 붙이기 UPDATE sample551 SET a = '있음' WHERE EXISTS (SELECT * FROM sample552 WHERE sample552.no = sample551.no); | cs |
4. IN
- 스칼라 값끼리 비교할 때는 = 연산자 사용. 다만 집합을 비교할 때는 사용할 수 없는데 IN을 사용하면 집합안의 값이 존재하는지를
조사 가능.
1 2 3 4 5 6 7 8 9 10 11 | -- sample551 테이블에서 no열값이 3이거나 5일 행만 조회 SELECT * FROM sample551 WHERE no IN (3,5); -- IN의 오른쪽을 서브쿼리로 지정 -- 1. (SELECT no2 FROM sample552) 서브쿼리 결과 >> no2가 3,5인 행 2개 조회 -- 2. sample551 테이블에서 no열값이 3이거나 5일 행만 조회 SELECT * FROM sample551 WHERE no IN (SELECT no2 FROM sample552); | cs |
- 이 처럼 특정 열의 값이 '무엇 또는(OR) 무엇'이라는 조건식을 지정하는 경우 IN을 사용
- IN은 집합 안에 값이 포함되어 있으면 참. 반대로 NOT IN으로 지정하면 집합에 값이 포함되어 있지 않은 경우 참.
* IN 과 NULL
- IN을 사용해도 NULL값은 비교할 수 없음.(NULL = NULL을 제대로 계산할 수 없으므로)
즉, NULL을 비교할 때는 IS NULL을 사용해야 함.
1 2 3 4 | -- sample552 테이블에 no2값이 null인 행이 있어도 조회되지 않음. SELECT * FROM sample552 WHERE no2 IN (null); | cs |
- 또한 NOT IN의 경우, 집합 안에 NULL값이 있으면 설령 왼쪽 값이 집합 안에 포함되어 있지 않아도 참을 반환하지 않음.
그 결과는 '불명(UNKNOWN)'이 됨.
'Study > DB' 카테고리의 다른 글
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 26.테이블 작성·삭제·변경 (0) | 2018.09.11 |
---|---|
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 25.데이터베이스 객체 (0) | 2018.09.11 |
[SQL 첫걸음] 5장.집계와 서브쿼리 - 23.서브쿼리 (0) | 2018.09.05 |
[SQL 첫걸음] 5장.집계와 서브쿼리 - 22.그룹화(GROUP BY) (0) | 2018.09.04 |
[SQL 첫걸음] 5장.집계와 서브쿼리 - 21.COUNT 이외의 집계함수 (0) | 2018.08.31 |