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 |
댓글