전공 지식 정리/데이터베이스 설계

데이터베이스 SQL - join

2022. 12. 19. 22:45

 

정규화와 JOIN

 

정규화

이상현상 발생을 피하기 위해 테이블을 분할

학계 / 실무에서 주로 3차 정규형을 사용한다.

 

JOIN

데이터의 통합 조회를 위해 여러 테이블들을 연결한다.

실제 JOIN 연산은 두 개의 테이블에 대해서만 적용된다.

일반적인 경우 PK / FK의 연관에 의해 JOIN이 성립한다.

 

우선 EMP 테이블 (직원)

 

DEPT 테이블 (부서)

 

SALGRADE 테이블 (급여 등급)

 

이 세 가지 테이블을 이용해 실습하자

 

 

JOIN의 유형

1) 동등 조인 / 비동등 조인

2) 내부 조인 / 외부 조인 / 크로스 조인 / 셀프 조인

3) 암시적 조인 / 명시적 조인

 

 

1) 동등 조인 / 비동등 조인

 

동등 조인

조인 조건으로 Equal 연산 사용한다.

중복 칼럼의 경우, 칼럼명 앞에 테이블을 붙여야 한다.

중복되지 않는 칼럼도 칼럼명 앞에 테이블명을 붙이는 것을 권장한다.

ex ) 사원명, 부서번호(EMP의), 부서명 출력

// EMP 테이블에 부서명이 없으니 동등 조인해서 가져온다.

SELECT EMP.ENAME, EMP.DEPTNO, DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

 

위 코드에서 ALIAS 사용하기 ( 사용할거면 다른 절에서도 제대로 적용하자 )

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

 

비동등 조인

조인 조건으로 Equal 이외의 연산을 사용한다.

Q) EMP 테이블과 SALGRADE 테이블로부터 사원명, 급여, 급여 등급을 출력하는 질의를 완성하시오

SELECT E.ENAME 사원명, E.SAL 급여, S.GRADE 급여등급
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN LOSAL AND HISAL;

 

 

2) 내부 조인 / 외부 조인 / 크로스 조인 / 셀프 조인

 

내부 조인

서로 대응되는 내용만 검색하는 조인이다.

조인절을 필수로 사용한다. 조인의 Default 이므로 "INNER" 생략 가능하다.

암시적 조인 (가독성이 떨어짐)

SELECT E.ENAME, E.DEPTNO, E.SAL, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.SAL > 2000;

 

명시적 조인 (표준)

SELECT E.ENAME, E.DEPTNO, E.SAL, D.DNAME
FROM EMP E INNER JOIN DEPT D -- 여기서 "INNER"는 생략 가능
ON E.DEPTNO - D.DEPTNO
WHERE E.SAL > 2000;

 

Q ) 이름에 'S' 포함하는 사원의 사원이름, 부서코드, 부서명 출력

SELECT E.ENAME 사원이름, E.DEPTNO 부서코드, D.DNAME 부서명
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.ENAME LIKE '%S%';

 

NATURAL 조인

내부 조인의 특수한 경우다.

두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 동등 조인을 수행한다.

조인의 대상이 되는 칼럼에는 ALIAS 사용할 수 없다.

Q ) 다음 NATURAL 조인과 동일한 출력 갖는 내부 조인 질의를 작성하시오.

SELECT EMPNO, ENAME, DEPTNO, DNAME
FROM EMP NATURAL JOIN DEPT;

A )

-- 암시적 조인
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

-- 명시적 조인
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- 위 ON 조건절을 아래의 USING 조건절로 바꿀 수도 있다.
-- ON E.DEPTNO = D.DEPTNO; 을 USING DEPTNO; 변경 가능

 

외부 조인

서로 대응되지 않는 행도 출력하는 조인이다.

조건절을 필수로 사용한다.

성능 저하 원인이 될 수도 있으니 필요한 경우만 사용하자

LEFT OUTER JOIN

