SQL) IN, NOT IN, EXISTS, NOT EXISTS
원글 : https://doorbw.tistory.com/222
공통점 : WHERE절 뒤에 조건으로 오게된다.
차이점 : IN 뒤의 서브쿼리는 먼저 실행된다. 하지만, EXISTS 뒤의 쿼리는 나중에 실행된다.
SELECT * FROM table1 t1 WHERE t1.col1 IN (SELECT t2.col1 FROM table2 t2);
해석할때 자꾸 헷갈리는데, 기본 명제를 머리에 박아두고 시작하면 좋을것같다.
(SELECT) 기본적으로 테이블에서 셀렉트를 할 때, 모든 로우를 검사하게된다.
(WHERE) 로우를 검사하는 와중 조건이 있다.
WHERE IN 을 이해하려면, 이렇게 생각하는게 어떨까?
마치,, 인력난을 겪고있는 위기의 중소기업같은것이다.
최대한 많은 사람을 쉽게 구하기위해 잡다하고 어려운 조건따위 모두 충족시키지 않아도 된다.
그냥 건강하거나, 집이 가깝거나, 컴퓨터 킬줄알거나, 약간의 노오력 정도만 갖추면된다.
여기서 중요한건.. OR 조건이라는것이다. 저 중에 하나라도 해당되는게 있다면 합격인것이다.
이게 바로 WHERE IN 이다.
쉽게 생각하면,
1. 서브쿼리 : 중소기업이 지원자격이 적힌 채용공고를낸다. ( 건강 OR 가까움 OR 컴터활용능력 OR 노오력 등)
2. 이후 메인쿼리 : 관심있는 모든 구직자들이 인터뷰를 본다. ( 기본적으로 테이블에서 셀렉트를 할 때, 모든 로우를 검사하게된다. )
3. 결과 리턴 : 널널한 지원자격에 하나라도 포함된 구직자들은 모두모두 뽑힌다.
그다음,
WHERE NOT IN을 이해하려면?
WHERE IN과 마찬가지다. 다만 이번엔, 조건이 까다로운 대기업이다.
지원하는 구직자가 너무 많아서, 최대한 많이 떨어트리려고한다.
못생기면 안되고, 영어 못하면 안되고, 컴퓨터 못하면 안되고, 눈치 없으면 안되고 등등... 조건이 많다.
쿼리로 표현하자면,
SELECT * FROM employee e
WHERE e.condition
NOT IN (SELECT c.condition FROM company c)
/* 위는 아래와 같다. */
SELECT * FROM employee e
WHERE e.condition != c.condition1
AND e.condition != c.condition2
AND e.condition != c.condition3
AND e.condition != c.condition4
AND e.condition != c.condition5
....
/* 서브쿼리의 결과에 따라 조건이 수도없이 많아진다.. 취준파이팅 ㅠ */
그다음,
WHERE EXISTS를 이해하려면?
순서와 의미가 조금 다르다는걸 이해해야한다.
WHERE IN은 AND, OR 조건 여러개를 하나로 뭉친 느낌이고,
WHERE EXISTS는 쌩뚱맞은? 이상한? 조건에 의한 PASS / NON PASS의 느낌이다.
이는 마치 하교길의 단짝친구와의 장난스러운 내기와 같은것이다.
"야 내가 선물줄게! 단, 니가 저 앞산을 뒤져서 산삼이 있다면! ㅋㅋ"
1. 메인쿼리 : 이미 선물은 사둔 상태이다. 서브쿼리를 실행해서 이 선물을 줄지 말지만 결정하면된다.
2. 서브쿼리 : 앞산을 뒤져서 산삼이 존재한다(PASS) VS 존재하지않는다(NON PASS)
3. 결과 리턴 : 존재하면 해당 로우를 리턴한다.
(적당한 비유는 아니지만.. 이해하는데는 도움이 될것같다.)
아무튼 여기서 주목해야할것은 서브쿼리라는 것이다.
산삼을 찾는 과정에서 산삼을찾았느냐(결과가있느냐) 산삼을 찾지 못했느냐(결과가 없느냐)에 따라 선물을 줄지 말지 결정한다는것이다.
이를 어떨때 사용하면 좋을까 생각을 해보자.
1. "한번이라도 주문한 내역이 있는 고객"들에게 메일을 보내자~
이는 서브쿼리의 리턴값이 TRUE가 되자마자 메인쿼리의 조건을 만족하므로, 성능이 빨라질 수 있는 편이다. ( 아닐수도있음! ㅎ)
결론 :
쿼리에 정답은 없다. 하지만 얼마나 효율적으로 데이터를 뽑아내느냐는 얼마나 다양한 쿼리들을 이해하고있느냐에 따라 달려있다.
잠깐 드는 생각들.
1. WHERE IN 에서 성능향상을 이루기 위해 많이들 가지고 있는 조건을 앞에다가 두면, 아무래도 빨라지지 않을까.
2. WHERE IN과 WHERE NOT IN을 중소기업, 대기업이라고 생각해봤을때
중소기업은 지원자를 많이 통과시켜야 한다! VS 대기업은 지원자를 많이 탈락시켜야한다!
라는 관점에서, 탈락시킬때의 조건은 남들이 잘 가지지 못한 조건을 앞에다가 두면 아무래도 빨라지지않을까.
3. WHERE EXISTS도 마찬가지로 빠르게 결과를 내줄만한 서브쿼리를 잘 작성해야긋다.
ㅅㄱ!