SELECT A.직원ID, A.이름, B.부서명
FROM 직원 A, 부서 B
--카티션(Cartesian) JOIN 또는 크로스(Cross) JOIN
-- => 모든 경우의 수 표기 !
SELECT A.직원ID, A.이름, B.부서명
FROM 직원 A, 부서 B;
--INNER JOIN
-- => 조건절(WHERE A.부서ID = B.부서ID) 붙음 !
SELECT A.직원ID, A.이름, B.부서명
FROM 직원 A, 부서 B
WHERE A.부서ID = B.부서ID;
--OUTER JOIN
-- => INNNER JOIN으로 생략된 데이터를 OUTER JOIN으로 출력 !
SELECT *
FROM 직원 A, 부서 B
WHERE A.부서ID(+) = B.부서ID;
JOIN은 2개 이상의 테이블을 하나의 SQL 문으로 연결함
모든 경의 수를 모두 보여줌 : 카티션 조인
실습문제(JOIN)
--1. 직원 테이블과 부서 테이블을 부서ID로 연결하여 부서 ID가 서로 같은 모든 정보를 출력하시오.
SELECT *
FROM 직원 A, 부서 B
WHERE A.부서ID = B.부서ID;
--2. 직원 테이블과 직원 연락처 테이블에서 연락처 정보가 있는 모든 직원 정보를 출력해주세요.
SELECT *
FROM 직원 A, 직원연락처 B
WHERE A.직원ID = B.직원ID
AND B.연락처 IS NOT NULL;
--3. 직원 테이블과 직원주소 테이블에서 주소 정보가 있는 직원의 직원ID와 이름, 주소를 출력해주세요.
SELECT A.직원ID, A.이름, B.주소
FROM 직원 A, 직원주소 B
WHERE B.주소 IS NOT NULL;
(+) 기호가 있으면 OUTER JION!
(+) 기호가 없으면 INNER JOIN!
실습문제
--1.직원 테이블과 직원주소 테이블은 둘 다 직원ID 컬럼을 가지고 있습니다.
--이 컬럼으로 동등(“=“) 조인을 하면 서로 연관이 있는 튜플만 출력이 됩니다.
--아래와 같은 결과가 되도록 조인으로 출력을 해주세요.
--[ 직원 테이블 : 직원ID , 성별 , 나이 ]
--[ 직원주소 테이블 : 직원ID , 구분코드 , 주소 ]
SELECT
A.직원ID AS 직원_직원ID
, A.성별
, A.나이
, B.직원ID AS 주소_직원ID
, B.구분코드
, B.주소
FROM 직원 A, 직원주소 B
WHERE A.직원ID = B.직원ID
AND B.구분코드 = '집';
실습문제 (JOIN, INNER JOIN, OUTER JOIN)
--1. 직원 테이블과 직원주소 테이블은 둘 다 직원ID 컬럼을 가지고 있습니다.
--이 컬럼으로 동등(“=“) 조인을 하면 서로 연관이 있는 튜플만 출력이 됩니다.
--아래와 같은 결과가 되도록 조인으로 출력을 해주세요.
--[ 직원 테이블 : 직원ID , 성별 , 나이 ]
--[ 직원주소 테이블 : 직원ID , 구분코드 , 주소 ]
SELECT
A.직원ID AS 직원_직원ID
, A.성별
, A.나이
, B.직원ID AS 주소_직원ID
, B.구분코드
, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID
AND B.구분코드 = '집';
--2. 1번에서 작성한 쿼리 결과에서 추가로 일반 조건을 작성하려고 합니다.
--직원ID 가 A0007 인 직원의 정보만 출력되도록 작성해주세요.
SELECT
A.직원ID AS 직원_직원ID
, A.성별
, A.나이
, B.직원ID AS 주소_직원ID
, B.구분코드
, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID
AND B.구분코드 = '집'
AND A.직원ID = 'A0007';
--3. 직원 테이블과 직원주소 테이블을 [직원ID] 컬럼으로 “=“ 조인하려고 합니다.
--이 때 직원주소 테이블에는 없는 직원들의 정보도 출력되도록 아우터조인으로 쿼
--리를 작성해주세요. (힌트: 기준테이블은 직원 테이블입니다)
--[ 직원 테이블 : 직원ID , 이름 , 연봉 ]
--[ 직원주소 테이블 : 직원ID , 구분코드 , 주소 ]
SELECT A.직원ID AS 직원_직원ID
, A.이름
, A.연봉
, B.직원ID AS 주소_직원ID
, B.구분코드
, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID(+);
--4. 3번에서 작성한 쿼리에서 추가로 일반 조건을 입력하려고 합니다.
--이번에는 주소정보가 없는 직원들만 출력되도록 쿼리를 작성해주세요.
--힌트 : IS NULL , IS NOT NULL
SELECT A.직원ID AS 직원_직원ID
, A.이름
, A.연봉
, B.직원ID AS 주소_직원ID
, B.구분코드
, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID(+)
AND B.주소 IS NULL;
--5. 직원 테이블과 직원주소 테이블 , 직원연락처 테이블을 [직원ID] 컬럼으로 “=“ 조인
--하려고 합니다. INNER JOIN으로 위 세 개의 테이블을 조인해보세요.
--[ 직원 테이블 : 직원ID , 이름 , 나이 ]
--[ 직원주소 테이블 : 주소 ]
--[ 직원연락처 테이블 : 연락처 ]
SELECT A.직원ID
, A.이름
, A.나이
, C.연락처
, B.주소
FROM 직원 A , 직원주소 B , 직원연락처 C
WHERE A.직원ID = B.직원ID
AND A.직원ID = C.직원ID;
--6. 직원ID 가 ‘A0001’ , ‘A0002’ , ‘A0003’ 인 직원에 대해 아래 정보를
--출력해주세요
SELECT A.직원ID
, A.이름
, A.입사일시
, B.연락처
FROM 직원 A , 직원연락처 B
WHERE A.직원ID = B.직원ID
AND A.직원ID IN('A0001' , 'A0002' , 'A0003')
AND B.구분코드 = '휴대폰';
--7. 직원들의 정보를 출력하되, 소속된 부서ID 에 해당하는 부서명도
--함께 출력해주세요. (힌트 : 두 테이블 모두 부서ID 컬럼이 있음)
SELECT A.직원ID
, A.이름
, B.부서ID
, B.부서명
FROM 직원 A , 부서 B
WHERE A.부서ID = B.부서ID
ORDER BY 부서ID ASC;
INNER JOIN 문법 차이
--오라클 문법
SELECT A.직원ID, A.이름, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID ;
--ANSI 문법
SELECT A.직원ID, A.이름, B.주소
FROM 직원 A INNER JOIN 직원주소 B
--WHERE => ON 변경!
ON (A.직원ID = B.직원ID) ;
OUTER JOIN 문법 차이
--오라클 문법
SELECT A.직원ID, A.이름, B.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID(+) ;
--ANSI 문법 (레프트, 라이트 차이 있음)
SELECT A.직원ID, A.이름, B.주소
--직원 A , 직원주소 B => 직원 A LEFT OUTER JOIN 직원주소 B 변경!
--WHERE B.직원ID(+) 있었음으로 LEFT OUTER JOIN (방향이 반대 개념)
FROM 직원 A LEFT OUTER JOIN 직원주소 B
--WHERE => ON 변경!
ON (A.직원ID = B.직원ID) ;
-- !! 테이블 3개 INNER JOIN은 다음과 같이함.
SELECT A.직원ID, A.이름, A.나이, C.연락처, B.주소
FROM 직원 A INNER JOIN 직원주소 B
ON (A.직원ID, B.직원ID) INNER JOIN 직원연락처 C
ON (A.직원ID, C.직원ID);
--실습 문제 오라클문법 => ANSI문법으로 변경
1.
--오라클 문법
SELECT A.직원ID, A.이름, A.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID = B.직원ID(+)
AND A.직원ID IN('A0005', 'A0008');
--ANSI 문법
SELECT A.직원ID, A.이름, A.주소
FROM 직원 A LEFT OUTER JOIN 직원주소 B
ON (A.직원ID = B.직원ID)
WHERE A.직원ID IN('A0005', 'A0008');
--------------------------------------------
2.
--오라클 문법
SELECT A.직원ID, A.이름, A.주소
FROM 직원 A , 직원주소 B
WHERE A.직원ID(+) = B.직원ID;
--ANSI 문법
SELECT A.직원ID, A.이름, A.주소
FROM 직원 A RIGTH OUTER JOIN 직원주소 B
ON(A.직원ID = B.직원ID);
--------------------------------------------
3.
--오라클 문법
SELECT A.직원ID, A.이름, A.나이, B.연락처
FROM 직원 A, 직원연락처 B
WHERE A.직원ID = B.직원ID ;
--ANSI 문법
SELECT A.직원ID, A.이름, A.나이, B.연락처
FROM 직원 A INNER JOIN 직원연락처 B
ON(A.직원ID = B.직원ID) ;
--------------------------------------------
4.
직원 테이블과 직원주소 테이블 , 직원연락처 테이블을
[직원ID] 컬럼으로 “=“ 조인 하려고 합니다.
INNER JOIN으로 위 세 개의 테이블을 조인해보세요.
(ANSI 문법 적용)
[ 직원 테이블 : 직원ID , 이름 , 나이 ]
[ 직원주소 테이블 : 주소 ]
[ 직원연락처 테이블 : 연락처 ]
--ANSI 문법
SELECT A.직원ID, A.이름, A.나이, C.연락처, B.주소
FROM 직원 A INNER JOIN 직원주소 B
ON (A.직원ID, B.직원ID) INNER JOIN 직원연락처 C
ON (A.직원ID, C.직원ID);