목차
📌 JOIN(조인)은 2개의 테이블에 대해 연관된 튜플을 결합하여, 하나의 새로운 릴레이션을 반환한다.
📌 INNER JOIN은 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분된다.
💡 CROSS JOIN(교차 조인)
- 교차 조인은 조인하는 두 테이블에 있는 튜플들의 순서쌍을 결과로 반환한다.
- 교차 조인의 결과로 반환되는 테이블의 행의 수는 두 테이블의 행 수를 곱한 것과 같다.(카티션 곱)
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1, 테이블명2,
WHERE 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블2.]속성명, ... FROM 테이블명1 NATURAL JOIN 테이블명2;
SELECT [테이블명1.]속성명, [테이블명2]속성명, ... FROM 테이블명1 JOIN 테이블명2 USING(속성명);
실무에서 가장 많이 사용되는 조인 형식은 WHERE절을 이용한 조인이다.
<학생>
학번 | 이름 | 학과코드 | 선배 | 성적 |
15 | 고길동 | com | 83 | |
16 | 이순신 | han | 96 | |
17 | 김선달 | com | 15 | 95 |
19 | 아무개 | han | 16 | 75 |
37 | 박지민 | 17 | 55 |
<학과>
학과코드 | 학과명 |
com | 컴퓨터 |
han | 국어 |
eng | 영어 |
<성적등급>
등급 | 최저 | 최고 |
A | 90 | 100 |
B | 80 | 89 |
C | 60 | 79 |
D | 0 | 59 |
🔔 예제1) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '확과명'을 출력하는 SQL문을 작성하시오.
<결과>
학번 | 이름 | 학과코드 | 학과명 |
15 | 고길동 | com | 컴퓨터 |
16 | 이순신 | han | 국어 |
17 | 김선달 | com | 컴퓨터 |
19 | 아무개 | han | 국어 |
💡 NATURAL JOIN은 조인할 속성을 지정하지 않기 때문에 조인하려는 두 테이블에는 이름과 도메인이 같은 속성이 반드시 존재해야 한다. <학생> 테이블과 <학과> 테이블에는 같은 이름의 속성과 범위가 같은 도메인을 갖는 '학과코드'가 있기 때문에 NATURAL JOIN 가능한 것이다.
SELECT [테이블명1.]속성명, [테이블명2].속성명, ... FROM 테이블명1, 테이블명2, ... WHERE (NON-EQUI JOIN 조건);
🔔 예제2) <학생> 테이블과 <성적등급> 테이블을 JOIN하여 각 학생의 '학번', '이름', '성적', '등급'을 출력하는 SQL문을 작성하시오.
SELECT 학생.학번, 학생.이름, 학생.성정, 성적등급.등급 FROM 학생, 성적등급 WHERE 학생.성적 BETWEEN 성적등급.최저 AND 성적등급.최고;
<결과>
학번 | 이름 | 성적 | 등급 |
15 | 고길동 | 83 | B |
16 | 이순신 | 95 | A |
17 | 김선달 | 95 | A |
19 | 아무개 | 75 | C |
37 | 박지민 | 55 | D |
📌 OUTER JOIN은 릴레이션에서 JOIN 조건에 만족하지 않는 튜플도 결과로 출력하기 위한 JOIN 방법으로, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.
🔔 예제1) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '학과명'을 출력하는 SQL문을 작성하시오. 이때, '학과코드'가 입력되지 않은 학생도 출력하시오.
💡 해설 : INNER JOIN을 하면 '학과코드'가 입력되지 않는 '박지민'은 출력되지 않는다. 그러므로 JOIN 구문을 기준으로 왼쪽 테이블, 즉 <학생>의 자료는 모두 출력되는 LEFT OUTER JOIN을 사용한 것이다.
<결과>
학번 | 이름 | 학과코드 | 학과명 |
15 | 고길동 | com | 컴퓨터 |
16 | 이순신 | han | 국어 |
17 | 김선달 | com | 컴퓨터 |
19 | 아무개 | han | 국어 |
37 | 박지민 |
🔔 예제2) <학생> 테이블과 <학과> 테이블에서 '학과코드' 값이 같은 튜플을 JOIN하여 '학번', '이름', '학과코드', '학과명'을 출력하는 SQL문을 작성하시오. 이때, '학과코드'가 입력 안 된 학생이나 학생이 없는 '학과코드'도 모두 출력하시오.
💡 해설 : FULL OUTER JOIN을 하면 JOIN 구문으로 연결되지 않는 자료도 모두 출력된다. "박지민"은 '학과코드'가 없고, "eng"는 <핵생> 테이블에 등록되지 않아서 연결고리가 없지만 FULL OUTER JOIN을 했으므로 모두 출력된다.
<결과>
학번 | 이름 | 학과코드 | 학과명 |
15 | 고길동 | com | 컴퓨터 |
16 | 이순신 | han | 국어 |
17 | 김선달 | com | 컴퓨터 |
19 | 아무개 | han | 국어 |
37 | 박지민 | ||
eng | 영어 |
🔔 예제) <학생> 테이블을 SELF JOIN하여 선배가 있는 학생과 선배의 '이름'을 표시하는 SQL문을 작성하시오.
💡 B.이름 AS 선배는 <B>테이블의 '이름'을 출력하되 필드 명을 '선배'로 표시하라는 의미이다.
<결과>
학번 | 이름 | 선배 |
17 | 김선달 | 고길동 |
19 | 아무개 | 이순신 |
37 | 박지민 | 김선달 |
📌 SELF 조인은 1개의 테이블을 2개의 이름으로 사용하므로 종종 결과가 혼동된다. 이럴 때는 같은 테이블을 2개 그려서 생각하면 쉽게 결과를 알아낼 수 있다. '학번', '이름', '선배' 필드만 사용하므로 3개의 필드만 가지고 생각해 보자.
💡 해설 : <A> 테이블의 '선배'와 <B>테이블의 '학번'이 같은 튜플을 조인하면 위 그림과 같이 연결된다. 여기서 두 테이블 간 조인된 튜플들만을 대상으로 <A>테이블에서 '학번', '이름'을 표시하고, <B>테이블에서 이름을 출력하되 필드 명을 '선배'로 하여 출력하면 앞의 결과와 같이 된다.
📌 SQL 활용 - 사용자 정의 함수/DBMS 접속 기술 (0) | 2024.02.22 |
---|---|
📌 [정보처리기사] SQL 활용 - 프로시저(Procedure)/트리거(Trigger) (0) | 2024.02.21 |
📌 [정보처리기사]데이터베이스 구축 - SQL 응용/DML SELECT (0) | 2024.02.19 |
📌 [정보처리기사] 데이터베이스 구축 - SQL 응용/DML (0) | 2024.02.16 |
📌 [정보처리기사] 데이터베이스 구축 - SQL 응용/DCL (0) | 2024.02.16 |