정규화와 SELECT (II) 웹데이터베이스
학과 학생 과목 학과 지도교수 학과학번성명 수강과목 담당교수 A 김수정 A 0001 고길동 성질이론 김수정 B 허영만 A 0002 둘리 한식의멋 허영만 C 강풀 B 0003 희동이 심리학의이해 강풀 과목 _ 성적 학번 수강과목 성적 0001 성질이론 A 0001 한식의멋 C 0002 성질이론 A 0002 한식의멋 B 0003 한식의멋 B 0004 심리학의이해 C 0005 심리학의이해 A 0006 생활체육 B B 0004 도우너 B 0005 또치 C 0006 마이콜 생활체육 이현세
Cartesian Product 두테이블에존재하는행들의연결 o 앞선학과테이블과학과테이블의 Cartesian Product o 결과는두테이블의행의곱의개수만큼나온다. 학과 A B C 지도교수김수정허영만강풀 학과 학번 성명 A 0001 고길동 A 0002 둘리 B 0003 희동이 B 0004 도우너 B 0005 또치 C 0006 마이콜
Cartesian Product SELECT * FROM hsdept, hsstudent;
(INNER) JOIN 앞선 Cartesian Product 의예에서학과테이블의학과명과학생테이블의학과명이다른자료는의미없는자료이다. 이의미없는연결을없애보자. o SELECT * FROM hsdept, hsstudent WHERE hsdept.deptname = hsstudent.deptname; o JOIN 조건이이와같이같다 (=) 일경우동등조인이라한다.
(INNER) JOIN SQL : AS o Alias 의줄임말로현재쿼리에한해임시로이름을바꿔사용한다. o TABLE 명에대해바꿔사용할경우 ( 열이름의경우도대동소이 ) SELECT A.deptName FROM hsdept AS A; 해당쿼리내에서테이블의이름을 AS 이후에지정한문자열로바꿔사용한다. 열의이름은다른테이블과중복사용시임시이름. 열이름으로가리킨다.
(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 이라한다.
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)
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;
JOIN o SELECT A.deptName, A.deptProf, B.studentID, B.studName FROM hsdept as A JOIN hsstudent as B USING (deptname); JOIN 조건으로참여할열의이름이같고동등조인을실시할경우 USING 을사용하면편리하다.
역정규화를통한테이블합치기 과목 _ 성적 학번수강과목성적 0001 성질이론 A 0001 한식의멋 C 0002 성질이론 A 0002 한식의멋 B 0003 한식의멋 B 0004 심리학의이해 C 0005 심리학의이해 A 0006 생활체육 B 과목 수강과목담당교수 학번 수강과목 담당교수성적 0001 성질이론 김수정 A 0001 한식의멋 허영만 C 0002 성질이론 김수정 A 0002 한식의멋 허영만 B 0003 한식의멋 허영만 B 0004 심리학의이해 강풀 C 성질이론 한식의멋 심리학의이해 김수정 허영만 강풀 0005 심리학의이해강풀 A 0006 생활체육이현세 B 생활체육 이현세
SELECT B.studentID, B.className, A.profName, B.studScore FROM hsclass as A JOIN hsclassscore as B USING (classname);
학생 학과학번성명 A 0001 고길동 A 0002 둘리 B 0003 희동이 B 0004 도우너 B 0005 또치 C 0006 마이콜 학과학번성명지도교수 A 0001 고길동김수정 A 0001 고길동김수정 A 0002 둘리김수정 A 0002 둘리김수정 B 0003 희동이허영만 학과학과 A B C 지도교수김수정허영만강풀 B 0004 도우너허영만 B 0005 또치 이현세 C 0006 마이콜 강풀
SELECT A.deptName, A.studentID, A.studName, B.deptProf FROM hsstudent as A JOIN hsdept as B USING(deptName);
학생 학과학번 성명 지도교수 A 0001 고길동 김수정 A 0001 고길동 김수정 A 0002 둘리 김수정 A 0002 둘리 김수정 B 0003 희동이 허영만 B 0004 도우너 허영만 B 0005 또치 이현세 C 0006 마이콜 강풀 과목 _ 성적 학번 수강과목 담당교수성적 0001 성질이론 김수정 A 0001 한식의멋 허영만 C 0002 성질이론 김수정 A 0002 한식의멋 허영만 B 학과학번 성명 지도교수 수강과목 성적담당교수 A 0001 고길동 김수정성질이론 A 김수정 A 0001 고길동 김수정한식의멋 C 허영만 A 0002 둘리 김수정한식의멋 B 허영만 A 0002 둘리 김수정성질이론 A 김수정 B 0003 희동이 허영만성질이론 B 김수정 B 0004 도우너 허영만심리학의이해 C 강풀 B 0005 또치 이현세심리학의이해 A 강풀 C 0006 마이콜 강풀 생활체육 B 이현세 0003 한식의멋 허영만 B 0004 심리학의이해 강풀 C 0005 심리학의이해 강풀 A 0006 생활체육 이현세 B
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);
다음시간에는 OUTER JOIN 에대해알아보고 Facebook Page 에올려주세요 PHP 를알아봅시다!