DataBase

INNER JOIN / LEFT OUTER JOIN 차이와 활용 예시

유혁스쿨 2022. 4. 28. 22:01
728x90
반응형
CREATE TABLE member(
      m_no NUMBER(38) PRIMARY KEY
    , id VARCHAR2(100) UNIQUE
    , password VARCHAR2(100)
    , name VARCHAR2(100)
    , nickname VARCHAR2(100)
    , address VARCHAR2(100)
    , email VARCHAR2(100)
    , gender VARCHAR2(100)
    , birth VARCHAR2(100)
    , member_rank NUMVER(38)
    , regdate DATE
);

CREATE SEQUENCE mno_seq  START WITH 1 INCREMENT BY 1;
CREATE TABLE delivery(
      d_no NUMVER(30) PRIMARY KEY
    , id VARCHAR2(100) CONSTRAINT fd_fk_id FOREIGN KEY (id) REFERENCES member(id)
    , t_code VARCHAR2(100) --택배회사 코드
    , t_invoice VARCHAR2(100) --운송장번호
    , postcode VARCHAR2(100)
    , street_address VARCHAR2(100)
    , parcel_address VARCHAR2(100)
    , detail_address VARCHAR2(100)
    , more_infomation VARCHAR2(100)
    , deliver_state VARCHAR2(100)
);

CREATE SEQUENCE dno_seq  START WITH 1 INCREMENT BY 1;

INNER JOIN

    SELECT member.name, delivery.t_code, delivery.t_invoice 
    FROM member 
    INNER JOIN delivery
            ON member.id = delivery.id 
    WHERE member.id = 'u-it'

1. 회원 테이블의 id와 배송테이블의 id가 일치하는 조건을 기준,
양측 테이블 동시에 데이터가 존재하는 행에 대해서 조인 후
2. 넘겨받은 파라미터 id와 일치하는 조건의 회원이름, 운송장번호, 택배회사 코드를 조회

INNER JOIN이므로 배송 테이블에 정보(id 혹은 송장번호, 택배회사번호)가 존재하지 않으면
WHERE절의 id를 기준으로 검색결과는 "컬럼명만 출력되고 튜플은 공백으로 출력"

member.namedelivery.t_codedelivery.t_invoice
   


LEFT OUTER JOIN

    SELECT member.name, delivery.t_code, delivery.t_invoice 
    FROM member 
    LEFT OUTER JOIN delivery
            ON member.id = delivery.id 
    WHERE member.id = 'u-it'

LEFT OUTER JOIN이므로 배송 테이블에 정보(id 혹은 송장번호, 택배회사번호)가 존재하지 않으면
WHERE절의 id를 기준으로 검색결과는 "1행을 출력 - 존재하지 않는 값은 NULL로 출력"

member.namedelivery.t_codedelivery.t_invoice
유잇(null)(null)


결과적으로 두 조인을 모두 사용할 수 있으며, 시스템상에서 처리하기 나름인거같다.
INNER JOIN일때 조회후 조회된 값이 없을경우 서비스단에서 조건문을 걸어 "운송장 번호가 조회되지 않습니다" 라는 문구를 띄워야 하며,  이때 많은 검사를 해야할거같다.
단순히 쿼리를 검색했을 때 member 테이블에 존재하는 id값 조차도 조회하지 못하기 때문에 (단 1행도 출력못함)
member테이블에 해당 id값이 존재하는지 count() 함수로 검색하여 값이 1이상인 경우에 운송장 번호가 조회되지 않습니다 라는 문구를 띄워줘야 한다고 생각한다.
인문학적으로 그리고 상식적으로 배송조회를 할 때 로그인이 되어있고 로그인 되어있는 ID를 기준으로 조회쿼리를 구동하기 때문에 따지고 보면 COUNT를 세지 않아도 되지만, 쿼리 출력 결과물 상으로는 member 테이블 name 컬럼값으로 저장된 '유잇'조차 출력하지 못하기 때문에 조회를 해야한다고 판단한다. (무결성 오류 명시적 점검)
카운트값이 1 이상이면서 택배사코드가 null 이면서 운송장번호가 null인 세가지 논리합으로 구성된 조건문을 통해 true일경우 문구를 띄워줘야한다.

LEFT OUTER JOIN같은 경우엔 그냥 저 그대로 UI를 구성해서 값을 받아와서 뿌린 후 서비스단에서 값이 null이나 "공백" 일 경우 그대로 표출하거나 "운송장 번호가 조회되지 않습니다" 라는 문구를 띄워주면 간단하겠다.
그래서 INNER JOIN 보다는 LEFT OUTER JOIN을 걸어주는게 편할거같다.

그렇다면 INNER JOIN을 사용하는 경우는 어떤 경우일까?

728x90
반응형