등가 조인과 비 등가 조인(Equi join, Nequi join : INNER JOIN)

SELECT 테이블1.컬럼, ...테이블2.컬럼, ...
FROM 테이블1, 테이블2, ...
WHERE 조인_조건
AND 일반_조건

- 조인 조건은 두 테이블간의 관계를 수식으로 표현
- 조인 조건은 SELECT 문에 사용된 테이블의 개수에 따라 달라진다.

- 테이블 n개 라면 조인 조건의 개수는 항상 (n-1)개 이상이다.


등가 조인(Equi-join)

: 조인 조건에 '='를 이용하는 조인

 

비 등가 조인(Non equi-join)

: 부등호가 포함된 조인 조건

 

예제 1. 각 사원의 근무 부서를 검색한다.

SELECT eno 사번, ename 이름, emp.dno 부서번호,
	dept.dno 부서번호, dname 부서명
FROM dept, emp
WHERE dept.dno = emp.dno;

사번    이름       부서번호  부서번호  부서명
------- ---------- --------- --------- -------
0001    안영희     01        01        총무
0201    안영숙     01        01        총무
0202    손하늘     01        01        총무
0301    이승철     02        02        회계
0302    박선경     02        02        회계
1001    문시현     10        10        ERP
1002    김주란     20        20        ISP

 

예제 2. 광주에서 근무하는 직원의 명단을 검색한다.(부서번호와 부서명도 검색한다.)

SELECT loc 근무처, d.dno 부서번호, dname 부서명,
	eno 사번, ename 이름
FROM dept d, emp e
WHERE d.dno=e.dno
AND loc = '광주';

근무  부서번호  부서명  사번    이름
----- --------- ------- ------- ----------
광주  30        ITEA    1003    양선호
광주  30        ITEA    2003    정의찬
광주  30        ITEA    2007    이초록

 

예제 3. 각 직원의 급여를 10% 인상한 경우 급여 등급을 검색한다.

SELECT eno 사번, ename 이름, 
	sal*1.1 인상된급여, grade 등급
FROM emp, salgrade
WHERE sal*1.1 BETWEEN losal AND hisal;

사번    이름       인상된급여       등급
------- ---------- ---------- ----------
0309    김선유            990          5
0702    김민지           1210          4
2002    제갈민           1672          4
2007    이초록         2187.9          3
2008    윤고은           2310          3
0269    권나현           2860          3
0801    천유정           3190          2

 

예제 4. 조인 조건이 없는 잘못된 조인문장의 결과를 확인해 보자.

SELECT d.dno, dname, e.dno, ename
FROM dept d, emp e;

DNO     DNAME   DNO     ENAME
------- ------- ------- ----------
01      총무    01      안영희
01      총무    01      안영숙
01      총무    01      손하늘
01      총무    02      이승철
01      총무    02      박선경
01      총무    10      문시현
01      총무    20      김주란

 

(예제 4)와 같은 조인을 Cross join(교차 조인)이라고 하는데 이런 조인은 특별한 경우 사용된다. 

cross join은 잘못된 결과값(Cartesian product)을 생성한다.

 

 

테이블과 관계

* 부모 테이블과 자식 테이블

 

실습

1. 송강 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE pname = '송강'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목이름
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험


2. 과목명에 화학이 포함된 과목을 강의하는 교수의 명단을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목명
FROM professor p, course c
WHERE cname LIKE '%화학%'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목명
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험
1004      시진영     1212      일반화학
1004      시진영     1214      무기화학
1006      장청아     1213      유기화학
1006      장청아     1216      환경화학
1007      이초아     1217      고분자화학
1008      문규식     1218      생화학


3. 학점이 2학점인 과목과 이를 강의하는 교수를 검색한다.

SELECT cno 과목번호, cname 과목이름, st_num 학점, p.pno 교수번호, pname 교수이름
FROM professor p, course c
WHERE st_num = 2
AND p.pno = c.pno;

과목번호  과목이름           학점 교수번호  교수이름
--------- ------------ ---------- --------- ----------
1211      일반화학실험          2 1001      송강
1214      무기화학              2 1004      시진영
1216      환경화학              2 1006      장청아
1218      생화학                2 1008      문규식
1245      실험물리학            2 1013      하영진
1228      위상수학              2 1018      김응전
2313      분류학실험            2 1027      임충원


4. 화학과 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, section 학과, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE section = '화학'
AND p.pno = c.pno;

교수번호  이름       학과    과목번호  과목이름
--------- ---------- ------- --------- ------------
1001      송강       화학    1211      일반화학실험
1004      시진영     화학    1212      일반화학
1006      장청아     화학    1213      유기화학
1004      시진영     화학    1214      무기화학
1006      장청아     화학    1216      환경화학
1007      이초아     화학    1217      고분자화학
1008      문규식     화학    1218      생화학


5. 화학과 1학년 학생의 기말고사 성적을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, result 성적
FROM student s, score r, course c
WHERE major = '화학' 
AND syear = 1
AND s.sno = r.sno
AND c.cno = r.cno;

전공          학년 학번    이름       과목번호  과목명             성적
------- ---------- ------- ---------- --------- ------------ ----------
화학             1 925309  오우재     1211      일반화학실험         71
화학             1 945302  김람석     1212      일반화학             85
화학             1 945303  남궁경아   1212      일반화학             44
화학             1 945314  이철윤     1212      일반화학             47
화학             1 925309  오우재     1213      유기화학             83
화학             1 925309  오우재     1214      무기화학             63
화학             1 945302  김람석     1214      무기화학             93


