'PK FK'에 해당되는 글 1건

  1. 2018.03.19 3. 데이터베이스 - PK, FK 그리고 기초 SQL
2018. 3. 19. 10:39

안녕하세요  "타이니스타" 입니다


이 카테고리에서 다룰 내용은 프로그램 관점의 데이터베이스, sql 등입니다.

즉흥적으로 써내려가는만큼 부족한 부분이 많겠지만 감안하고 봐주시기 바랍니다.

 

 

PK. 테이블의 레코드를 구분할 수 있는 최소의 컬럼.  FK. PK에 참조되며 같은 데이터를 지닐 수 있는 컬럼. PK 부.  FK 자 .    부모와 자식관계로 볼 수 있습니다.

 PK는 주로 학번, 주민번호, 사원번호 등  유일한 값을 가지는 컬럼이 주로 PK의 대상이 됩니다.

 예 )

학생table 

학번(pk)    이름       주소             학과번호(fk)

  1111       홍길동   옛날옛날             a11

  1112       강감찬   먼옛날                a11

  1113       대장군   전장터                a12

  1114       김철수   뒷동네                a12

 

학과table

학과번호(pk)   학과명

   a11             수학과

   a12             영문과

 

위와 같이 두개의 테이블이 있습니다.  학생 테이블에서 학생 개개인을 유일하게 구분할 수 있는 컬럼으로 학번이 적절하기에 PK가 되며  학과번호 컬럼은 중복이 되기에 구분이 가능한 키가 아닙니다만

학과 테이블의  학과번호와 연결될 수 있기에 FK 가 됩니다. 이러한 관계를 통해 두 테이블은 조합하여 데이터를 추출할 수 있게 됩니다.  예를들어 학생 테이블의 모든 학생의  학번, 이름, 학과명을 출력하고자  하면

 

select 학번, 이름, 학과table.학과명

   from 학생table, 학과table

 where 학생table.학과번호 = 학과table.학과번호 ;

 

라고 조인을 걸어서 해결할 수 있습니다. 이렇게 pk 와 fk를 나누게 된 이유는 데이터의 중복을 최소화 하기 위한 정규화에 의해 테이블이 나뉘어졌기 때문입니다. 예를들어 학생, 학과 테이블로 나눠지지 않고 처음부터 합쳐져 있었다면

 

합쳐진table

학번    이름          주소     학과번호   학과명

1111    홍길동    옛날옛날     a11       수학과

1112    강감찬     먼옛날       a11       수학과

1113    대장군     전장터       a12       영문과

1114    김철수     뒷동네       a12       영문과

 

으로 되있겠으나 학과명이 중복됩니다. 현재 예제는 컬럼의 양이 적어서 크게 느껴지지 않겠지만

컬럼이 10개 20개 30개만 되도 엄청난 데이터의 낭비가 발생함을 알 수 있습니다. 이렇게 중복되는 데이터를 최소화 하고자  정규화가 생겨났습니다.

이 정규화에는 제1정규화 제2정규화 등  다양한 방식이 존재합니다. 정규화에 대한 자료는 인터넷에 검색하면 쉽게 얻을 수 있으니 자세한 내용은 생략합니다.

 

결론 -  PK와 FK는 관계형 데이터베이스 RDBMS 에서 반드시 필요하다.

 

pk는 데이터를 구분할 수 있는 컬럼이며 fk는 pk와 대응되거나 null 값을 갖는다 정도로 정리하겠습니다.

 


2번 글에서 말씀드린 SELECT SQL 에 내용 추가 합니다.

 SELECT

 - 출력하고 하는 컬럼들을 명시하는 영역.

SELECT EMPNO, EMPNM, DEPTNM    <- EMP테이블의 사원번호, 사원명, 부서명을 출력.

 FROM EMP

 

FROM

 - 출력할 컬럼의 데이터가 있는 테이블을 불러오는 영역.

SELECT EMPNO, EMPNM, DEPTNM

 FROM EMP   <-  SELECT 절에서 출력하고자 하는 데이터가 들어있는 테이블 명을 명시.

  

WHERE

 - FROM 절에서 불러온 테이블에 조건을 줘서 데이터를 걸러주는 영역.

SELECT EMPNO, EMPNM, DEPTNM

FROM EMP

WHERE EMPNM LIKE '김%'  <- 사원의 이름이 김 씨로 시작하는 사람들만 출력

   

GROUP BY

 - 걸러진 데이터를 토대로 그룹으로 묶어주는 영역.

SELECT COUNT(EMPNO), DEPTNM

FROM EMP

GROUP BY DEPTNM   <-  부서별로 그룹화.  COUNT = 몇 개의 데이터가 있는지 알아내는 함수로서 부서명을 그룹화 하였으므로 부서별로 몇명이 있는지 알 수 있음.

  

ORDER BY

 - 출력결과에 정렬을 해주는 영역.

SELECT EMPNO, EMPNM, DEPTNM

FROM EMP

ORDER BY DEPTNM, EMPNM   <-  부서별로 정렬하고 각 부서에서 이름별로 정렬.


Posted by 타이니스타