H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • OUTER JOIN
  • 샘플 데이터
  • 기본적인 외부 조인
  • 외부 조인과 그룹 함수
  1. Database
  2. Oracle
  3. SQL
  4. 사용자 명령
  5. 테이블 조인

외부 조인

OUTER JOIN

OUTER JOIN은 한쪽 테이블을 기준으로 설정하여 다른 테이블을 합치는 형태의 JOIN이다. 따라서 기준이 되는 테이블의 데이터는 모두 출력되며, 연결된 데이터가 없을 경우에는 null로 출력되는 특징을 가지게 된다.

샘플 데이터

OUTER JOIN을 살펴보기 위한 샘플 테이블과 데이터는 다음과 같다.

create table room(
room_no number primary key,
room_name varchar2(30) not null
);

create table reservation(
reservation_no number primary key,
person_name varchar2(30) not null,
start_date char(10) not null,
end_date char(10) not null,
room_no references room(room_no) on delete cascade
);

insert into room values(1, '스위트룸');
insert into room values(2, 'VIP룸');
insert into room values(3, '머시룸');
insert into room values(4, '골룸');

insert into reservation values(11, '세종대왕', '2020-12-01', '2020-12-03', 1);
insert into reservation values(12, '박혁거세', '2020-12-04', '2020-12-05', 1);
insert into reservation values(13, '백결선생', '2020-12-01', '2020-12-02', 2);
insert into reservation values(14, '의자왕', '2020-12-10', '2020-12-10', 1);
insert into reservation values(15, '김유신', '2020-12-04', '2020-12-07', 3);
insert into reservation values(16, '원효대사', '2020-12-09', '2020-12-10', 3);
insert into reservation values(17, '정몽주', '2020-12-01', '2020-12-02', 2);
insert into reservation values(18, '문익점', '2020-12-20', '2020-12-23', 1);
insert into reservation values(19, '강감찬', '2020-12-24', '2020-12-25', 1);
insert into reservation values(20, '대조영', '2020-12-15', '2020-12-16', 2);
commit;

table room

room_no

room_name

1

스위트룸

2

VIP룸

3

머시룸

4

골룸

table reservation

reservation_no

person_name

start_date

end_date

room_no

11

세종대왕

2020-12-01

2020-12-03

1

12

박혁거세

2020-12-04

2020-12-05

1

13

백결선생

2020-12-01

2020-12-02

2

14

의자왕

2020-12-10

2020-12-10

1

15

김유신

2020-12-04

2020-12-07

3

16

원효대사

2020-12-09

2020-12-10

3

17

정몽주

2020-12-01

2020-12-02

2

18

문익점

2020-12-20

2020-12-23

1

19

강감찬

2020-12-24

2020-12-25

1

20

대조영

2020-12-15

2020-12-16

2

기본적인 외부 조인

외부 조인(OUTER JOIN)은 기준이 있어야 하기 때문에 어느 테이블을 기준으로 하느냐에 따라서 구조가 달라진다.

  • 방을 기준으로 예약 정보를 조회 : room ←─── reservation (예약이 없는 방이 존재하게됨)

  • 예약 정보를 기준으로 방을 조회 : room ───→ reservation (사실상 EQUI JOIN과 같아짐)

select 
    room.room_no, room.room_name, 
    reservation.person_name, reservation.start_date, reservation.end_date
from room 
    left outer join reservation on room.room_no = reservation.room_no
order by room.room_no asc;

room_no

room_name

person_name

start_date

end_date

1

스위트룸

강감찬

2020-12-24

2020-12-25

1

스위트룸

박혁거세

2020-12-04

2020-12-05

1

스위트룸

의자왕

2020-12-10

2020-12-10

1

스위트룸

세종대왕

2020-12-01

2020-12-03

1

스위트룸

문익점

2020-12-20

2020-12-23

2

VIP룸

백결선생

2020-12-01

2020-12-02

2

VIP룸

대조영

2020-12-15

2020-12-16

2

VIP룸

정몽주

2020-12-01

2020-12-02

3

머시룸

김유신

2020-12-04

2020-12-07

3

머시룸

원효대사

2020-12-09

2020-12-10

4

골룸

만약 EQUI JOIN을 했다면 4번 room은 매칭되는 데이터가 존재하지 않기 때문에 나오지 않아야 하지만 OUTER JOIN에서는 출력됨을 확인할 수 있다. room이 기준이기 때문에 매칭되는 데이터가 없으면 비어있는 상태로 출력된다.

room left outer join reservation on room.room_no = reservation.room_no

OUTER JOIN은 기준이 있기 때문에 기준에 따라 방향이 정해지며, 지금은 room이 기준이고 왼쪽에 배치되어 LEFT OUTER JOIN으로 사용하였으나, 방향만 바꾸면 다음과 같이 표현도 가능하다.

reservation right outer join room on room.room_no = reservation.room_no

또한 각각의 테이블에 별칭을 부여하여 구문을 간소화 시킬 수도 있다.

select 
    rm.room_no, rm.room_name, 
    res.person_name, res.start_date, res.end_date
from room rm
    left outer join reservation res on rm.room_no = res.room_no
order by rm.room_no asc;

외부 조인과 그룹 함수

외부 조인을 그룹 함수와 사용하면 다음과 같은 데이터들을 조회할 수 있다.

  • 각각의 방에 대한 예약 건수

  • 각각의 방에 대한 가장 빠른 예약 일자 / 마지막 예약 일자

예약일자 알아보기

각각의 방에 대한 최초 입실 날짜와 최종 퇴실날짜를 알아보는 구문이다.

select 
    rm.room_no "방번호", rm.room_name "방이름", 
    min(rm.start_date) "최초입실",
    max(rm.end_date) "최종퇴실"
from room rm
    left outer join reservation res on rm.room_no = res.room_no
group by rm.room_no, rm.room_name
order by rm.room_no asc;

방번호

방이름

최초입실

최종퇴실

1

스위트룸

2020-12-01

2020-12-25

2

VIP룸

2020-12-01

2020-12-16

3

머시룸

2020-12-04

2020-12-10

4

골룸

예약건수 알아보기

예약 건수를 구할 때 주의할 점은 4번 room처럼 빈칸이 나와도 개수를 세기 때문에 미리 필터링을 한번 더 해야한다는 것이다.

select 
    rm.room_no "방번호", rm.room_name "방이름", nvl("예약건수", 0) "예약건수"
from
    room rm
        left outer join (
            select room_no, count(*) 예약건수 from reservation group by room_no
        ) res
        on rm.room_no = res.room_no
order by rm.room_no asc;

방번호

방이름

예약건수

1

스위트룸

5

2

VIP룸

3

3

머시룸

2

4

골룸

0

nvl 함수를 쓰지 않으면 4번이 null로 나오기 때문에 처리하기 위하여 nvl 함수를 사용하였다.

Previous등가 조인NextHR 계정

Last updated 3 years ago