등가 조인과 비 등가 조인(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 시진영
'SQL 공부 기록' 카테고리의 다른 글
SQL 10 - 서브 쿼리 : 단일 행 서브 쿼리 (0) | 2021.11.05 |
---|---|
SQL 9 - 조인 : 자기 참조 조인(Self join)과 외부조인(Outer join) (0) | 2021.11.04 |
SQL 7 - BETWEEN과 IN 연산자 (0) | 2021.10.28 |
SQL 6 - 관계 연산자와 LIKE 연산자 (0) | 2021.10.27 |
SQL 5 - WHERE 절을 이용한 조건 검색 (0) | 2021.10.26 |