현진
23
2021-08-26 15:28:04
4
187

간단한 내부조인 AND NULL 원리 질문입니다.


CREATE TABLE A 

(

  x VARCHAR2(10),

  y VARCHAR2(10)

);

INSERT into A

values ( 'c', 'd');


이렇게 테이블 A 생성하고 데이터 한줄만 넣었습니다.


여기서 

SELECT * from A a1, A a2

WHERE a2.y IS NULL;

하면 당연히 결과값이 비어있습니다.


근데

SELECT * from A a1, A a2

WHERE a2.y IS NULL

AND a1.x = a2.y(+);


이렇게 외부조인 한줄을 추가하면 

a1.x=c, a1.y=d, a2.x=null, a2.y=null

이렇게 결과 한줄이 뜹니다.


제가 궁금한건 처음 SELECT 쿼리가 비었으니까

거기다가 AND 문으로 한줄 추가해도 당연히 값이 안나와야 하지 않나 하는 생각입니다


집합으로 치면 공집합에 AND로 다른집합을 붙여도 그 결과가 공집합인 것 처럼요


SQL 초보라서 뭔가 원리를 잘못 이해하고 있는 것인지 궁금합니다...



0
  • 답변 4

  • spoon
    2k
    2021-08-26 15:44:22

    oracle outer join 또는 외부조인에 대해 검색해보세요

    오라클 문법이라 헷갈릴 수 있습니다

    ANSI SQL 문법으로 먼저 이해하시는게 좋습니다

  • HJOW
    3k
    2021-08-26 15:45:10 작성 2021-08-26 15:49:04 수정됨

    SELECT * from A a1, A a2

    WHERE a2.y IS NULL;


    오라클 조인 (테이블 이름을 콤마로 나열하고 조인조건을 WHERE절에 기술) 에서

    WHERE절에 조인조건을 넣지 않으면 CROSS JOIN 이 됩니다.

    두 테이블 중 한쪽에 데이터가 하나도 없는 상황이므로 CROSS JOIN 결과는 하나도 없습니다.



    SELECT * from A a1, A a2

    WHERE a2.y IS NULL

    AND a1.x = a2.y(+);


    WHERE절에 조인조건을 넣고 (+)를 넣으면 외부조인(OUTER JOIN)이 되어

    한쪽에 데이터가 없더라도 다른쪽에 데이터가 있으면 데이터가 나오게 됩니다.

    a2 에 (+) 가 있으므로 a2에 데이터가 없어도 a1에만 있으면 데이터가 출력됩니다.

  • 현진
    23
    2021-08-26 15:52:44

    (+)유무에 따라 join 방식이 달라지는 거군요

    조금 이해가 갈 것 같습니다 답변 감사합니다!

  • HJOW
    3k
    2021-08-26 15:55:14

    (+)는 INNER/OUTER JOIN 여부만 결정합니다.

    CROSS JOIN이 되지 않게 하려면

        AND a1.x = a2.y

    조건절 유무가 더 중요합니다.


    (CROSS JOIN는 실무에 잘 쓰이지 않으며 부하가 매우 많이 가는 연산입니다.)



  • 로그인을 하시면 답변을 등록할 수 있습니다.