SQL 조인(JOIN)

min seung moon·2021년 2월 9일
0

Oracle

목록 보기
11/23

INNER JOIN(내부 조인)

  • 조인이란 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것을 말함
  • INNER JOIN은 조인 중에서 가장 많이 사용되는 조인임
    • 일반적으로 JOIN이라고 얘기하는 것이 INNER JOIIN을 지칭하는 것

1. INNER JOIN의 형식

SELECT < 목록>
FROM < 번째 테이블>
INNER JOIN < 번째 테이블>
ON <조인될 조건>
[ WHERE 검색조건]

2. INNER JOIN 활용

-- ONLY WHERE
SELECT *
FROM buyTBL, userTBL
WHERE buyTBL.userID = userTBL.userID
AND buyTBL.userID = 'JYP';

-- INNER JOIN
SELECT *
FROM buyTBL
INNER JOIN userTBL
ON buyTBL.userID = userTBL.userID
WHERE buyTBL.userID = 'JYP';

3. 특정 열 추출

-- 필요한 열만 추출, 동일한 컬럼은 명확하게 할 필요가 있음
-- ||은 연결 연산자
SELECT buyTBL.userID, userName, prodName, addr, mobile1 || mobile2 AS "연락처"
FROM buytbl
INNER JOIN usertbl
ON buyTBL.userID = userTBL.userID;

-- '테이블이름.열이름' 형식
SELECT buyTBL.userID, userTBL.userName, buyTBL.prodName, userTBL.addr,
        userTBL.mobile1 || userTBL.mobile2 AS "연락처"
FROM buyTBL
INNER JOIN userTBL
ON buyTBL.userID = userTBL.userID;

-- 각테이블에 별칠 주기
SELECT B.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM buyTBL B
INNER JOIN userTBL U
ON B.userID = U.userID;

4. ORDER BY 사용

-- ORDER BY 사용
SELECT U.userID, U.userName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID
ORDER BY U.userID;

-- ORDER BY 사용, 동일값 제외
SELECT DISTINCT U.userID, U.userName, U.addr
FROM userTBL U
INNER JOIN buyTBL B
ON U.userID = B.userID
ORDER BY U.userID;

5. 실습

-- stdTBL, clubTBL, stdclubTBL TABLE 생성
CREATE TABLE stdTBL(
    이름  NCHAR(5) NOT NULL PRIMARY KEY,
    지역  NCHAR(2) NOT NULL
);

CREATE TABLE clubTBL(
    동아리명    NCHAR(5) NOT NULL PRIMARY KEY,
    동아리방    NCHAR(4) NOT NULL
);

CREATE TABLE stdclubTBL(
    일련번호    NUMBER(5)     NOT NULL    PRIMARY KEY,
    이름        NCHAR(5)   NOT NULL,
    동아리명    NCHAR(5)   NOT NULL,
    FOREIGN KEY (이름) REFERENCES stdTBL(이름),
    FOREIGN KEY(동아리명) REFERENCES clubTBL(동아리명)
);

-- 시퀀스 생성
CREATE SEQUENCE stdclibSEQ;

-- 테이블에 값 입력
INSERT INTO stdTBL VALUES ('김범수', '경남');
INSERT INTO stdTBL VALUES ('성시경', '서울');
INSERT INTO stdTBL VALUES ('조용필', '경기');
INSERT INTO stdTBL VALUES ('은지원', '경북');
INSERT INTO stdTBL VALUES ('바비킴', '서울');
SELECT * FROM stdTBL;

INSERT INTO clubTBL VALUES('수영', '101호');
INSERT INTO clubTBL VALUES('바둑', '102호');
INSERT INTO clubTBL VALUES('축구', '103호');
INSERT INTO clubTBL VALUES('봉사', '104호');
SELECT * FROM clubTBL;

INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '김범수', '바둑');
INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '김범수', '축구');
INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '조용필', '축구');
INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '은지원', '축구');
INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '은지원', '봉사');
INSERT INTO stdclubTBL VALUES (stdclibSEQ.NEXTVAL, '바비킴', '봉사');
SELECT * FROM stdclubTBL;