6. 일반화학 과목의 기말고사 점수를 검색한다.

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적
FROM student s, course c, score r
WHERE cname = '일반화학'
AND c.cno = r.cno
AND s.sno = r.sno;

과목번호  과목이름     학번    이름             성적
--------- ------------ ------- ---------- ----------
1212      일반화학     894501  장봉철             84
1212      일반화학     905301  유태지             87
1212      일반화학     905302  정욱상             82
1212      일반화학     905603  정용정             84
1212      일반화학     913901  황수현             97
1212      일반화학     913902  황진혜             70
1212      일반화학     913903  정도정             57


7. 화학과 1학년 학생의 일반화학 기말 고사 점수를 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, cname 과목이름, result 성적
FROM student s, course c, score r
WHERE major ='화학' 
AND syear = 1
AND cname = '일반화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목이름           성적
------- ---------- ------- ---------- ------------ ----------
화학             1 945302  김람석     일반화학             85
화학             1 945303  남궁경아   일반화학             44
화학             1 945314  이철윤     일반화학             47


8. 화학과 1학년 학생이 수강하는 과목을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목이름
FROM student s, course c, score r
WHERE syear = 1
AND major = '화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목이름
------- ---------- ------- ---------- --------- ------------
화학             1 925309  오우재     1211      일반화학실험
화학             1 945302  김람석     1212      일반화학
화학             1 945303  남궁경아   1212      일반화학
화학             1 945314  이철윤     1212      일반화학
화학             1 925309  오우재     1213      유기화학
화학             1 925309  오우재     1214      무기화학
화학             1 945302  김람석     1214      무기화학


9. 일반화학 과목에서 평가 점수가 A인 학생의 명단을 검색한다.

select * from scgrade;

GRADE      HISCORE    LOSCORE
------- ---------- ----------
A              100         85
B               84         70
C               69         55
D               54         40
F               39          0

 

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE cname = '일반화학'
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno;

과목번호  과목이름     학번    이름             성적 평가점수
--------- ------------ ------- ---------- ---------- ---------
1212      일반화학     905301  유태지             87 A
1212      일반화학     913901  황수현             97 A
1212      일반화학     913908  황진혜             98 A
1212      일반화학     914504  심빈경             88 A
1212      일반화학     915303  정욱주             93 A
1212      일반화학     915602  임주영             96 A
1212      일반화학     918205  독고낭도           94 A


10. 송강 교수의 과목을 수강하는 학생의 기말고사 점수를 성적 순서로 검색한다.

SELECT p.pno 교수번호, pname 교수이름, cname 과목명, s.sno 학번, sname 이름, result 성적
FROM student s, professor p, course c, score r
WHERE pname = '송강'
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno
ORDER BY result DESC;

교수번호  교수이름   과목명       학번    이름             성적
--------- ---------- ------------ ------- ---------- ----------
1001      송강       일반화학실험 924505  서찬호             98
1001      송강       일반화학실험 894501  장봉철             97
1001      송강       일반화학실험 913901  황수현             94
1001      송강       일반화학실험 925602  강아영             94
1001      송강       일반화학실험 915602  임주영             93
1001      송강       일반화학실험 923902  김호야             93
1001      송강       일반화학실험 924502  은정현             91


11. 화학과 1학년 학생의 기말고사 성적을 학점(A,B,C,D,F)으로 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, 
	result 학점, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE major = '화학'
AND syear = 1
AND result BETWEEN loscore AND hiscore
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목명             학점 평가점수
------- ---------- ------- ---------- --------- ------------ ---------- ---------
화학             1 945303  남궁경아   1216      환경화학             99 A
화학             1 925309  오우재     2363      화학실험             99 A
화학             1 945314  이철윤     2370      고생물학             99 A
화학             1 945303  남궁경아   2368      핵화학               99 A
화학             1 945303  남궁경아   2366      물리실험             99 A
화학             1 945303  남궁경아   2365      전자기학             98 A
화학             1 925309  오우재     1228      위상수학             96 A


12. 송강 교수가 강의하는 과목에서 평가 점수가 A인 학생의 명단을 과목명과 함께 검색한다.

SELECT p.pno 교수번호, pname 교수이름, c.cno 과목번호, cname 과목명, s.sno 학번, sname 이름, 
	result 학점, grade 평가점수
FROM student s, professor p, course c, score r, scgrade
WHERE pname = '송강' 
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno
AND p.pno = c.pno;

교수번호  교수이름   과목번호  과목명       학번    이름             학점 평가점수
--------- ---------- --------- ------------ ------- ---------- ---------- ---------
1001      송강       1211      일반화학실험 894501  장봉철             97 A
1001      송강       1211      일반화학실험 905302  정욱상             89 A
1001      송강       1211      일반화학실험 913901  황수현             94 A
1001      송강       1211      일반화학실험 915303  정욱주             86 A
1001      송강       1211      일반화학실험 915601  강태용             87 A
1001      송강       1211      일반화학실험 915602  임주영             93 A
1001      송강       1211      일반화학실험 923902  김호야             93 A


13. 화학과 1학년 학생에게 강의하는 교수의 명단을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, p.pno 교수번호, pname 교수이름
FROM student s, professor p, course c, score r
WHERE major = '화학'
AND syear = 1
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno;

전공          학년 학번    이름       교수번호  교수이름
------- ---------- ------- ---------- --------- ----------
화학             1 925309  오우재     1001      송강
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영
화학             1 945314  이철윤     1004      시진영
화학             1 925309  오우재     1004      시진영
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영

 

 

+ Recent posts