SQL JOIN 정리

hsmiK·2024년 3월 28일

공부기록

목록 보기
6/8

혼자 나중에 공부하려고 정리한 SQL JOIN

💡 JOIN

JOIN은 두 개 이상의 테이블에서 데이터를 결합하는 데 사용되는 SQL 기능이다

JOIN을 사용하면 데이터베이스에서 서로 관련 있는 데이터들을 한 번에 검색이 가능하다

일반적으로 RDBMS에서 많이 사용되며 특히 정규화된 데이터베이스에서는 여러 테이블에 데이터가 분산 저장되어 있기 때문에 JOIN을 통해 필요한 정보를 효율적으로 가저올 수 있다

📌 join 유형과 방법

join 유형은 데이터를 결합하는 방식에 따라 다르다
유형은 크게 innner join outer join cross join self join 이 있다

join을 직접 수행하기 위해 다음과 같이 간단한 테이블 2개를 생성했다

✅ (inner) join - 내부 조인

inner join

기본 join 형태인 inner join

두 개의 데이터베이스에서 일치하는 행만 반환한다. 즉 두 테이블 간에 교차하는 교집합을 반환한다

mariadb를 활용하여 SQL 문을 작성하면 다음과 같다

SQL

예시) 음식 이름, 가격, 음식 종류를 출력하라

// 기본 형태
SELECT [출력하고 싶은 열]
FROM [1번 테이블] INNER JOIN [2번 테이블] 
ON [조인 조건]
WHERE [검색 조건]

// 예시
SELECT price.NAME,PRICE,FOOD_TYPE
FROM price INNER JOIN types 
ON price.NAME = types.NAME;

결과

✅ left outer join - 외부 조인 (왼쪽)

left outer join

outer join 는 두 테이블을 조인할 때 기준이 되는 행의 데이터는 모두 포함하고 다른 테이블의 데이터는 일치하는 데이터만 출력하고 일치하지 않는 행은 null 데이터로 출력하는 join 유형이다

left outer join 은 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환하는 join 유형이다

만약 오른쪽 테이블에서 일치하는 데이터가 없더라도 왼쪽 테이블의 데이터는 모두 출력되며 오른쪽 테이블에 해당하는 값이 없다면 null을 출력한다

SQL

예시) 음식 이름, 가격, 종류를 출력하라. 단, 음식 가격이 책정되지 않은 음식도 출력되게하라

// 기본 형태
SELECT [출력하고 싶은 열]
FROM [1번 테이블] LEFT OUTER JOIN [2번 테이블] 
ON [조인 조건]
WHERE [검색 조건]

// 예시
SELECT price.NAME,PRICE,FOOD_TYPE
FROM price LEFT OUTER JOIN types 
ON price.NAME = types.NAME;

결과

✅ right outer join - 외부 조인 (오른쪽)

right outer join

right outer join 은 위의 left outer join 과 반대로 생각하면 된다

오른쪽 테이블을 기준으로하여 오른쪽 테이블의 행은 모두 출력하고 왼쪽 테이블은 오른쪽 테이블의 데이터와 일치하는 값만 출력하면 된다

일치하지 않는 값은 null 값으로 출력한다

SQL

// 기본 형태
SELECT [출력하고 싶은 열]
FROM [1번 테이블] RIGHT OUTER JOIN [2번 테이블] 
ON [조인 조건]
WHERE [검색 조건]

// 예시
SELECT price.NAME,PRICE,FOOD_TYPE
FROM price RIGHT OUTER JOIN types 
ON price.NAME = types.NAME;

결과

✅ full outer join - 외부 조인 (전체)

full outer join

full outer join 의 경우 mariadb에서 직접적으로 지원하지 않기 때문에 full outer join 을 사용하고 싶다면 UNION 함수를 활용하여 구현하면 된다

UNION 함수는 합집합으로 left joinright join 의 합집합으로 구현하면 full outer join 구현이 가능하다

SQL

SELECT * FROM [1번 테이블]
LEFT OUTER JOIN [2번 테이블] ON [1번테이블 컬럼]=[2번테이블 컬럼]

UNION

SELECT * FROM [1번 테이블]
RIGHT OUTER JOIN [2번 테이블] ON [1번테이블 컬럼]=[2번테이블 컬럼]

// 예시
(select * from price LEFT JOIN types on price.NAME=types.NAME)
UNION 
(select * from price RIGHT JOIN types on price.NAME=types.NAME);

결과

✅ cross join - 상호 조인

1번 테이블의 모든 행과 2번 테이블의 모든 행을 조인시키는 유형이다

상호 조인 결과 전체 행의 개수는 각 테이블 행의 개수를 곱한 것과 같다

cross join 은 주로 두 개 이상의 테이블에서 가능한 모든 조합을 생성할 때 사용한다

SQL

SELECT *
FROM [1번 테이블] CROSS JOIN [2번 테이블]

// 예시
SELECT *
FROM price CROSS JOIN types;

결과

✅ self join - 자체 조인

self join은 데이터베이스에서 동일한 테이블 내의 레코드들을 서로 조인하는 유형이다

자기 자신과 조인하므로 1개의 테이블만 사용한다

self join 는 주로 부모-자식 관계의 표현, 계층적 구조를 가진 경우를 표현할 때 사용한다

예시) 사원 테이블에 사원과 직속 상관 데이터가 저장되어 있을 경우에 모든 사원의 이름과 사원의 직속 상관 이름을 검색하고 싶으면 self join을 통해 확인 가능

SQL

SELECT [출력하고 싶은 열]
FROM <테이블> 별칭A INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]

// 예시
SELECT *
FROM price as A INNER JOIN price as B
WHERE A.NAME=B.NAME;

💡 정리

Inner JOIN은 두 테이블의 공통 행을 조인하여 출력
OUTER JOIN은 1개의 테이블을 기준으로 1개 테이블에만 데이터가 있어도 조인하여 결과 출력
CROSS JOIN은 두 테이블의 모든 행을 합쳐 조인
SELF JOIN은 자기 테이블만 사용하여 자기 자신과 조인

참고

위키백과 - join
W3resource-join

profile
반갑습니다

0개의 댓글