날아라쩡글이의 블로그입니다.

join, 정규화 간단 본문

중앙 HTA (2106기) story/JDBC story

join, 정규화 간단

날아라쩡글이 2021. 10. 27. 09:08
반응형

조인 

  • 두 개 이상의 테이블의 연관 있는 행들끼리 연결해서 새로운 가상의 테이블을 생성하고,
    그 가상의 테이블에서 데이터를 조회하는 것이다. 
  • 조인을 하게 되면 카티션 곱으로 전체의 행이 합해지는 가상의 테이블이 생성되기 때문에 어떤 column이 연결이 되는지 알고 있어야한다.
    • 같은 테이블이던, 다른 테이블이던 참조하고 있는 외래키가 존재하고 있기 때문에 함께 join을 진행해주면 된다.  
    • RDBMS는 모든 정보를 하나의 테이블에 저장하는 것이 아니라, 데이터가 정규화되어 여러 테이블에 분산되어있다. 
    • 데이터가 여러 테이블에 흩어져 있기 때문에 사용자가 원하는 데이터를 찾기 위해서는 여러 테이블을 다 조회해야한다. 
  • SELECT 5
    FROM 1
    WHERE 2(조건절에서 먼저 거르고)
    GROUP BY 3(그룹핑을 진행 후 )
    HAVING 4(필터링을 진행한다. )
    ORDER BY 6
  • 조인은 데이터의 무결성과 중복방지로 테이블이 정규화되어 나눠져 있는 것을 통합하여 조회해야할 일이 많기 떄문에 조인은 필수불가결로 사용하게 된다. 
  • 조인은 여러테이블에 흩어져있는 정보중에서 사용자가 원하는 정보만 가져와서 가상의 테이블처럼 만들어서 데이터를 조회하는 것이다. 
  • 카티션 곱 : FROM절에 조회할 데이터 테이블만 입력해놓은 상태이다. 
    • 조건을 따로 지정해놓지 않았기 때문에 
    •  
      그냥 둘이 붙어있는 행의 형태가 출력된다. 이것을 카티션 곱이라고 한다. 
  • 조인의 종류  : 등가 조인, 비등가 조인, 셀프조인, 포괄조인
    • 등가 조인 : 값이 같은 행끼리 연결 짓는 것을 등가 조인이라고 한다.
      • 테이블 조인하기 
        SELECT 테이블1.컬럼명, 테이블2.컬럼명, ... 
        FROM 테이블 1, 테이블 2
        WHERE 조인조건;
      •  
        • 조인 조건이 반드시 포함되어야한다. 조인조건이 없으면 불필요한 행들이 연결된 것이다. 
        • 등가조인 : 값이 같은 것끼리 연결되게 하는 것 
          조인 조건에서 = 연산자를 사용해서 선행 테이블과 후행테이블의 연관있는 행을 조인시킨다. 
  •  비등가 조인  : TABLE을 하나 만들어야한다.
    • 테이블을 조인할 때 같은 값을 가진 행끼리 조인하는 것이 아니라, 크다/작다 조건을 이용해서 행을 조인시키는 방식이다.
    •  등급(등급마다 보통 최소값/ 최대값 정해져있고, 해당 범위에 속할 때 그 등급이 부여된다. )을 조회할 때 활용된다. 
    •  해당 등급을 계산할 때 사용을 한다. 거의 그 구간의 부여되는 등급 계산시에 사용됨
  • 셀프조인 : 같은 table에서 역활을 나눠서 join하는 것, 상위정보를 알기위해서 self join을 진행한다. 
    • 하나의 테이블 이용해서 조인을 구성하는 것
    • 하나의 테이블 안에 상위데이터, 하위 데이터가 있는 경우 상위데이터와 하위데이터를 서로 연관지어서 조회할 때 셀프 조인을 사용한다. 
    • 하나의 테이블의 역활을 각각 나누어서 조인에 참여시켜야 한다. 
      • SELECT E1.EMPLOYEE_ID, E1.FIRST_NAME EMP_NAME, E2.FIRST_NAME MGR_NAME
        FROM EMPLOYEES E1, EMPLOYEES E2
        WHERE E1.MANAGER_ID = E2.EMPLOYEE_ID
        AND E1.DEPARTMENT_ID = 60;
      •  
      • 테이블안에 연관된 행이 있다.
      • 조직도 메뉴, 카테고리 구성된 계층적인 구조를 가지고, 같은 테이블내에 존재하여, 관계선이 Self조인으로 참조할 행이 안에 존재하게 된다. 
      • 직원테이블안에 상사의 아이디가 있고, 상사의 아이디는 직원의 아이디로 존재하고 있다.
      • 역활을 나눠서 같은 것끼리 연결한다. 
      • 상위정보를 알기위해서 Self join을 진행한다. 
        • 가전제품이 어떤건지 알고 싶다면 상위번호 1000번을 확인하면 하위의 갯수가 나오는 것과 동일하다. 
          • 하위를 찾기 위해 상위를 선택하는 것이다. 
          • 상위를 찾기 위해서는 self join을 사용한다. 
    • 포괄 조인(outer join)
      • 포괄조인은 한쪽테이블에는 데이터가 있고, 다른쪽 테이블에는 데이터가 없는 경우에 데이터가 있는 쪽 테이블의 내용을 null이 없는 행에 (+) 를 붙여 null의 데이터가 출력되게 하는 방법이다. 
      • 비등가, 등가 조인의 경우 null이 없는 행은 출력이 되지 않기 때문에, 포괄조인을 이용하면 null의 항목을 출력할 수 있다. 
      • 쿼리의 실행속도를 많이 떨어뜨리기 때문에 되도록 포괄조인이 되지 않도록, 
        • null값이 없도록 해야한다. default로 값을 설정하는 것이 좋다. 
      • 양쪽 모두에 (+)를 붙일 수 없다. 
        • null행이 필요한 곳에 붙인다. 
        • null이라고 출력되어있는 곳은 (+)를 붙이지 않는다. 그 반대편에 붙여준다 
      • SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, D.MANAGER_ID, E.FIRST_NAME
        FROM DEPARTMENTS D, EMPLOYEES E
        WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID(+)
        ORDER BY DEPARTMENT_ID ASC;
    • 그룹함수 (다중행 함수 )
      • 다중행 함수 혹은 그룹함수는 행의 그룹당 조회결과가 하나 조회되는 함수다. 
      • 행의 그룹을 지정하지 않으면 테이블의 모든행이 하나의 그룹이다. 
      • 행의 그룹을 지정하지 않고 COUNT(*)를 실행하면 모든행에 대해서 함수가 실행된다.  
      • COUNT(*) , COUNT(컬럼명),SUM(컬럼명), AVG(컬럼명), MIN(컬럼명), MAX(컬럼명)
      • GROUP BY절 
        • 테이블의 행을 지정된 컬럼의 값이 같은 것끼리 그룹으로 묶는 것이다. 
        • 엑셀로 비교한다면 필터의 역활을 한다. GROUP BY를 사용하고 다중행함수를 사용하지 않는 경우는 없다. 
        • 다중행함수와 같이 사용하면 그룹마다 다중행 함수를 실행해서 그룹마다 실행결과를 조회할 수 있다. 
        • 테이블에 저장된 데이터에 대해서 그룹별 합계/평균/분산/최소값/최대값/표준편차 등의 결과를 조회할 수 있다. 
        • GROUP BY절에 사용했던 컬럼이나 표현식은 다중행 함수와 같이 SELECT절에서 사용할 수 있다. 
          • 그룹별~~ 이라는 조건형식이 나온다면 GROUP BY를 사용한다.
        • 그냥 진행하게 될 경우
        • 뭐가 뭔지 모르기 때문에 GROUP BY에 사용한 그룹명은 SELECT옆에 작성할 수 있다. 
      • HAVING 조건식
        • 그룹함수를 적용할 결과를 필터링 할 때 사용한다. 
        • WHERE절과 동일한 형태로 사용한다 
        • WHERE절의 조건식에는 그룹함수를 사용할 수 없다. 
        • HAVING절의 조건식에는 그룹함수를 사용할 수 있다. 
        • HAVING절은 GROUP BY절과 함께 사용해야한다. 
          •  단독으로 사용할 수 없다. 
          • IF~ ELSE의 관계처험 GROUP BY에 종속되어있다. 
          • HAVING절에는 일반표현식을 사용해도 상관없다. 
        • 전체 데이터 체크는 오라클에게 엄청난 부담을 주게된다. 
          • WHERE로 필터링을 하고 
          • GROUP BY 그 이후 그룹핑을 진행후 
          • HAVING절로 필터링을 진행해줘야 부담이 적어진다. 
          • WHERE절을 사용하는 것이 제일 중요하다. 
          • 프로젝트시에 많은 사용을 한다. 