왼쪽 테이블의 데이터를 모두 읽은 후 오른쪽 테이블에서 JOIN 데이터를 가져온다.

RIGHT OUTER JOIN

오른쪽 테이블의 데이터를 모두 읽은 후 왼쪽 테이블에서 JOIN 데이터를 가져온다.

 

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

 

FULL OUTER JOIN

양쪽 테이블의 데이터를 모두 읽은 후, 상대 테이블에서 JOIN 테이블을 가져온다.

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

-- 위 코드와 아래 코드는 동일 (합집합)
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
UNION
SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO

 

CROSS JOIN(교차 조인)

두 테이블의 곱집합을 출력하는 조인이다.

별도의 조인 조건이 없다.

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME
FROM EMP E CROSS JOIN DEPT D; -- 14 * 4 해서 56 행 출력됨

 

Q ) 다음 5가지 JOIN으로 생성되는 각 결과 레코드 수는?

SELECT S.DEPT, D.D_ID
FROM STUDENT S INNER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 3개

SELECT S.DEPT, D.D_ID
FROM STUDENT S CROSS JOIN DEPT D;
-- 정답 : 12개

SELECT S.DEPT, D.D_ID
FROM STUDENT S LEFT OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 4개

SELECT S.DEPT, D.D_ID
FROM STUDENT S RIGHT OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 4개

SELECT S.DEPT, D.D_ID
FROM STUDENT S FULL OUTER JOIN DEPT D
ON S.DEPT = D.D_ID;
-- 정답 : 5개

 

SELF JOIN (셀프 조인)

동일 테이블 사이의 조인

  FROM 절에 동일 테이블이 두 번 이상 나타난다.

테이블 식별을 위해 반드시 ALIAS를 사용해야 한다.

  동일한 테이블을 개념적으로 서로 다른 두 개의 테이블로 사용한다.

FROM EMP E INNER JOIN EMP M

 

Q ) EMP 테이블로부터 사원의 사번과 이름, 매니저의 사번과 이름을 출력하기 위한 질의 작성

(단, 매니저가 없는 사원의 정보도 출력되어야 한다.)

SELECT E.EMPNO, E.ENAME, M.EMPNO MGRNO, M.ENAME MNAME
FROM EMP E LEFT OUTER JOIN EMP M
ON E.MGR = M.EMPNO

 

 

 

 

'전공 지식 정리 > 데이터베이스 설계' 카테고리의 다른 글

데이터베이스 SQL - Subquery  (0) 2022.12.19
데이터베이스 SQL - TCL, DCL  (0) 2022.11.30
데이터베이스 SQL - Multi-row Function (다중 행 함수)  (0) 2022.11.29
데이터베이스 SQL - Function  (0) 2022.11.28
데이터베이스 SQL문 DDL  (0) 2022.10.24
'전공 지식 정리/데이터베이스 설계' 카테고리의 다른 글
  • 데이터베이스 SQL - Subquery
  • 데이터베이스 SQL - TCL, DCL
  • 데이터베이스 SQL - Multi-row Function (다중 행 함수)
  • 데이터베이스 SQL - Function
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 김영한 스프링 강의
  • java 알고리즘
  • 무서운 이야기
  • 코테 알고리즘
  • 유닉스
  • 김영한의 스프링 핵심 원리
  • Unity 공부
  • 부트 jpa 게시판 프로젝트
  • Java 백준 문제풀이
  • C++ 알고리즘
  • 인공지능
  • 스프링부트 블로그 프로젝트
  • 김영한 스프링 입문
  • 디지털 논리회로
  • 스프링 공부
  • React&Spring 강의수강
  • 데이터베이스 설계
  • java
  • 운영체제
  • Java 코테 나만의 팁
  • 노마드코더의 zoom클론코딩
  • 스프링부트 프로젝트
  • 스프링 프로젝트
  • 백준 c++

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
데이터베이스 SQL - join
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.