쌓고 쌓다
[Oracle] 조인(JOIN), 카티션 곱 본문
조인(JOIN)
하나의 SQL 명령문으로 여러 테이블에 저장된 데이터를 이용하여 조회할 수 있다.
종류:
EX) 학번이 10101인 학생의 이름과 소속 학과 이름을 출력
SELECT name, student.deptno, dname
FROM student, department
WHERE student.deptno=department.deptno;
student 테이블에 학번(studno), 학생의 이름(name), 학과 번호(deptno)가 있고
department에 학과 번호(deptno), 학과 이름(dname)이 있다.
여기서 student 테이블의 학과 번호와 department의 학과 번호를 매치시켜
일치하는 department 테이블의 행을 가져와 사용한다.
여기서
student의 deptno(학과 번호)는 student.deptno로
department의 deptno는 department.deptno로 명시하였다.
이것은 칼럼 이름의 애매모호성을 해결하고자 한 것이다.
칼럼 이름의 애매모호성
아래의 쿼리문을 보자.
SELECT sutdno, name, deptno, dname
FROM student, department
WHERE deptno=depno;
student 테이블의 deptno(학과 번호)인지 department 테이블의 deptno(학과번호)인지
모호하다.
어떤 테이블의 칼럼을 가져와 사용하는지 명시할 필요가 있다.
그래서 아래처럼 해결한다.
SELECT studno, name, student.deptno, dname
FROM student, department
WHERE student.deptno=department.deptno;
=> 동일한 칼럼 이름이 있는 경우 칼럼 이름 앞에 테이블의 이름을 명시해주자.
테이블 별명
테이블 이름이 긴 경우 가독성이 떨어진다.
FROM절에 테이블 이름 다음 공백을 두고 별명을 정의한다
SELECT s.studno, s.name, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno=d.deptno;
주의! - 쿼리 작성 시 테이블 이름과 별명을 혼용할 수 없다.
(혼용 에러 1)
SELECT s.studno, student.name
FROM student s;
(혼용 에러 2)
SELECT student.studno, s.name, s.deptno, d.dname
FROM student s, department d
WHERE s.deptno=department.deptno;
검색 조건 추가한 조인
EX) '전인하' 학생의 학번, 이름, 학과 이름, 학과 위치를 출력
SELECT studno, name, dname, loc
FROM student s, department d
WHERE name='전인하' AND s.deptno=d.deptno;
EX) 몸무게가 80kg 이상인 학생의 학번, 이름, 체중, 학과이름, 그리고 학과 위치를 출력
SELECT studno, name, weight, dname, loc
FROM student s, department d
WHERE weight>=80 AND s.deptno=d.deptno;
카티션 곱
SELECT table1.column, table2.column
FROM table1 CROSS JOIN table2
두 개 이상의 테이블에 대해 연결 가능한 행을 모두 결합한다.
조인 조건을 생략하거나 잘못 설정한 경우 발생한다.
대용량의 테스트 데이터를 생성하기 위해 사용한다.
CROSS JOIN 키워드를 사용하여 카티션 곱 처리 가능(조인 조건 생략해도 가능).
카티션 곱을 이해해보자.
department의 데이터
student의 데이터
student 테이블 한 행 한 행을 department의 모든 행에 결합한다고 보면 된다.
student 테이블의 데이터는 16개다. department의 데이터는 7개이다.
student 테이블의 데이터 하나를 department 데이터 7개에다 조인을 하므로
카티션 곱을 하면 총 16*7=112건의 데이터가 생성될 것이다.
카티션 곱의 결과.
(방법 1)
SELECT name, student.deptno, dname, loc
FROM student, department ORDER BY name;
(방법 2)
SELECT name, student.deptno, dname, loc
FROM student CROSS JOIN department ORDER BY name;
방법1과 방법2은 동일한 카티션 곱 결과가 나온다.
결과
각 학생 한 명당 department의 모든 행에 대해 조인이 된 것이 보인다.
이것이 카티션 곱이다.
EX) 학생 테이블과 부서 테이블을 카티션 곱
SELECT name, s.deptno, dname
FROM student s, department d ORDER BY name;
SELECT name, s.deptno, dname
FROM student s CROSS JOIN department d ORDER BY name;
'프로그래밍 > SQL' 카테고리의 다른 글
오라클 중심의 SQL 배움터 2장 연습문제 풀이 (0) | 2022.11.02 |
---|---|
[Oracle] EQUI JOIN, NON-EQUI JOIN (0) | 2022.11.01 |
[Oracle] HAVING (0) | 2022.10.31 |
[Oracle] GROUPING SETS (0) | 2022.10.31 |
[Oracle] ROLLUP, CUBE, GROUPING (0) | 2022.10.31 |