Oracle/개념

4장. JOIN

2024. 6. 12. 18:26
728x90

 컴퓨터 상에 다양한 저장 장치가 존재한다. 그 중 대표적으로 하드 디스크(Hard Disk Drive, HDD)가 있다. 그 속에 다양한 데이터들이 있다.

 

 컴퓨터에게 값을 검색하라 하면 하드 디스크에서 메모리(Random Access Memory)로 올린다. 데이터 값과 Block이라는 값이 통째로 Bocker를 통해서 들어간다. Block 사이즈가 작더라도 원하지 않는 값까지 모두 들어간다.

 효율적으로 데이터를 전달하려면 테이블이 나뉘어져 있어야 효과적으로 전달할 수 있다. 쪼개져서 올라오면 속도가 빠르지만, 원하는 데이터들을 합쳐서 보내줘야 한다. 이러한 원리를 JOIN이라고 한다.

 

 

JOIN을 하는 이유

 정규화라는 개념이 있다. 논리적 일관성을 유지하기 위해 하나의 큰 테이블을 여러 개로 쪼개는 것이다. 쪼개다 보면 합쳐야 하는 순간이 있는데(JOIN) 논리적 차원에서 쪼개는 방법(정규화) 때문에라도 JOIN해야 한다.

 

 데이터는 정규화라는 방법을 통해 자른다(분해한다). 필요할 때마다 JOIN을 사용해서 원하는 정보를 빼낸다.

 

 

[ Oracle Join 문법 ]

테이블 명을 굳이 붙이지 않아도 컴퓨터가 알아서 출력한다.

SELECT table1.col1. table2.col2
FROM table1 alias1, table2 alias2
WHERE table1.col2 = table2.col2;

 

[ ANSI Join 문법 ]

JOIN하고자 하는 테이블들 사이에 JOIN을 쓴다.

SELECT table1.col1. table2.col1
FROM table1 alias1 [INNER] JOIN table2 alias2
ON table1.col2 = table2.col2;

 

 

 Join에서 사용되는 용어 중 선행 테이블(driving table 또는 inner table)과 후행 테이블(driven table 또는 outer table)이라는 용어가 있다. Join이 수행될 때는 두 개 이상의 테이블이 사용되는데 이때 둘 중 하나의 테이블을 먼저 읽고 조인 조건 절을 확인하여 나머지 테이블에 가서 데이터를 가져오게 된다.

 이때 먼저 읽는 테이블을 선행 테이블이라고 하고 뒤에 읽는 테이블을 후행 테이블이라고 한다. 선행 테이블은 조회할 데이터가 적은 테이블로 선택해야 속도 면에서 유리하다.

 

 

 


 

 

 

1. Cartesian Product (카디션 곱)

 조인 대상 테이블들의 조건이 누락되었을 경우 발생하는 현상으로, 해당 조인에 참여하는 모든 대상 행을 다 출력한다. 즉 두 테이블의 모든 가능한 행 조합을 생성하는 것이다. 값을 실로 엮듯이(스티칭) 한다. 최대로 나오는 값보다 작게 나온다.

 

카디션 곱을 사용하는 이유

  • 데이터를 복제해서 원본 테이블을 반복해서 읽는 것을 피하기 위해
  • 실수로 조인 조건 컬럼 중 일부를 빠뜨리는 경우

 

SELECT *
FROM table1
CROSS JOIN table2;

 

  table1의 값이 3개, table2의 값이 3개가 있다고 하자. 만약 이 문법을 사용하여 table1과 table2를 Join하여 실행한다면 모든 값을 조합하여 결과값을 나열한다.

 

 

 


 

 

 

2. EQUI Join (등가 Join)

JOIN 중 가장 기본적인 JOIN이다. 두 테이블 간의 특정 열 또는 열 집합에서 값이 동일한 행을 결합하는 조인 방식이다. INNER JOIN과 OUTER JOIN과 함께 사용된다.

 

 

[ Oracle Join 문법 ]

SELECT table1.col1. table2.col2
FROM table1 alias1, table2 alias2
WHERE table1.col2 = table2.col2;

 

[ ANSI Join 문법 ]

