자격증/정보처리기사 📌 [정보처리기사] SQL 응용 : DML-JOIN
  • 728x90
    반응형

     

    데이터베이스 구축 - SQL 응용

     

    목차

       

       

      JOIN의 개념

      📌 JOIN(조인)은 2개의 테이블에 대해 연관된 튜플을 결합하여, 하나의 새로운 릴레이션을 반환한다.

      • JOIN은 크게 INNER JOIN과 OUTER JOIN으로 구분된다.
      • JOIN은 일반적으로 FROM절에 기술하지만, 릴레이션이 사용되는 어느 곳에서나 사용할 수 있다.

       

       

      INNER JOIN

      📌 INNER JOIN은 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분된다.

          • 조건이 없는 INNER JOIN을 수행하면 CROSS JOIN과 동일한 결과를 얻을 수 있다.

       

      EQUI JOIN

      • EQUI JOIN은 JOIN 대상 테이블에서 공통 속성을 기준으로 '='(equal) 비교에 의해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN 방법이다.
      • EQUI JOIN에서 JOIN 조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이중 중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법을 NATURAL JOIN이라고 한다.
      • EQUI JOIN에서 연결 고리가 되는 공통 속성을 JOIN 속성이라고 한다.

      💡 CROSS JOIN(교차 조인)
      - 교차 조인은 조인하는 두 테이블에 있는 튜플들의 순서쌍을 결과로 반환한다.
      - 교차 조인의 결과로 반환되는 테이블의 행의 수는 두 테이블의 행 수를 곱한 것과 같다.(카티션 곱)

       

      • WHERE 절을 이용한 EQUI JOIN의 표기 형식

      SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1, 테이블명2, 

          WHERE 테이블명1.속성명 = 테이블명2.속성명;

       

      • NATURAL JOIN절을 이용한 EQUI JOIN의 표기 형식

      SELECT [테이블명1.]속성명, [테이블2.]속성명, ... FROM 테이블명1 NATURAL JOIN 테이블명2;

       

      • JOIN ~ USING절을 이용한 EQUI JOIN의 표기 형식

      SELECT [테이블명1.]속성명, [테이블명2]속성명, ... FROM 테이블명1 JOIN 테이블명2 USING(속성명);

       

      실무에서 가장 많이 사용되는 조인 형식은 WHERE절을 이용한 조인이다.

       

      <학생>

      학번 이름 학과코드 선배 성적
      15 고길동 com   83
      16 이순신 han   96
      17 김선달 com 15 95
      19 아무개 han 16 75
      37 박지민   17 55

       

      <학과>

      학과코드 학과명
      com 컴퓨터
      han 국어
      eng 영어

       

      <성적등급>

      등급 최저 최고
      A 90 100
      B 80 89
      C 60 79
      D 0 59

       

      🔔 예제1) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '확과명'을 출력하는 SQL문을 작성하시오.

       

      • SELECT 학생.학번, 학생.이름, 학생.학과코드, 학과.학과명 FROM 학생, 학과 WHERE 학생.학과코드 = 학과.학과코드;
      • SELECT 학생.학번, 학생.이름, 학생.학과코드, 학과.학과명 FROM 학생 NATURAL JOIN 학과;
      • SELECT 학생.학번, 학생.이름, 학생.학과코드, 학과.학과명 FROM 학생 JOIN 학과 USING(학과.학과코드);

       

      <결과>

      학번 이름 학과코드 학과명
      15 고길동 com 컴퓨터
      16 이순신 han 국어
      17 김선달 com 컴퓨터
      19 아무개 han 국어

       

      💡 NATURAL JOIN은 조인할 속성을 지정하지 않기 때문에 조인하려는 두 테이블에는 이름과 도메인이 같은 속성이 반드시 존재해야 한다. <학생> 테이블과 <학과> 테이블에는 같은 이름의 속성과 범위가 같은 도메인을 갖는 '학과코드'가 있기 때문에 NATURAL JOIN 가능한 것이다.

       

      NON-EQUI JOIN

      • NON-EQUI JOIN은 JOIN 조건에 '=' 조건이 아닌 나머지 비교 연산자, 즉 >, <, <>, >=, <= 연산자를 사용하는 JOIN 방법이다.
      • 표기 형식

      SELECT [테이블명1.]속성명, [테이블명2].속성명, ... FROM 테이블명1, 테이블명2, ... WHERE (NON-EQUI JOIN 조건);

       

      🔔 예제2) <학생> 테이블과 <성적등급> 테이블을 JOIN하여 각 학생의 '학번', '이름', '성적', '등급'을 출력하는 SQL문을 작성하시오.

       

      SELECT 학생.학번, 학생.이름, 학생.성정, 성적등급.등급 FROM 학생, 성적등급 WHERE 학생.성적 BETWEEN 성적등급.최저 AND 성적등급.최고;

       

      <결과>

      학번 이름 성적 등급
      15 고길동 83 B
      16 이순신 95 A
      17 김선달 95 A
      19 아무개 75 C
      37 박지민 55 D

       

       

       

      OUTER JOIN

      📌 OUTER JOIN은 릴레이션에서 JOIN 조건에 만족하지 않는 튜플도 결과로 출력하기 위한 JOIN 방법으로, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.

       

      • LEFT OUTER JOIN : INNER JOIN의 결과를 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않는 좌측 항의 릴레이션에 있는 튜플들을 전부 출력하고 우측 항에 해당하는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.
        • 표기 형식
          • SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
            FROM 테이블명1 LEFT OUTER JOIN 테이블명2
            ON 테이블명1.속성명 = 테이블명2.속성명;
          • SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
            FROM 테이블명1, 테이블명2
            WHERE 테이블명1.속성명 = 테이블명2.속성명(+);
      • RIGHT OUTER JOIN : INNER JOIN의 결과를 구한 후, 좌측 항 릴레이션의 어떤 튜플과도 맞지 않는 우측 항의 릴레이션에 있는 튜플들을 전부 출력하고 좌측 항에 해당하는 튜플들은 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.
        • 표기 형식
          • SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
            FROM 테이블명1 RIGHT OUTER JOIN 테이블명2
            ON 테이블명1.속성명 = 테이블명2.속성명;
          • SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
            FROM 테이블명1, 테이블명2
            WHERE 테이블명1.속성명(+) = 테이블명2.속성명;
      • FULL OUTER JOIN
        • LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합쳐 놓은 것이다.
        • INNER JOIN의 결과를 구한 후, 좌측 항의 릴레이션의 튜플들에 대해 우측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다. 그리고 유사하게 우측 항의 릴레이션의 튜플드에 대해 좌측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.
        • 표기 형식
          • SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...
            FROM 테이블명1 FULL OUTER JOIN 테이블명2
            ON 테이블명1.속성명 = 테이블명2.속성명;

       

      🔔 예제1) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '학과명'을 출력하는 SQL문을 작성하시오. 이때, '학과코드'가 입력되지 않은 학생도 출력하시오.

       

      • SELECT 학생.학번, 학생.이름, 학생.학과코드, 학과.학과명
        FROM 학생 LEFT OUTER JOIN 학과
        ON 학생.학과코드 = 학과.학과코드;
      • SELECT 학생.학번, 학생.이름, 학생.학과코드, 학과.학과명
        FROM 학생, 학과
        WHERE 학생.학과코드 = 학과.학과코드(+);

       

      💡 해설 : INNER JOIN을 하면 '학과코드'가 입력되지 않는 '박지민'은 출력되지 않는다. 그러므로 JOIN 구문을 기준으로 왼쪽 테이블, 즉 <학생>의 자료는 모두 출력되는 LEFT OUTER JOIN을 사용한 것이다.

       

      <결과>

      학번 이름 학과코드 학과명
      15 고길동 com 컴퓨터
      16 이순신 han 국어
      17 김선달 com 컴퓨터
      19 아무개 han 국어
      37 박지민    

       

      🔔 예제2) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '학과명'을 출력하는 SQL문을 작성하시오. 이때, '학과코드'가 입력 안 된 학생이나 학생이 없는 '학과코드'도 모두 출력하시오.

       

      • SELECT 학생.학번, 학생.이름, 학과.학과코드, 학과.학과명
        FROM 학생 FULL OUTER JOIN 학과
        ON 학생.학과코드 = 학과.학과코드;

       

      💡 해설 : FULL OUTER JOIN을 하면 JOIN 구문으로 연결되지 않는 자료도 모두 출력된다. "박지민"은 '학과코드'가 없고, "eng"는 <핵생> 테이블에 등록되지 않아서 연결고리가 없지만 FULL OUTER JOIN을 했으므로 모두 출력된다.

       

      <결과>

      학번 이름 학과코드 학과명
      15 고길동 com 컴퓨터
      16 이순신 han 국어
      17 김선달 com 컴퓨터
      19 아무개 han 국어
      37 박지민    
          eng 영어

       

       

       

      SELF JOIN

      • SELF JOIN은 같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN을 하는 JOIN 방법이다.
      • 표기 형식
        • SELECT [별칭1.]속성명, [별칭1.]속성명, ...
          FROM 테이블명1 [AS] 별칭1 JOIN 테이블명1 [AS] 별칭2
          ON 별칭1.속성명 = 별칭2.속성명;
        • SELECT [별칭1.]속성명, [별칭1.]속성명, ...
          FROM 테이블명1 [AS] 별칭1, 테이블명1 [AS] 별칭2
          WHERE 별칭1.속성명 = 별칭2.속성명;

       

      🔔 예제) <학생> 테이블을 SELF JOIN하여 선배가 있는 학생과 선배의 '이름'을 표시하는 SQL문을 작성하시오.

       

      • SELECT A.학번, A.이름, B.이름 AS 선배
        FROM 학생 AS A JOIN 학생 AS B
        ON A.선배 = B.학번;
      • SELECT A.학번, A.이름, B.이름 AS 선배
        FROM 학생 AS A, 학생 AS B
        ON A.선배 = B.학번;

      💡 B.이름 AS 선배는 <B>테이블의 '이름'을 출력하되 필드 명을 '선배'로 표시하라는 의미이다.

       

      <결과>

      학번 이름 선배
      17 김선달 고길동
      19 아무개 이순신
      37 박지민 김선달

       

      📌 SELF 조인은 1개의 테이블을 2개의 이름으로 사용하므로 종종 결과가 혼동된다. 이럴 때는 같은 테이블을 2개 그려서 생각하면 쉽게 결과를 알아낼 수 있다. '학번', '이름', '선배' 필드만 사용하므로 3개의 필드만 가지고 생각해 보자.

       

       

      💡 해설 : <A> 테이블의 '선배'와 <B>테이블의 '학번'이 같은 튜플을 조인하면 위 그림과 같이 연결된다. 여기서 두 테이블 간 조인된 튜플들만을 대상으로 <A>테이블에서 '학번', '이름'을 표시하고, <B>테이블에서 이름을 출력하되 필드 명을 '선배'로 하여 출력하면 앞의 결과와 같이 된다.

       

       

       

       

       

       

      728x90
      반응형
    상단으로