1. STANDARD SQL 개요
표준 SQL의 기능
- STANDARD JOIN 기능 추가 (CROSS, OUTER JOIN 등 새로운 FROM 절 JOIN 기능들)
- SCALAR SUBQUERY, TOP-N QUERY 등의 새로운 SUBQUERY 기능들
- ROLLUP, CUBE, GROUPING SETS 등의 새로운 리포팅 기능
- WINDOW FUNCTION 같은 새로운 개념의 분석 기능들
가. 일반 집합 연산자
- UNION 연산은 UNION 기능으로
- INTERSECTION 연산은 INTERSECT 기능으로
- DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능으로
- PRODUCT 연산은 CROSS JOIN 기능으로
나. 순수 관계 연산자
- SELECT 연산
WHERE 절로 구현 - PROJECT 연산
SELECT 절로 구현 - (NATURAL) JOIN 연산
다양한 JOIN 기능으로 구현 - DIVIDE 연산
현재 사용되지 않는다.
2. FROM 절 JON 형태
ANSI/ISO SQL에서 표시하는 FROM 절의 JOIN 형태는 다음과 같다.
- INNER JOIN
기존 WHERE 절의 검색 조건과 JOIN 조건을 그대로 사용할 수 있으며
JOIN 조건을 FROM 절에서 명시적으로 정의할 수 있게 되었다. - NATURAL JOIN
INNER JOIN의 하위 개념
두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 EQUI JOIN을 수행한다. - USING 조건절
- ON 조건절
- CROSS JOIN
- OUTER JOIN
3. INNER JOIN
JOIN 조건에서 동일한 값이 있는 행만 반환
FROM 절 JOIN 조건
- FROM 절에서 정의
- USING, ON 조건절을 필수적으로 사용해야 함.
예제 (사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다)
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON MP.DEPTNO = DEPT.DEPTNO;
<결과>
DEPTNO EMPNO ENAME DNAME
------ ----- ------ ---------
20 7369 SMITH RESEARCH
30 7499 ALLEN SALES
30 7521 WARD SALES
20 7566 JONES RESEARCH
...
14개의 행이 선택되었다.
4. NATURAL JOIN
- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행
- NATURAL JOIN이 명시되면 WHERE 절에서 JOIN 조건을 정의할 수 없다.(USING, ON 조건절)
- SQL Server에서는 지원하지 않는다.
예제 1 (사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다)
SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
<결과>
DEPTNO EMPNO ENAME DNAME
------ ------ ------ ------
20 7369 SMITH RESEARCH
30 7499 ALLEN SALES
30 7521 WARD SALES
20 7566 JONES RESEARCH
30 7654 MARTIN SALES
30 7698 BLAKE SALES
...
14개의 행이 선택되었다.
기타 설명
- JOIN 컬럼을 지정하지 않았지만 공통된 칼럼(DEPTNO)으로 JOIN 처리 함.
- JOIN에 사용된 컬럼은 같은 데이터 유형이어야 한다.
- ALIAS나 테이블명과 같은 접두사를 붙일 수 없다.
<사용 불가 예>
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
ERROR: NATURAL JOIN에 사용된 열은 식별자를 가질 수 없음
예제 2
- 별도의 칼럼 순서를 지정하지 않으면 NATURAL JOIN의 기준이 되는 칼럼 들이 다른 칼럼보다 먼저 출력된다.
- NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리한다.
SELECT *
FROM EMP NATURAL JOIN DEPT;
<결과>
DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DNAME LOC
----- ----- ----- -------- --- -------- ---- ---- --------- ------
20 7369 SMITH CLERK 7902 1980-12-17 800 RESEARCH DALLAS
30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 SALES CHICAGO
30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 SALES CHICAGO
20 7566 JONES MANAGER 7839 1981-04-02 2975 RESEARCH DALLAS
30 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 SALES CHICAGO
...
14개의 행이 선택되었다.
예제 3 (INNER JOIN 예로 NATURAL JOIN과의 차이)
SELECT *
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNODEPTNO DNAME LOC
---- ----- ------ --- ------- --- ---- ----- ----- -------- -----
7369 SMITH CLERK 7902 1980-12-17 800 20 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 30 SALES CHICAGO
7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 30 SALES CHICAGO
...
14개의 행이 선택되었다.
- INNER JOIN의 경우는 두 테이블의 컬럼이 모두 출력된다.
- 중복 테이블의 경우 별개의 컬럼으로 표시한다.
NATURAL JOIN과 INNER JOIN의 차이
NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리하지만
INNER JOIN은 모두 표시한다.
<예제>
DEPT 테이블
EPTNO DNAME LOC
-------- ---------- ---------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
4개의 행이 선택되었다.
DEPT_TEMP 테이블
EPTNO DNAME LOC
-------- ---------- ---------
10 ACCOUNTING NEW YORK
20 R&D DALLAS
30 MARKETING CHICAGO
40 OPERATIONS BOSTON
4개의 행이 선택되었다.
<NATURAL JOIN 경우>
SELECT *
FROM DEPT NATURAL INNER JOIN DEPT_TEMP;
DEPTNO DNAME LOC
------ ---------- ----------
10 ACCOUNTING NEW YORK
40 OPERATIONS BOSTON
2개의 행이 선택되었다.
<INNER JOIN 경우>
SELECT *
FROM DEPT JOIN DEPT_TEMP
ON DEPT.DEPTNO = DEPT_TEMP.DEPTNO
AND DEPT.DNAME = DEPT_TEMP.DNAME
AND DEPT.LOC = DEPT_TEMP.LOC;
DEPTNO DNAME LOC DEPTNO DNAME LOC
------ ---------- -------- ------ ---------- ------
10 ACCOUNTING NEW YORK 10 ACCOUNTING NEW YORK
40 OPERATIONS BOSTON 40 OPERATIONS BOSTON
2개의 행이 선택되었다.
5. USING 조건절
- FROM절에 USING 조건절을 이용하여 같은 이름을 가진 칼럼중에 원하는 칼럼에 대해서만 EQUI JOIIN을 할 수 있다.
(NATURAL JOIN에서는 모든 일치되는 칼럼을 조인하지만 USING은 원하는 칼럼만 JOIN한다) - SQL SERVER에서는 지원하지 않는다.
- JOIN 칼럼에 대해서 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다.
잘못된 사례
SELECT DEPT.DEPTNO, DEPT.DNAME, DEPT.LOC, DEPT_TEMP.DNAME, DEPT_TEMP.LOC => ALIAS 사용 불가
FROM DEPT JOIN DEPT_TEMP
USING (DEPTNO);
ERROR: USING 절의 열 부분은 식별자를 가질 수 없음
바른 사례
SELECT DEPTNO, DEPT.DNAME, DEPT.LOC, DEPT_TEMP.DNAME, DEPT_TEMP.LOC
FROM DEPT JOIN DEPT_TEMP
USING (DEPTNO);
<실행결과>
DEPTNO DNAME LOC DNAME LOC
------- --------- --------- ----------- --------
10 ACCOUNTING NEW YORK ACCOUNTING NEW YORK
20 RESEARCH DALLAS R&D DALLAS
30 SALES CHICAGO MARKETING CHICAGO
40 OPERATIONS BOSTON OPERATIONS BOSTON
4개의 행이 선택되었다.
예제 1 (DEPT와 DEPT_TEMP 테이블의 DNAME 칼럼을 조인 조건으로 INNER JOIN의 USING 조건절을 수행한다.)
SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (DNAME);
<결과>
DNAME DEPTNO LOC DEPTNO LOC
---------- ------ --------- ------- ---------
ACCOUNTING 10 NEW YORK 10 NEW YORK
OPERATIONS 40 BOSTON 40 BOSTON
2개의 행이 선택되었다.
<결과 설명>
두 테이블에서 컬럼값이 같은 로우만 출력되고 DNAME를 식별자로 정렬한다.
예제 2 (칼럼명이 모두 같은 DEPT와 DEPT_TEMP 테이블을 LOC와 DEPTNO 2개 칼럼을 이용한
INNER JOIN의 USING 조건절로 수행한다.)
SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (LOC, DEPTNO);
<결과>
LOC DEPTNO DNAME DNAME
-------- ------ ---------- ----------
NEW YORK 10 ACCOUNTING ACCOUNTING
DALLAS 20 RESEARCH R&D
CHICAGO 30 SALES MARKETING
BOSTON 40 OPERATIONS OPERATIONS
4개의 행이 선택되었다.
<결과 설명>
- 조인에 참여한 LOC와 DEPTNO 컬람값이 같은 로우만 출력한다.
- JOIN 조건에 참여하지 않은 DNAME 칼럼은 2개의 칼럼으로 표시된다.
6. ON 조건절
- ON 조건절을 사용하면 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있다.
- 임의의 JOIN 조건을 지정할 수 있다.
- JOIN 칼럼명을 명시할 수 있다.
- ALIAS나 테이블 명과 같은 접두사를 사용할 수 있다.
가. WHERE절과의 혼용
예제 (부서코드 30인 부서의 부서의 소석 사원 이름 및 소속 부서 코드, 부서 코드, 부서 이름을 찾아본다.)
SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.DEPTNO = 30;
<결과>
ENAME DEPTNO DEPTNO DNAME
------- ------ ------ ------
ALLEN 30 30 SALES
WARD 30 30 SALES
MARTIN 30 30 SALES
BLAKE 30 30 SALES
TURNER 30 30 SALES
JAMES 30 30 SALES
6개의 행이 선택되었다.
나. ON 조건절 + 데이터 검증 조건 추가
- ON 조건절에 데이터 검색 조건을 추가할 수 있다.
- 검색 조건 목적인 경우는 WHERE절을 사용할 것을 권고한다.
(다마 아우터 조인에서 조인의 대상을 제한하기 위한 목적으로 사용되는 추가 조건의 경우는 ON 절에 표기한다.)
예제 (매니저 사원번호가 7698번인 사원들의 이름 및 소속 부서 코드, 부서 이름을 찾아본다)
SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO AND E.MGR = 7698);
위 SQL과 아래 SQL은 같은 결과를 얻을 수 있다.
SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.MGR = 7698;
<실행결과>
ENAME MGR DEPTNO DNAME
------- ---- ------ ------
ALLEN 7698 30 SALES
WARD 7698 30 SALES
MARTIN 7698 30 SALES
TURNER 7698 30 SALES
JAMES 7698 30 SALES
5개의 행이 선택되었다.
다. ON 조건절 예제
예제 1 (팀과 스타디움 테이블을 스타디움ID로 JOIN하여 팀이름, 스타디움ID, 스타디움 이름을 찾아본다.)
SELECT TEAM_NAME, TEAM.STADIUM_ID, STADIUM_NAME
FROM TEAM JOIN STADIUM
ON TEAM.STADIUM_ID = STADIUM.STADIUM_ID
ORDER BY STADIUM_ID;
위 SQL은 STADIUM_ID라는 공통된 칼럼이 있기 때문에 아래처럼 USING 조건절로 구현할 수도 있다.
SELECT TEAM_NAME, STADIUM_ID, STADIUM_NAME
FROM TEAM JOIN STADIUM
USING (STADIUM_ID)
ORDER BY STADIUM_ID;
위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다.
SELECT TEAM_NAME, TEAM.STADIUM_ID, STADIUM_NAME
FROM TEAM, STADIUM
WHERE TEAM.STADIUM_ID = STADIUM.STADIUM_ID
ORDER BY STADIUM_ID;
<실행결과>
TEAM_NAME STADIUM_ID STADIUM_NAME
------------- --------- -------------
광주상무 A02 광주월드컵경기장
강원FC A03 강릉종합경기장
제주유나이티드FC A04 제주월드컵경기장
...
15개의 행이 선택되었다.
예제 2
(팀과 스타디움 테이블을 팀ID로 JOIN하여 팀이름, 팀ID, 스타디움 이름을 찾아본다. STADIUM에는 팀ID가 HOMETEAM_ID라는 칼럼으로 표시되어 있다.)
SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME
FROM TEAM JOIN STADIUM
ON TEAM.TEAM_ID = STADIUM.HOMETEAM_ID
ORDER BY TEAM_ID;
위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다.
SELECT TEAM_NAME, TEAM_ID, STADIUM_NAME
FROM TEAM, STADIUM
WHERE TEAM.TEAM_ID = STADIUM.HOMETEAM_ID
ORDER BY TEAM_ID;
<실행결과>
TEAM_NAME TEAM_ID STADIUM_NAME
----------- ------- -------------
울산현대 K01 울산문수경기장
삼성블루윙즈 K02 수원월드컵경기장
스틸러스 K03 포항스틸야드
...
15개의 행이 선택되었다.
라. 다중 테이블 JOIN
예제 1 (사원과 DEPT 테이블의 소속 부서명, DEPT_TEMP 테이블의 바뀐 부서명 정보를 출력한다.)
SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
JOIN DEPT_TEMP T
ON (E.DEPTNO = T.DEPTNO);
위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다.
SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME
FROM EMP E, DEPT D, DEPT_TEMP T
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO = T.DEPTNO;
<실행결과>
EMPNO DEPTNO DNAME NEW_DNAME
------ ------ --------- -----------
7369 20 RESEARCH R&D
7499 30 SALES MARKETING
7521 30 SALES MARKETING
...
14개의 행이 선택되었다.
예제 2 (GK 포지션의 선수별 연고지명, 팀명, 구장명을 출력한다.)
SELECT P.PLAYER_NAME 선수명, P.POSITION 포지션, T.REGION_NAME 연고지명, T.TEAM_NAME 팀명,
S.STADIUM_NAME 구장명
FROM PLAYER P JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
JOIN STADIUM S
ON T.STADIUM_ID = S.STADIUM_ID
WHERE P.POSITION = 'GK'
ORDER BY 선수명;
<실행결과>
선수명 포지션 연고지명 팀명 구장명
----- ---- ------ -------- ----------
강성일 GK 대전 시티즌 대전월드컵경기장
권정혁 GK 울산 울산현대 울산문수경기장
권찬수 GK 성남 일화천마 성남종합운동장
김대희 GK 포항 스틸러스 포항스틸야드
...
43개의 행이 선택되었다.
예제 3 (홈팀이 3점 이상 차이로 승리한 경기의 경기장 이름, 경기 일정, 홈팀 이름과 원정팀 이름 정보를 출력한다)
SELECT ST.STADIUM_NAME, SC.STADIUM_ID, SCHE_DATE, HT.TEAM_NAME, AT.TEAM_NAME,
HOME_SCORE, AWAY_SCORE
FROM SCHEDULE SC JOIN STADIUM ST
ON SC.STADIUM_ID = ST.STADIUM_ID
JOIN TEAM HT
ON SC.HOMETEAM_ID = HT.TEAM_ID
JOIN TEAM AT
ON SC.AWAYTEAM_ID = AT.TEAM_ID
WHERE HOME_SCORE >= AWAY_SCORE +3;
위 SQL은 고전적인 방식인 WHERE 절의 INNER JOIN으로 구현할 수도 있다.
SELECT ST.STADIUM_NAME, SC.STADIUM_ID, SCHE_DATE, HT.TEAM_NAME, AT.TEAM_NAME,
HOME_SCORE, AWAY_SCORE
FROM SCHEDULE SC, STADIUM ST, TEAM HT, TEAM AT
WHERE HOME_SCORE> = AWAY_SCORE +3
AND SC.STADIUM_ID = ST.STADIUM_ID
AND SC.HOMETEAM_ID = HT.TEAM_ID
AND SC.AWAYTEAM_ID = AT.TEAM_ID;
<실행결과>
STADIUM_NAME STADIUM_ID SCHE_DATE TEAM_NAME TEAM_NAME HOME_SCORE AWAY_SCORE
------------ --------- -------- --------- --------- --------- ---------
서울월드컵경기장 B05 20120714 FC서울 삼성블루윙즈 3 0
부산아시아드경기장 C02 20120727 아이파크 시티즌 3 0
울산문수경기장 C04 20120803 울산현대 스틸러스 3 0
성남종합운동장 B02 20120317 일화천마 유나이티드 6 0
창원종합운동장 C05 20120427 경남FC 아이파크 5 2
5개의 행이 선택되었다.
7. CROSS JOIN
8. OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용.
- OUTER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
가. LEFT OUTER JOIN
- 조인 수행시 좌측 테이블에서 데이터를 먼저 읽은 후, 우측 테이블에서 JOIN 대상을 읽어 온다.
- 즉, 좌측 테이블이 기준이 됨.
예제 1 (STADIUM과 TEAM을 JOIN 하되 홈팀이 없는 경기장의 정보도 같이 출력)
SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
FROM STADIUM LEFT OUTER JOIN TEAM
ON STADIUM.HOMETEAM_ID = TEAM.TEAM_ID
ORDER BY HOMETEAM_ID;
OUTER는 생략 가능한 키워드이므로 아래 SQL은 같은 결과를 얻을 수 있다.
SELECT STADIUM_NAME, STADIUM.STADIUM_ID, SEAT_COUNT, HOMETEAM_ID, TEAM_NAME
FROM STADIUM LEFT JOIN TEAM
ON STADIUM.HOMETEAM_ID = TEAM.TEAM_ID
ORDER BY HOMETEAM_ID;
<실행결과>
STADIUM_NAME STADIUM_ID SEAT_COUNT HOMETEAM_ID TEAM_NAME
------------ --------- ---------- ----------- ----------
울산문수경기장 C04 46102 K01 울산현대
수원월드컵경기장 B04 50000 K02 삼성블루윙즈
포항스틸야드 C06 25000 K03 스틸러스
인천월드컵경기장 B01 35000 K04 유나이티드
전주월드컵경기장 D03 28000 K05 현대모터스
부산아시아드경기장 C02 30000 K06 아이파크
광양전용경기장 D01 20009 K07 드래곤즈
성남종합운동장 B02 27000 K08 일화천마
서울월드컵경기장 B05 66806 K09 FC서울
대전월드컵경기장 D02 41000 K10 시티즌
창원종합운동장 C05 27085 K11 경남FC
광주월드컵경기장 A02 40245 K12 광주상무
강릉종합경기장 A03 33000 K13 강원FC
제주월드컵경기장 A04 42256 K14 제주유나이티드FC
대구월드컵경기장 A05 66422 K15 대구FC
안양경기장 F05 20000
마산경기장 F04 20000
일산경기장 F03 20000
부산시민경기장 F02 30000
대구시민경기장 F01 30000
20개의 행이 선택되었다.
<결과 부연설명>
INNER JOIN이라면 홈팀이 배정된 15개만 출력 되겠지만 LEFT OUTER JOIN을 사용하여 홈팀이 없는 정보까지 출력 됨.
나. RIGHT OUTER JOIN
- 조인 수행시 우측 테이블이 기준이 되어 결과를 생성한다.
예제 (EPT와 EMP를 조인하되 사원이 없는 부서 정보도 같이 출력하도록 한다.)
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
<실행결과>
ENAME DEPTNO DNAME LOC
----- ------ --------- --------
CLARK 10 ACCOUNTING NEW YORK
KING 10 ACCOUNTING NEW YORK
MILLER 10 ACCOUNTING NEW YORK
JONES 20 RESEARCH DALLAS
FORD 20 RESEARCH DALLAS
ADAMS 20 RESEARCH DALLAS
SMITH 20 RESEARCH DALLAS
SCOTT 20 RESEARCH DALLAS
WARD 30 SALES CHICAGO
TURNER 30 SALES CHICAGO
ALLEN 30 SALES CHICAGO
JAMES 30 SALES CHICAGO
BLAKE 30 SALES CHICAGO
MARTIN 30 SALES CHICAGO
40 OPERA TIONS BOSTON
15개의 행이 선택되었다.
다. FULL OUTER JOIN
- 조인되는 모든 테이블의 데이터를 읽어 JOIN한다.
- RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.
예제 (DEPT 테이블과 DEPT_TEMP 테이블의 FULL OUTER JOIN 사례를 만들기 위해 DEPT_TEMP의 DEPTNO를 수정한다. 결과적으로 DEPT_TEMP 테이블의 새로운 DEPTNO 데이터는 DETP 테이블의 DEPTNO와 2건은 동일하고 2건은 새로운 DEPTNO가 생성된다.)
SELECT *
FROM DEPT FULL OUTER JOIN DEPT_TEMP
ON DEPT.DEPTNO = DEPT_TEMP.DEPTNO;
위 SQL과 아래 SQL은 같은 결과를 얻을 수 있다.
SELECT L.DEPTNO, L.DNAME, L.LOC, R.DEPTNO, R.DNAME, R.LOC
FROM DEPT L LEFT OUTER JOIN DEPT_TEMP R
ON L.DEPTNO = R.DEPTNO
UNION
SELECT L.DEPTNO, L.DNAME, L.LOC, R.DEPTNO, R.DNAME, R.LOC
FROM DEPT L RIGHT OUTER JOIN DEPT_TEMP R
ON L.DEPTNO = R.DEPTNO;
<실행결과>
DEPTNO DNAME LOC DEPTNO DNAME LOC
------ ---------- -------- ------ ----------- ------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO 30 ACCOUNTING NEW YORK
40 OPERATIONS BOSTON 40 R&D DALLAS
50 MARKETING CHICAGO
60 OPERATIONS BOSTON
6개의 행이 선택되었다.
9. INNER vs OUTER vs CROSS JOIN 비교
INNER JOIN의 결과
양쪽 테이블에 모두 존재하는 키 값이 B-B, C-C 인 2건이 출력
LEFT OUTER JOIN의 결과
TAB1을 기준으로 키 값 조합이 B-B, C-C, D-NULL, E-NULL 인 4건이 출력
RIGHT OUTER JOIN의 결과
TAB2를 기준으로 키 값 조합이 NULL-A, B-B, C-C 인 3건이 출력
FULL OUTER JOIN의 결과
양쪽 테이블을 기준으로 키 값 조합이 NULL-A, B-B, C-C, D-NULL, E-NULL 인 5건이 출력
CROSS JOIN의 결과
JOIN 가능한 모든 경우의 수를 표시하지만 단, OUTER JOIN은 제외한다.
양쪽 테이블 TAB1과 TAB2의 데이터를 곱한 개수인 4 * 3 = 12건이 추출됨 키 값 조합이
B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C 인 12건 출력
✅ REFERENCE
'# 4. 자격증 > SQLD' 카테고리의 다른 글
SQLD 자격증 # SQL 활용(과목2)_계층형 질의와 셀프 조인 (0) | 2021.11.12 |
---|---|
SQLD 자격증 # SQL 활용(과목2)_집합 연산자 (0) | 2021.11.12 |
SQLD 자격증 # SQL 기본(과목2)_조인 (0) | 2021.11.11 |
SQLD 자격증 # SQL 기본(과목2)_ORDER BY 절 (0) | 2021.11.11 |
SQLD 자격증 # SQL 기본(과목2)_GROUP BY HAVING 절 (0) | 2021.11.11 |