SELECT table1.col1. table2.col1
FROM table1 alias1 JOIN table2 alias2
ON table1.col2 = table2.col2;

 

 

컬럼이 3개 이상인 경우

SELECT col1, col2, col3
FROM table1, table2
WHERE table1.col4 = table2.col4;

 

 

 SELECT 절에 JOIN 문장을 작성할 때는 "테이블-이름.컬럼-이름"같은 형태로 적어주면 된다. 컬럼 이름이 하나의 테이블에만 있을 경우 테이블 이름을 생략해도 자동으로 테이블 이름을 찾아가서 실행하기도 한다. 양쪽 모두 존재하는 컬럼일 경우 반드시 테이블 이름을 함께 적는다.

 

 

 


 

 

 

 

3. Non-Equi Join (비등가 Join)

 equal이 아닌 것을 사용해서 JOIN하는 방식이다. 등가 조인이 아닌, 등가가 아닌 조건으로 두 테이블을 결합한다. 등호 연산자가 아닌 다른 비교 연산자를 사용하여 조인 조건을 정의한다. 주로 범위를 지정하거나, 특정 조건을 충족하는 경우에 사용된다.

 

 

[ Oracle Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1, table2 t2
WHERE 조건식;

 

[ ANSI Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1 JOIN table2 t2
ON 조건식;

 

 

컬럼이 3개 이상인 경우

# Oracle Join 구문

SELECT t1.col1 "별칭1", t2.col2 "별칭2", t3.col3 "별칭3"
FROM table1 t1, table2 t2, table3 t3
WHERE 조건식;


# ANSI Join 구문

SELECT t1.col1 "별칭1", t2.col2 "별칭2", t3.col3 "별칭3"
FROM table1 t1 JOIN table2 t2
JOIN table3 t3
ON 조건식;

 

 

조건식을 작성할 때 Between 대신 AND을 쓰는 것이 좋다.

 

 

 


 

 

 

 

4. OUTER Join (아우터 조인)   vs   INNER Join(이너 조인)

 OUTER JOIN에는 Left Join과 Right Join이 있다. 값을 출력했을 때 NULL 값이 포함되어 있다면 NULL이 아닌 값을 확장해서 한쪽이 NULL이더라도 추가로 출력한다. 즉 두 개 이상의 값을 나열하여 출력할 때 적어도 하나의 값이 NULL이라도 상관하지 않고 NULL이 아닌 값을 확장해서 추가로 출력한다.

 왼쪽이 더 길게 나오면 LEFT OUTER JOIN이고, 오른쪽이 길면 RIGHT OUTER JOIN이 된다. LEFT OUTER JOIN은 왼쪽을 더 길게 뽑고, RIGHT OUTER JOIN은 오른쪽을 더 길게 뽑는다.

 

 

Left Join

[ Oracle Outer Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1, table2 t2
WHERE t1.col3 = t2.col3(+);

 

[ ANSI Outer Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1 LEFT OUTER JOIN table2 t2
ON t1.col3 = t2.col3;

 

 

RIGHT Join

[ Oracle Outer Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1, JOIN table2 t2
ON t1.col3(+) = t2.col3;

 

[ ANSI Outer Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1 RIGHT OUTER JOIN table2 t2
ON t1.col3 = t2.col3;

 

 

 

 


 

 

 

 

5. SELF Join

 SELF JOIN은 자기 자신과 Join하는 것을 말한다. 즉 자기 자신을 복제해서 자기 자신과 Join한다. 자기 자신을 Join하는 것이므로 결국엔 SELF JOIN이 된다.

 

 

[ Oracle Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1, table2 t2
WHERE t1.mrg = t2.col3;

 

[ ANSI Join 문법 ]

SELECT t1.col1 "별칭1", t2.col2 "별칭2"
FROM table1 t1 JOIN table2 t2
WHERE t1.mrg = t2.col3;

'Oracle > 개념' 카테고리의 다른 글

6장. DML 데이터 관리  (0) 2024.06.13
5장. DDL 명령과 딕셔너리  (0) 2024.06.12
3장. SQL 복수행 함수  (0) 2024.06.12
2장. SQL 단일행 함수  (1) 2024.06.11
1장. SELECT 검색  (1) 2024.06.06