RDBMS는 관계형 데이터 베이스를 관리한다. 관계형 데이터 베이스란 테이블 사이에 관계가 있다는 이야기다. 즉, 테이블 사이에 관계가 있다는 건데 이러한 관계를 만드는 방법이 조인이다.
관계를 맺는 다는 거는 아래의 그림으로 나타낼 수 있을 것이다.
우리가 여기서 눈 여겨보야할 점은 부서번호라는 컬럼이다.
사원테이블과 부서 테이블의 연결고리를 담당하는 컬럼이 부서번호 컬럼이다.
여기서 생각해보야할 점은 테이블 간 연결고리 컬럼은 이름과 데이터형이 동일해야한다는 것이다.
내부 조인은 두 테이블의 연결관계 컬럼을 이용해서 공통적인 부분을 추출해낼때 사용한다.
Oracle Inner Join
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
dept_master b
WHERE a.dept_id = b.dept_id
ORDER BY a.emp_id;
위에는 코드이고 아래는 해당 코드에 대한 결과이다.
우리가 알 수 있는 점 중에 하나는 두 테이블이 가지는 공통적인 컬럼의 경우 합쳐져서 보여질 때 만약 둘 다 명시가 되어있다면 DEPT_ID_1처럼 뒤에 _1이 붙는다는 것이다.
그럼 항상 둘 다 써줘야하나? 그건 아니다. 아마 이 책에서는 이러한 기능이 존재한다를 보여주고 싶어서 쓴것이고 우리가 신경써야하는 점은 WHERE절이다. 해당 절에서 우리는 공통적으로 가지는 속성에 대한 처리를 해줬다. 따라 이를 바탕으로 테이블을 조인한 것이다. 만약 위의 같은 상황이 발생하기를 원하지 않느 경우 SQL문을 아래와 같이 바꿔주면 된다.
ANSI Inner Join
ANSI 방식으로로 Inner Join을 구성하면 아래와 같이 SQL문을 만들 수 있다.
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
INNER JOIN dept_master b
ON a.dept_id = b.dept_id
ORDER BY a.emp_id;
알 수 있는 차이점의 경우 WHERE가 INNER JOIN ~ ON ~으로 바뀌었다는 것이다
다음은 Inner Join과 관련된 실습 코드이다.
1.
Q) 내부 조인으로 남성만 조회하는 SQL
Oracle 버전
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id
b.dept_id, b.dept_name, b.use_yn
FROM emp_master a
,dept_master b
WHERE a.dept_id = b.dept_id
AND a.gender = '남성'
ORDER BY a.emp_id;
ANSI 버전
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id
b.dept_id, b.dept_name, b.use_yn
FROM emp_master a
INNER JOIN dept_master b
ON a.dept_id = b.dept_id
WHERE a.gender = '남성'
ORDER BY a.emp_id;
2.
Q) 여러 테이블을 조인
Oracle 버전
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id
,b.dept_id, b.dept_name, b.use_yn
,c.address_id, c.citiy, c.gu, c.address_name
FROM emp_master a
,dept_master b
,address_master c
WHERE a.dept_id = b.dept_id
AND a.address_id = c.address_id
AND a.gender = '남성'
ORDER BY a.emp_id;
ANSI 버전
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id
,b.dept_id, b.dept_name, b.use_yn
,c.address_id, c.citiy, c.gu, c.address_name
FROM emp_master a
INNER JOIN dept_master b
ON a.dept_id = b.dept_id
INNER JOIN address_master c
ON a.address_id = c.address_id
WHERE a.gender = '남성'
ORDER BY a.emp_id;
본 글은 '누구나 쉽게 SQL'이라는 책을 읽고 정리한 내용입니다.
http://www.yes24.com/Product/Goods/74311553
더 많은 내용을 알고 싶은 분은 위의 책을 보시길 바랍니다.
긴 글 읽어주셔서 감사합니다.
틀린 부분이 있으면 댓글을 달아주시면 감사하겠습니다.
📧 : may3210@g.skku.edu
'개발 > Oracle' 카테고리의 다른 글
[Database] 서브 쿼리 (0) | 2022.02.15 |
---|---|
[Database] 테이블 간 관계 맺기 - 외부 조인과 카티션 곱 (0) | 2022.02.15 |
[Database] 집합 쿼리 (0) | 2022.02.15 |
[Database] 데이터 집계 - HAVING (0) | 2022.02.15 |
[Database] 데이터 집계 - GROUP BY (0) | 2022.02.15 |