SQL - DML의 FROM 와 JOIN 사용법 - 23.11.17~20

songmin jeon·2023년 11월 17일
0
post-thumbnail

1. FROM 절


  • FROM 절에 별칭을 사용하여 SELECT에 연결해줌
  • FROM 절에서는 AS 대신 공백으로 별칭을 사용함.

SELECT A.직원ID, A.이름, B.부서명
FROM 직원 A, 부서 B


2. JOIN

2.0. JOIN ? 종류 쓰임 구별하기

--카티션(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;

2.1 JOIN

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;

2.2 INNER JOIN 와 OUTER JOIN

2.2.1 INNER JION


2.2.2 OUTER JION

(+) 기호가 있으면 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;

2.3 ANSI 문법

  1. (+) 기호는 오라클에서만 사용
  2. (+) 기호가 없으면 INNER JOIN
  3. (+) 기호가 붙은 쪽의 반대쪽 테이블을 기준
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);


profile
제가 한 번 해보겠습니다.

0개의 댓글