https://school.programmers.co.kr/learn/courses/30/lessons/59042
SELECT ANIMAL_ID, NAME FROM(
SELECT ANIMAL_ID, O.NAME, INTAKE_CONDITION FROM ANIMAL_OUTS O
LEFT OUTER JOIN ANIMAL_INS I USING(ANIMAL_ID)
) S
WHERE INTAKE_CONDITION IS NULL
ORDER BY ANIMAL_ID;
서브쿼리에서 IN과 OUT을 OUTER JOIN하는데 OUT에 없는 필드를 같이 SELECT해 이 값이 NULL인 데이터의 ANIMAL_ID와 NAME을 조회
근데 사실 여기서 LEFT OUTER JOIN을 쓸 필요는 없다. LEFT JOIN만 해도 충분
SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID;
이건 JOIN을 쓰지 않는 방법. 하지만 이 문제는 JOIN을 이용하는 문제니 이건 땡!
근데 궁금한 건 ANIMAL_ID 대신 NAME을 쓰면 안된다는 것. 뭐가 다르지?
SELECT ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I USING(ANIMAL_ID)
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;
LEFT JOIN을 이용한 방법.
LEFT JOIN하면 ANIMAL_INS에 없지만 ANIMAL_OUTS엔 있는 ANIMAL_ID도 조회되고, 그리고 WEHRE에서 INS에서 ANIMAL_ID가 없는 것만 걸러내는 방법.
근데 WHERE I.ANIMAL_ID IS NULL
에서 I라고 하면 어떤게 참조되는 걸까??
SELECT ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I USING(ANIMAL_ID)
WHERE I.INTAKE_CONDITION IS NULL
ORDER BY ANIMAL_ID;
만약에 위에 코드가 이해되지 않는다면, 이렇게 하면 이해가 될 것 같다. INTAKE_CONDITION은 INS에만 있는 필드니 JOIN 후 INS에 없는 OUTS의 데이터 들은 이 필드에 NULL값을 가질테니.
이렇게 보면 위에서 JOIN후 I를 참조하는 게 JOIN 후에 두 테이블이 JOIN 후 각각의 테이블을 갖는다고 보면 되려나? 그니까 JOIN 후 O, JOIN 후 I의 테이블을 갖는거지. 그렇다면 이해가 된다.
뭔가.. 데이터의 메모리 구조??를 보면 이해가 될듯. 찾아보자.
USING(필드명)
으로 ON A.필드명=B.필드명
을 대신할 수 있다.