[DB] Chapter 8 조인과 SQL 프로그래밍

버버니야·2022년 2월 22일
0
post-thumbnail

조인(join)

조인은 두개 이상의 테이블을 묶어서 하나의 결과 테이블을 만드는 것

내부 조인 (inner join)

내부 조인은 조인 중에서 가장 많이 사용되는 조인.
대부분의 업무에서 내부 조인을 사용하며, 일반적으로 조인이라고 하면 내부 조인을 가리킨다.

1. 두 테이블의 내부 조인

JOIN = INNER JOIN

SELECT < 목록>
	FROM < 번째 테이블 이름>
    INNER JOIN < 번째 테이블 이름> (JOIN도 가능)
    	ON <조인될 조건>
 [WHERE 검색조건];

ON : 테이블이름.열이름으로 작성 ex) userTBL.userID
SELECT : select를 통해 필요한 열만 추출할 수 있다. 추출할 열의 이름이 중복될때는 테이블.열이름으로 작성

SELECT buyTBL.userID
	FROM buyTBL
    	INNER JOIN userTBL
        	ON buyTBL.userID = userTBL.userID;

SELECT B.userID
	FROM buyTBL B
    	INNER JOIN userTBL U
        	ON B.userID = U.userID;

처럼 테이블의 별칭을 통해 코드를 간결하게 할 수 있다.
여러 테이블이 관련되는 조인 연산에서는 유용하게 쓰인다.

SELECT U.userID
	FROM userTBL U
    	INNER JOIN buyTBL B
        	ON U.userID = B.userID;

위의 쿼리문은 순서만 다를 뿐 큰 차이가 없다.

SELECT B.userID
	FROM buyTBL B
    	INNER JOIN userTBL U
        	ON B.userID = U.userID
        ODER BY U.userID;

를 통해 userID 순으로 정렬한 결과를 얻을 수 있다.

2. 세 테이블의 내부 조인

학 학생은 여러 개의 동아리에 가입할 수 있고, 하나의 동아리에는 여러 학생이 가입할 수 있다.
따라서 따라서 학생 테이블과 동아리 테이블은 '다대다' 관계이다.

실습 8-1 3개 테이블 내부 조인하기

  1. 테이블 생성

학생테이블

동아리 테이블

학생_동아리 테이블

  1. 조인하기

학생 테이블, 동아리 테이블, 학생_동아리 테이블을 내부 조인한 후 학생을 기준으로 이름, 지역, 가입한 동아리 동아리방 출력

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 SC.clubName = C.clubName
    ORDER BY S.stdName;

2-2. 동아리를 기준으로 가입한 학생의 목록을 출력, 정렬기준은 동아리

SELECT C.clubName, C.roomNo, S.stdName, S.addr
	FROM stdTBL S 
    	INNER JOIN stdclubTBL SC 
        	ON S.stdName = SC.stdName
        INNER JOIN clubTBL C 
        	ON SC.clubName = C.clubName
    ORDER BY C.clubName;

3. 외부 조인

외부 조인은 조인 조건을 만족하지 않는 행까지 포함하여 출력하는 조인

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

실습 8-2 왼쪽/오른쪽 외부 조인하기

외부 조인을 수행해 동아리에 가입하지 않은 학생도 출력
INNER JOIN -> OUTER JOIN

1-1
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 SC.clubName = C.clubName
    ORDER BY S.stdName;


동아리에 가입하지 않은 김제동도 출력이 된다.

1-2

동아리를 기준으로 가입학생을 출력하되, 가입 학생이 한 명도 ㅇ벗는 동아리도 출력

SELECT  C.clubName, C.roomNo,S.stdName, S.addr
    FROM stdTBL S
    	LEFT OUTER JOIN stdclubTBL SC
		    ON S.stdName = SC.stdName
	    LEFT OUTER JOIN clubTBL C
    		ON SC.clubName = C.clubName
    ORDER BY C.clubName;

완전 외부 조인을 한 것과 같은 효과 내기

2-1 위의 두 결과 합치기,

동아리에 가입하지 않은 학생도 출력하고 학생이 한 명도 가입하지 않은 동아리도 출력하기

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 SC.clubName = C.clubName 
UNION
SELECT S.stdName, S.addr, C.clubName, C.roomNo
	FROM stdTBL S
		LEFT OUTER JOIN stdclubTBL SC
			ON SC.stdName = S.stdName
		RIGHT OUTER JOIN clubTBL C
			ON SC.clubName = C.clubName;

4. 상호 조인

상호 조인은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는것을 말한다. 상호 조인 결과 테이블의 행수는 두 테이블의 행수를 곱한 값이다.
상호 조인은 카티션곱(cartesian product)라고도 한다.

상호 조인 예시
SELECT *
	FROM buyTBL
    	CORSS JOIN userTBL;

CORSS JOIN 문을 사용하지 않고 상호 조인을 하려면 WHERE 절 없이 FROM 절에 테이블 이름을 나열해도 가능하다.

SELECT *
	FROM buyTBL, userTBL;

5. 자체 조인

자체 조인은 자기 자신과 자기 자신을 조인하는 것으로 별도의 구문은 없다.

실습 8-3 자체 조인하기


조직도 테이블 생성

  1. 자체 조인하기
    상관의 구내 번호 확인하기, 우대리의 상관인 이부장은 직원 이름 열에도 존재하고 상관 이름 열에도 존재하지만 각각의 의미가 다르다. 이럴 때 같은 테이블에 서로 다른 이름을 붙인 후 조인하면 원하는 정보를 얻을 수 있디.
SELECT A.emp AS '부하직원', B.emp AS '직속상관', B.empTel AS '직속상관연락처' 
	FROM empTBL A 
		INNER JOIN empTBL B 
			ON A.manager = B.emp 
	WHERE A.emp = '우대리';

6. UNION/ UNION ALL

UNION은 두 쿼리의 결과를 행으로 합치는 연산

SELECT 문장1
	UNION [ALL]
SELECT 문장2

SELECT 하는 두 쿼리가 수행했을 때 열의 개수가 같아야 하고 데이터의 형식도
각 열 단위로 같거나 서로 호환되는 형식이어야 한다.
만약 문장1의 결과가 정수형인데 문장2의 결과가 문자형이라면 오류가 발생
또한 중복된 열은 제거하고 데이터를 정렬하여 출력한다.
중복된 열까지 모두 출력하려면 UNION ALL을 사용

 SELECT stdName, addr FROM stdTBL
    UNION ALL
 SELECT clubName, roomNo FROM clubTBL;

7 NOT IN / IN

NOT IN은 첫 번째 쿼리의 결과 중에서 두 번째 쿼리에 해당하는 것을 제외하고 출력하는 연산자이다.

SELECT userName, CONCAT(mobile1, '-', mobile2) AS '전화번호' FROM userTBL
WHERE userName NOT IN (SELECT userName FROM userTBL WHERE mobile1 IS NULL);
profile
안녕하세요

0개의 댓글