정규화 

  • 정규화는 논리적 데이터 모델을 일관성있고, 중복을 제거하여 보다 안정성을 갖는 바람직한 자료구조로 만들기 위해 거치는 단계이다. 
  • 정규화의 단계는 제 1정규형부터 제 5정규형과 BCNF까지 구성되어 있다. 
  • 일반적으로는 제 3정규형의 단계를 거치게 되면 적절하고 일관성을 유지하면서 중복이 없는 논리적 데이터 모델을 구축할 수 있다. 
    • 정규화는 원부이결다조 로 외우면 편하다. 
      • 제 1정규화 : 원자값으로만 구성되어야 한다. 
        • 각 테이블 당 1개씩의 원자값을 가져야한다. 
      • 제 2정규화 : 부분 함수 제거
        • 학번 101번을 조회했는데, 학과장까지 찾아지는 것이다. 
        • 부분적인 부분을 나누는 것을 의미한다. 
      • 제 3정규화 : 이행 함수 제거 ---->여기까지가 적절하고 일관성을 유지, 중복이 없는 모델 구축가능
      • BCNF : 결정자 종속 함수 제거
      • 제 4정규화 : 다중 함수 제거
      • 제 5정규화 : 조인 함수 제거 
  • 목적
    •  데이터를 변경할 때 이상현상을 방지하기 위함이다.
    •  정규화는 변경이상이 발생할 가능성이 있는 엔티티를 정규화된 엔티티로 변환하는 것이다. 
    • 종류 : 삽삭갱 
      • 삽입이상
        • 데이터에는 PRIMARY KEY(기본키)가 존재한다. 고유하고, 유니크한 키이다. 
        • 아무번호를 넣어도 에러가 검출되지 않는것
        • 이상을 막기위해 기본키를 설정하여, 기본키가 존재하지 않으면 입력되지 않는다
      • 삭제이상
        • 부서 ID삭제시 소속부서가 존재할 경우에는 삭제가 되면안된다. 
        • 그러나 삭제가 될 경우 삭제 이상이 발생된다. 
        • 부서 데이터가 존재시 삭제가 되는 것을 막는 것이 삭제이상을 미연에 방지하는 것이다. 
      • 갱신이상
        • 부서 ID수정시 다른 테이블에 존재하는 부서의 ID도 수정이 되어야한다. 
        • 수정이 되지 않을 경우 갱신이상이 발생한다. 
        • 수정이 되게 만드는 것을 수정이상 방지하는 것이다. 
      • 정규화란 고유한 조건을 만들고, 제약조건을 이용하여, 이상현상이 발생되는 것을 막아 데이터의 무결성과 데이터의 중복을 막는 것을 의미한다. 

 

반응형

'중앙 HTA (2106기) story > JDBC story' 카테고리의 다른 글

VIEW,인덱스, 서브쿼리  (0) 2021.10.29
DDL  (0) 2021.10.27
SQL 내장함수, 서브쿼리  (0) 2021.10.25
VO-DAO패턴, 오라클 시퀀스  (0) 2021.10.21
java에서 Insert, select, update, delete사용방법  (0) 2021.10.20
Comments