두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것을 JOIN 이라고 하며, 일반적으로 사용되는 SQL 문장의 상당수가 JOIN 이라고 생각하면 JOIN 의 중요성을 이해하기 쉬울 것이다.
JOIN 은 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능이라고 할 수 있다. 일반적인 경우 행들은 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN 이 성립된다. 하지만 어떤 경우에는 이러한 PK, FK 의 관계가 없어도 논리적인 값들의 연관만으로 JOIN 이 성립 가능하다.
다만 한 가지 주의할 점은 FROM 절에 여러 테이블이 나열되더라도 SQL 에서 데이터를 처리할 때 는 단 두 개의 집합 간에만 조인이 일어난다는 것이다. FROM 절에 A, B, C 테이블이 나열되었더라도 특정 2 개의 테이블만 먼저 조인 처리되고, 2 개의 테이블이 조인되어서 처리된 새로운 데이터 집합과 남은 한 개의 테이블이 다음 차례로 조인되는 것이다. 이 순서는 4 개 이상의 테이블이 사용되더라도 같은 프로세스를 반복한다.
예를 들어 A, B, C, D 4 개의 테이블을 조인하고자 할 경우 옵티마이저는 ( ( (A JOIN D) JOIN C) JOIN B)와 같이 순차적으로 조인을 처리하게 된다. 먼저 A 와 D 테이블을 조인 처리하고, 그 결과 집합과 C 테이블을 다음 순서에 조인 처리하고, 마지막으로 3 개의 테이블을 조인 처리한 집합과 B 테이블을 조인 수행하게 된다.
SELECT 필드명1, 필드명2, .. FROM 테이블1 [INNER, LEFT, RIGHT] JOIN 테이블2 ON 테이블1.연결할필드 = 테이블2.연결할필드;
1. EQUI JOIN
EQUI(등가) JOIN 은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 대부분 PK ↔ FK 의 관계를 기반으로 한다. 그러나 일반적으로 테이블 설계 시에 나타난 PK ↔ FK 의 관계를 이용하는 것이지 반드시 PK ↔ FK 의 관계로만 EQUI JOIN 이 성립하는 것은 아니다. 이 기능은 계층형(Hierarchical)이나 망형(Network) 데이터베이스와 비교해서 관계형 데이터베이스의 큰 장점이다. JOIN 의 조건은 WHERE 절에 기술하게 되는데 “=” 연산자를 사용해서 표 현한다. 다음은 EQUI JOIN 의 대략적인 형태이다
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... FROM 테이블1, 테이블2 WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.칼럼명1 = 테이블2.칼럼명2;
INNER JOIN
- 조인하는 테이블의 on 절의 조건이 일치하는 결과만 출력
- join, inner join, cross join 모두 같은 의미로 사용됨
select userid, username, email, height, weight, mbti from member m inner join profile p on m.userid=p.userid;
# userid가 어떤 것인지 모름
# Error Code: 1052. Column 'userid' in field list is ambiguous
select m.userid, username, email, height, weight, mbti from member m inner join profile p on m.userid=p.userid;
LEFT/ RIGHT OUTER JOIN
- 두 테이블이 조인될 때 왼쪽/오른쪽을 기준으로 했느냐에 따라 기준 테이블의 것을 모두 출력함
- outer join은 조인하는 테이블의 on 절의 조건 중 한쪽의 데이터를 모두 가져옴
- left outer join, right outer join, full outer join 존재
- 데이터가 없으면 null로 표시
# LEFT OUTER JOIN
select m.userid, username, email, height, weight, mbti from member m left outer join profile p on m.userid=p.userid;
# RIGHT OUTER JOIN
select m.userid, username, email, height, weight, mbti from member m right outer join profile p on m.userid=p.userid;
'KDT > SQL' 카테고리의 다른 글
집합 연산자(UNION, UNION ALL, INTERSECT, EXCEPT) (0) | 2023.03.20 |
---|---|
정규화(Normalization) (1) | 2023.03.20 |
SQL 연산자 (3) | 2023.03.16 |
SQL 기본 (1) | 2023.03.16 |
테이블 생성 및 데이터 입력 (1) | 2023.03.15 |