Eggs Sunny Side Up
본문 바로가기
Computer Engineering/DB_Oracle

FROM_조인(join)

by guswn100059 2023. 3. 2.

1. JOIN 의미와 원리

 

문제)

// 테스트 데이터 생성 쿼리

CREATE TABLE 고객 (
고객번호 VARCHAR2(5) PRIMARY KEY , 
고객명 VARCHAR2(50) NOT NULL 
) ; 

CREATE TABLE 고객전화번호 ( 
고객번호 VARCHAR2(5) ,
전화구분코드 VARCHAR2(10) ,
전화번호 VARCHAR(15) NOT NULL 
) ; 

ALTER TABLE 고객전화번호 ADD CONSTRAINT PK_고객전화번호 PRIMARY KEY(고객번호 , 전화구분코드) ; 
INSERT INTO 고객 VALUES ( '0001' , '동동일' ) ; 
INSERT INTO 고객 VALUES ( '0002' , '동동이' ) ; 
INSERT INTO 고객 VALUES ( '0003' , '동동삼' ) ; 
INSERT INTO 고객전화번호 VALUES ( '0001' , '집전화' , '062-111-1111') ; 
INSERT INTO 고객전화번호 VALUES ( '0001' , '휴대폰' , '010-1111-1111') ; 
INSERT INTO 고객전화번호 VALUES ( '0002' , '휴대폰' , '010-2222-2222') ; 
INSERT INTO 고객전화번호 VALUES ( '0004' , '휴대폰' , '010-4444-4444') ; 
COMMIT;

 

SELECT * FROM 고객 ;
SELECT * FROM 고객전화번호 ;

//문제 1) 고객 테이블과 고객전화번호 테이블을 카티션 조인해서 고객 테이블에서는 고객번호와 고개명을,
		  고객전화번호 테이블에서는 전화번호 컬럼을 출력해주세요.
SELECT A.고객번호
     , A.고객명
     , B.전화번호
 FROM 고객 A
     ,고객전화번호 B ;
     
//문제 2) 고객 테이블과 고객전화번호 테이블을 각각 고객번호 컬럼으로 연결해서
		  고객 테이블에서는 고객번호와 고객명을, 고객전화번호 테이블에서는 전화번호 컬럼을 출력해주세요.
SELECT A.고객번호
     , A.고객명
     , B.전화번호
  FROM 고객 A
     , 고객전화번호 B
 WHERE A.고객번호 = B.고객번호 ;
 
//문제 3) 고객번호가 0001인 고객의 고객번호, 고객명, 집전화 연락처를 출력해주세요.
SELECT A.고개번호
     , A.고객명
     , B.전화번호
  FROM 고객 A
     , 고객전화번호 B
 WHERE A.고객번호 = '0001' ;
   AND B.전화구분코드 = '집전화' ;

 

2. 동등JOIN / 비동등JOIN

동등 JOIN : 조인 조건이 모두 "="인 경우

비동등 JOOIN : 조인 조건이 하나라도 "="가 아닌 경우

 

3. INNER JOIN / OUTER JOIN

SELECT A.고객번호
     , A.고객명
     , B.전화번호
  FROM 고객 A
     , 고객전화번호 B
 WHERE A.고객번호(+) = B.고객번호 ;
--OUTER JOIN은 조인에 실패한 튜플도 출력
--1. (+)기호는 오라클에서만 사용.
--2. (+)기호가 붙은 쪽의 반대쪽 테이블을 기준으로 함.
--3. (+)기호가 없으면 INNER JOIN.'

문제)

--문제1. 직원 테이블과 직원주소 테이블은 둘 다 직원ID 컬럼을 가지고 있습니다.
--이 컬럼으로 동등("=") 조인을 하면 서로 연관이 있는 튜플만 출력이 됩니다.
--아래와 같은 결과가 되도록 조인으로 출력을 해주세요.
--[직원테이블 : 직원ID, 성별, 나이]
--[직원주소 테이블 : 직원ID, 구분코드, 주소]
SELECT A.직원ID
     , A.성별
     , A.나이
     , B.직원ID
     , B.구분코드
     , B.주소
  FROM 직원 A
     , 직원주소 B
 WHERE A.직원ID = B.직원ID ;
 
 
--문제2. 1번에서 작성한 쿼리 결과에서 추가로 일반 조건을 작성하려고 합니다.
--직원ID가 A0007인 직원의 정보만 출력되도록 작성해주세요.
SELECT A.직원ID
     , A.성별
     , A.나이
     , B.직원ID
     , B.구분코드
     , B.주소
  FROM 직원 A
     , 직원주소 B
 WHERE A.직원ID = B.직원ID
   AND A.직원ID = 'A0007';
--INNTER JOIN은 상관없지만 OUTER JOIN에서는 테이블 잘 확인하고 출력해야함!


--문제3. 직원 테이블과 직원주소 테이블을 [직원ID] 컬럼으로 “=“ 조인하려고 합니다. 
--이 때 직원주소 테이블에는 없는 직원들의 정보도 출력되도록 아우터조인으로
--쿼리를 작성해주세요. (힌트: 기준테이블은 직원 테이블입니다)
--[ 직원 테이블 : 직원ID , 성별 , 나이 ] 
--[ 직원주소 테이블 : 직원ID , 구분코드 , 주소 ]
SELECT A.직원ID
     , A.성별
     , A.나이
     , A.이름
     , B.직원ID
     , B.구분코드
     , B.주소
  FROM 직원 A
     , 직원주소 B
 WHERE A.직원ID = B.직원ID(+) ;
 
 
--문제4.3번에서 작성한 쿼리에서 추가로 일반 조건을 입력하려고 합니다. 
--이번에는 주소정보가 없는 직원들만 출력되도록 쿼리를 작성해주세요.
--힌트 : IS NULL , IS NOT NULL
SELECT A.직원ID
     , A.성별
     , A.나이
     , A.이름
     , B.직원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.나이
     , B.주소
     , C.연락처
  FROM 직원 A
     , 직원주소 B
     , 직원연락처 C
 WHERE A.직원ID = B.직원ID 
   AND B.직원ID = C.직원ID;
 
SELECT * FROM 직원;
SELECT * FROM 직원주소;
SELECT * FROM 직원연락처 ;

--문제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.구분코드 = '휴대폰';
--IN()은 OR의미로 작성됨.
   

--문제7. 직원들의 정보를 출력하되, 소속된 부서ID 에 해당하는 부서명도
--함께 출력해주세요. (힌트 : 두 테이블 모두 부서ID 컬럼이 있음)
SELECT A.직원ID
     , A.이름
     , A.부서ID
     , B.부서명
  FROM 직원 A
     , 부서 B
 WHERE A.부서ID = B.부서ID ;

 

 

 

 

 

'Computer Engineering > DB_Oracle' 카테고리의 다른 글

복습용문제_230303  (0) 2023.03.03
ANSI문법  (0) 2023.03.02
복습용문제_20230302  (0) 2023.03.02
FROM_기본  (0) 2023.02.28
WHERE_부정연산, NULL조건, SQL 연산자  (0) 2023.02.28

댓글