1. 정규화와 SELECT (II)
웹 데이터 베이스
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
2. 학과 학생 과목
학과 지도교수 학과 학번 성명 수강과목 담당교수
A 김수정 A 0001 고길동 성질이론 김수정
B 허영만 A 0002 둘리 한식의 멋 허영만
C 강풀 B 0003 희동이 심리학의 이해 강풀
B 0004 도우너 생활체육 이현세
과목_성적
B 0005 또치
학번 수강과목 성적
C 0006 마이콜
0001 성질이론 A
0001 한식의 멋 C
0002 성질이론 A
0002 한식의 멋 B
0003 한식의 멋 B
0004 심리학의 이해 C
0005 심리학의 이해 A
0006 생활체육 B
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
3. Cartesian Product
• 두 테이블에 존재하는 행들의 연결
o 앞선 학과 테이블과 학과 테이블의 Cartesian Product
o 결과는 두 테이블의 행의 곱의 개수 만큼 나온다.
학과 지도교수 학과 학번 성명
A 김수정 A 0001 고길동
B 허영만 A 0002 둘리
C 강풀 B 0003 희동이
B 0004 도우너
B 0005 또치
C 0006 마이콜
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
4. Cartesian Product
• SELECT * FROM hsDept, hsStudent;
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
5. (INNER) JOIN
• 앞선 Cartesian Product의 예에서 학과 테이블의 학과명
과 학생 테이블의 학과명이 다른 자료는 의미없는 자료이
다.
• 이 의미없는 연결을 없애보자.
o SELECT * FROM hsDept, hsStudent
WHERE hsDept.deptName = hsStudent.deptName;
o JOIN 조건이 이와 같이 같다(=)일 경우 동등 조인이라 한다.
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
6. (INNER) JOIN
• SQL : AS
o Alias 의 줄임말로 현재 쿼리에 한해 임시로 이름을 바꿔 사용한다.
o TABLE 명에 대해 바꿔 사용할 경우 (열이름의 경우도 대동소이)
• SELECT A.deptName FROM hsDept AS A;
• 해당 쿼리내에서 테이블의 이름을 AS 이후에 지정한 문자열로 바꿔
사용한다.
• 열의 이름은 다른 테이블과 중복 사용시 임시이름.열이름으로 가리
킨다.
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
7. (INNER) JOIN
• 앞선 예에서 deptName이 중복되어 나타난다. 이 중복
을 없애보자.
o SELECT A.deptName, A.deptProf, B.studentID, B.studName
FROM hsDept as A, hsStudent as B
WHERE A.deptName = B.deptName;
o 이와 같이 중복되는 열을 제거한 것을 NATURAL JOIN 이라 한다.
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
8. JOIN
• MySQL에서 제공하는 Join
o http://dev.mysql.com/doc/refman/5.1/en/join.html
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor
ON conditional_expr
| table_reference {LEFT|RIGHT} [OUTER] JOIN
table_reference join_condition
| table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr
| USING (column_list)
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
9. JOIN
• 앞선 (INNER) JOIN을 MySQL에서 제공하는 (INNER)
JOIN 문을 통해 알아보자.
o SELECT A.deptName, A.deptProf, B.studentID, B.studName
FROM hsDept as A JOIN hsStudent as B
ON A.deptName = B.deptName;
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
10. JOIN
o SELECT A.deptName, A.deptProf, B.studentID, B.studName
FROM hsDept as A JOIN hsStudent as B
USING (deptName);
• JOIN 조건으로 참여할 열의 이름이 같고 동등 조인을 실시할 경우
USING을 사용하면 편리하다.
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
11. 역 정규화를 통한 테이블 합치기
과목_성적
학번 수강과목 성적
0001 성질이론 A 성
학번 수강과목 담당교수
0001 한식의 멋 C 적
0002 성질이론 A 0001 성질이론 김수정 A
0002 한식의 멋 B
0003 한식의 멋 B
0001 한식의 멋 허영만 C
0004 심리학의 이해 C
0002 성질이론 김수정 A
0005 심리학의 이해 A
0006 생활체육 B 0002 한식의 멋 허영만 B
과목 0003 한식의 멋 허영만 B
수강과목 담당교수 0004 심리학의 이해 강풀 C
성질이론 김수정
0005 심리학의 이해 강풀 A
한식의 멋 허영만
0006 생활체육 이현세 B
심리학의 이해 강풀
생활체육 이현세
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
12. • SELECT B.studentID, B.className, A.profName,
B.studScore
FROM hsClass as A JOIN hsClassScore as B
USING (className);
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
13. 학생
학과 학번 성명
A 0001 고길동
학과 학번 성명 지도교수
A 0002 둘리
A 0001 고길동 김수정
B 0003 희동이
A 0001 고길동 김수정
B 0004 도우너
A 0002 둘리 김수정
B 0005 또치
A 0002 둘리 김수정
C 0006 마이콜
B 0003 희동이 허영만
B 0004 도우너 허영만
학과
B 0005 또치 이현세
학과 지도교수
C 0006 마이콜 강풀
A 김수정
B 허영만
C 강풀
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
14. • SELECT
A.deptName, A.studentID, A.studName, B.deptProf
FROM hsStudent as A JOIN hsDept as B
USING(deptName);
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
15. 학생
학과 학번 성명 지도교수
A 0001 고길동 김수정
A 0001 고길동 김수정
A 0002 둘리 김수정
A 0002 둘리 김수정
B 0003 희동이 허영만
학과 학번 성명 지도교수 수강과목 성적 담당교수
B 0004 도우너 허영만
A 0001 고길동 김수정 성질이론 A 김수정
B 0005 또치 이현세
A 0001 고길동 김수정 한식의 멋 C 허영만
C 0006 마이콜 강풀
A 0002 둘리 김수정 한식의 멋 B 허영만
과목_성적 A 0002 둘리 김수정 성질이론 A 김수정
학번 수강과목 담당교수 성적
B 0003 희동이 허영만 성질이론 B 김수정
0001 성질이론 김수정 A
B 0004 도우너 허영만 심리학의 이해 C 강풀
0001 한식의 멋 허영만 C
B 0005 또치 이현세 심리학의 이해 A 강풀
0002 성질이론 김수정 A
C 0006 마이콜 강풀 생활체육 B 이현세
0002 한식의 멋 허영만 B
0003 한식의 멋 허영만 B
0004 심리학의 이해 강풀 C
0005 심리학의 이해 강풀 A
0006 생활체육 이현세 B
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com
16. • SELECT * FROM
( SELECT B.studentID AS sid, B.className AS cn,
A.profName AS pn, B.studScore AS sc
FROM hsClass as A JOIN hsClassScore as B
USING (className) ) AS AB
JOIN
( SELECT C.deptName AS dn, C.studentID AS sid,
C.studName AS sn, D.deptProf AS 에
FROM hsStudent as C JOIN hsDept as D
USING(deptName) ) AS CD
USING (sid);
한림대학교 금융정보통계학과 이 윤 환, yoonani72@gmail.com