본문으로 건너뛰기

JOIN

JOIN의 개념

두 개 이상의 테이블을 서로 묶어서 하나의 결과집합으로 만들어 내는 것

INNER JOIN (내부 조인)

조인 중 가장 많이 사용됨 일반적인 조인은 INNER JOIN을 의미함

문법

SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건] -- 선택

예제

INNER_JOIN

SELECT *
FROM buyTbl
INNER JOIN userTbl
ON buyTbl.userid = userTbl.userid
WHERE buyTbl.userid = 'JYP';
실행 결과
numuseridprodNamegroupNamepriceamountuserIDnamebirthYearaddrmobile1mobile2heightmDate
3JYP모니터전자2001JYP조용필1950경기011444444441662024-10-28

별칭(Alias)의 사용

  • 테이블의 별칭을 사용함으로써 코드를 간결화

사용 예제

SELECT B.userid, U.name, B.productName, U.addr,
U.mobile1 + U.mobile2 AS [연락처]
FROM buyTbl B -- Alias
INNER JOIN userTbl U -- Alias
ON B.userid = U.userid

세 개 테이블 내부 조인

세 개 테이블 예제


사용 예제

SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
INNER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
INNER JOIN clubTbl C
ON C.clubName = SC.clubName
ORDER BY S.stdName;
실행 결과
stdNameaddrclubNameroomNo
1김범수경남바둑102호
2김범수경남축구103호
3바비킴서울봉사104호
4은지원경북축구103호
5은지원경북봉사104호
6조용필경기축구103호



OUTER JOIN (외부 조인)

내부 조인은 조인의 조건이 만족되지 않는 행을 출력되지 않지만,
외부 조인은 조건이 만족되지 않는 행까지 출력함

문법

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

내부조인과 외부 조인의 비교

내부 조인 결과

INNER_JOIN

SELECT U.userid, U.name, 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
실행 결과

구매한 사람만 출력 됨

useridnameprodNameaddr연락처
BBK바비킴모니터서울01000000000
BBK바비킴메모리서울01000000000
BBK바비킴운동화서울01000000000
BBK바비킴운동화서울01000000000
EJW은지원경북01188888888
EJW은지원경북01188888888
EJW은지원청바지경북01188888888
JYP조용필모니터경기01188888888
KBS김범수청바지경남01122222222
KBS김범수운동화경남01122222222
KBS김범수노트북경남01122222222
SSK성시경서울NULL

외부 조인 결과

OUTER_JOIN

SELECT U.userid, U.name, 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
실행 결과

buyTbl(구매 테이블) 에서 구매하지 않은 userTbl(회원 테이블) 도 포함된 JOIN 이 된다

useridnameprodNameaddr연락처
BBK바비킴모니터서울01000000000
BBK바비킴메모리서울01000000000
BBK바비킴운동화서울01000000000
BBK바비킴운동화서울01000000000
EJW은지원경북01188888888
EJW은지원경북01188888888
JKW조관우--NULL--경기01899999999
EJW은지원청바지경북01188888888
JYP조용필모니터경기01188888888
KBS김범수청바지경남01122222222
KBS김범수운동화경남01122222222
KBS김범수노트북경남01122222222
KKH김경호--NULL--경남01933333333
LJB임재범--NULL--경남01666666666
LSG이승기--NULL--경남01111111111
SSK성시경서울--NULL--
YJS윤종신--NULL--경남--NULL--

세 개 테이블 내부 조인

세 개 테이블 예제


LEFT OUTER JOIN 예제

SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
LEFT OUTER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
LEFT OUTER JOIN clubTbl C
ON C.clubName = SC.clubName
ORDER BY S.stdName;
실행 결과
stdNameaddrclubNameroomNo
1김범수경남바둑102호
2김범수경남축구103호
3바비킴서울봉사104호
4성시경서울--NULL----NULL--
5은지원경북축구103호
6은지원경북봉사104호
7조용필경기축구103호

RIGHT OUTER JOIN 예제

SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
LEFT OUTER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
RIGHT OUTER JOIN clubTbl C
ON C.clubName = SC.clubName
ORDER BY S.stdName;
실행 결과
stdNameaddrclubNameroomNo
1--NULL----NULL--수영101호
2김범수경남바둑102호
3김범수경남축구103호
4바비킴서울봉사104호
5은지원경북축구103호
6은지원경북봉사104호
7조용필경기축구103호

FULL OUTER JOIN 예제

SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
FULL OUTER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
FULL OUTER JOIN clubTbl C
ON C.clubName = SC.clubName
ORDER BY S.stdName;
실행 결과

stdclubTbl 테이블과 clubTbl 테이블이 모두 출력된다

stdNameaddrclubNameroomNo
1--NULL----NULL--수영101호
2김범수경남바둑102호
3김범수경남축구103호
4바비킴서울봉사104호
5성시경서울--NULL----NULL--
6은지원경북축구103호
7은지원경북봉사104호
8조용필경기축구103호



CROSS JOIN (상호 조인)

한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능 주로 테스트 용도로 대용량의 테이블을 생성 시에 사용함

문법

SELECT * FROM buyTbl CROSS JOIN userTbl

예제

CROSS_JOIN

  • 의미적으로는 무의미 하지만, 많은 샘플데이터를 만들기에 적합하다
  • 부하테스트를 확인하는 용도로도 사용된다



SELF JOIN (자체 조인)

자기자신과 자기자신이 조인한다는 의미 주로 조직도 등에서 활용

사용 예제

SELECT A.emp AS [부하직원], B.emp AS [직속상관],
B.department AS [직속상관부서]
FROM empTbl A
INNER JOIN empTbl B
ON A.manager = B.emp



UNION / UNION ALL / EXCEPT / INTERSECT

UNION

  • UNION은 두 쿼리의 결과를 행으로 합치는 것을 의미함(단, 중복 제거)
  • UNION ALL은 중복까지 허용함
  • EXCEPT는 두 번째 쿼리에 해당하는 것을 제외함

UNION


EXCEPT

  • 두 번째 쿼리에 해당하는 것을 제외함
SELECT name, mobile1 + mobile2 AS [전화번호] FROM userTbl
EXCEPT
SELECT name, mobile1 + mobile2 FROM userTbl
WHERE mobile1 IS NULL; -- 전화번호가 없는 사람은 제외
실행 결과
name전화번호
1김경호01933333333
2김범수01122222222
3바비킴01000000000
4은지원01188888888
5이승기01111111111
6임재범01666666666
7조관우01899999999
8조용필01144444444

INTERCEPT

  • EXCEPT 와는 반대로 INTERCEPT는 두 번째 쿼리에 해당하는 것만 조회함
SELECT name, mobile1 + mobile2 AS [전화번호] FROM userTbl
INTERCEPT
SELECT name, mobile1 + mobile2 FROM userTbl
WHERE mobile1 IS NULL; -- 전화번호가 없는 사람만 조회
실행 결과
name전화번호
1성시경--NULL--
2윤종신--NULL--