-- 학생 테이블, 동알 테이블, 학생동아리 테이블을 이용해서 학생을 기준으로
-- 학생 이름/지역/가입한 동아리/ 동아리방을 출력하자!
SELECT S.이름, S.지역, C.동아리명, C.동아리방 FROM stdTBL S
INNER JOIN stdclubTBL SC
    ON S.이름 = SC.이름
INNER JOIN clubTBL C
    ON SC.동아리명 = C.동아리명;

-- WHERE로 구현
SELECT S.이름, S.지역, C.동아리명, C.동아리방 
FROM stdTBL S, stdclubTBL SC, clubTBL C
WHERE S.이름 = SC.이름
AND SC.동아리명 = C.동아리명;

-- 이번에는 동아리를 기준으로 가입한 학생의 목록 출력
SELECT C.동아리명, C.동아리방, S.이름, S.지역
FROM clubTBL C
INNER JOIN stdclubTBL SC
    ON C.동아리명 = SC.동아리명
INNER JOIN stdTBL S
    ON SC.이름 = S.이름;

2. OUTER JOIN(외부조인)

  • OUTER JOIN은 JOIN의 조건에 만족되지 않는 행까지도 포함시키는 것

1. OUTER JOIN 형식

SELECT < 목록>
FROM < 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL > OUTER JOIN (두 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색조건];

2. OUTER JOIN 활용

-- 전체 회원의 구매 기록
SELECT U.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM userTBL U
LEFT OUTER JOIN buyTBL B
    ON U.userID = B.userID
ORDER BY U.userID;

-- INNER JOIN과 결과 비교
SELECT U.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM userTBL U
INNER JOIN buyTBL B
    ON U.userID = B.userID
ORDER BY U.userID;

-- RIGHT OUTER JOIN으로 변경
SELECT U.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM buyTBL B
RIGHT OUTER JOIN userTBL U
    ON B.userID = U.userID
ORDER BY U.userID;

-- 구매한적 없는 유령 회원 뽀기
SELECT U.userID, U.userName, B.prodName, U.addr, U.mobile1 || U.mobile2 AS "연락처"
FROM buyTBL B
RIGHT OUTER JOIN userTBL U
    ON B.userID = U.userID
WHERE B.prodName IS NULL
ORDER BY U.userID;

3. 실습

-- 위에서 진행한 실습의 학생 기준으로 출련된 결과를 보면,
-- 동아리에 가입하지 않은 학생 성시경은 출력 안됐다
-- OUTER JOIN으로 동아리에 가입하지 않은 학생도 출력되도록 수정
SELECT S.이름, S.지역, C.동아리명, C.동아리방
FROM stdtbl S
LEFT OUTER JOIN stdclubtbl SC
    ON  S.이름 = SC.이름
LEFT OUTER JOIN clubtbl C
    ON SC.동아리명 = C.동아리명;


-- 이번에는 동아리 기준으로 가입된 학생을 출력하되, 가입 학생이 하나도 없는 동아리도 출력
SELECT C.동아리명, C.동아리방, S.이름, S.지역
FROM stdtbl S
LEFT OUTER JOIN stdclubtbl SC
    ON  S.이름 = SC.이름
RIGHT OUTER JOIN clubtbl C
    ON SC.동아리명 = C.동아리명;


-- 위의 두 결과를 하나로 합쳐보자!
-- 즉 동아리에 가입하지 않은 학생도 출력되고 학생이 하나도 없는 동아리도 출력하자
-- 앞의 두 쿼리를 UNION으로 합쳐주면 된다.
SELECT S.이름, S.지역, C.동아리명, C.동아리방
FROM stdtbl S
LEFT OUTER JOIN stdclubtbl SC
    ON  S.이름 = SC.이름
LEFT OUTER JOIN clubtbl C
    ON SC.동아리명 = C.동아리명
UNION
SELECT S.이름, S.지역, C.동아리명, C.동아리방
FROM stdtbl S
LEFT OUTER JOIN stdclubtbl SC
    ON  S.이름 = SC.이름
RIGHT OUTER JOIN clubtbl C
    ON SC.동아리명 = C.동아리명;
profile
아직까지는 코린이!

0개의 댓글