안녕하세요 "타이니스타" 입니다
이 카테고리에서 다룰 내용은 프로그램 관점의 데이터베이스, 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 <- 부서별로 정렬하고 각 부서에서 이름별로 정렬.