IT 성장일기
[SQL] Join 본문
모두의 SQL을 읽고 배운 것을 복습하기 위해 정리해서 기록합니다.
해당 도서는 Oracle 데이터베이스를 기준으로 하고 있습니다.
이번에는 조인(Join)에 대해 알아보겠습니다.
조인은 테이블을 연계한다는 점에서 집합연산자와 비슷하지만 더 다양한 방식으로 정보를 가공할 수 있게 해 줍니다.
실무에서도 정말 많이 활용되는 만큼 확실히 알아두면 정말 좋을 것 같습니다.
0. 조인의 종류
조인은 데이터를 연계하는 조건이나 기준이 되는 테이블 등에 따라 여러 가지 방식으로 나누어집니다.
- 곱집합 (Cartisian product, cross join) : 구성 가능한 모든 행을 조인합니다.
- 동등 조인 (Equi join, Inner join) : 조인 조건이 일치하는 경우의 결과를 출력합니다.
- 비동등 조인 (Non equi join) : 조인 조건이 일치하지 않는 경우의 결과를 출력합니다.
- 외부 조인 : (Outer join) : 조인 조건이 정확히 일치하지 않는 경우라도 모든 결과를 출력합니다.
- 자체 조인 : (self join) : 자기 자신을 다시 참조합니다.
하나하나씩 예제를 따라 구문을 살펴보고 결과를 확인해 보겠습니다.
1. 곱집합 (Cartisian product, Cross join)
과일 테이블과 야채 테이블에 곱집합 조인을 걸어줍니다. 구문은 아래와 같습니다.
SELECT
f.color as fruit_color
,v.name as veget_name
FROM
fruit f
,vegetable v
ORDER BY
f.color;
SELECT
f.color as fruit_color
,v.name as veget_name
FROM
fruit f
CROSS JOIN vegetable v
ORDER BY
f.color;
만약 과일의 색이 여덟 가지이고 야채의 이름이 네 가지라면 위 쿼리는 5 * 4, 20개의 행을 반환하게 됩니다.
2. 동등 조인 (Equi join, Inner join)
조인의 기준이 되는 컬럼의 값이 동일한 경우의 결과만을 출력합니다.
과일과 야채의 이름이 같은 경우는 없을 테니 색을 조인 조건으로 삼아서 동등 조인을 걸어보겠습니다.
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f, vegetable v
WHERE
f.color = v.color
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f
INNER JOIN vegetable v
ON f.color = v.color
색이 같은 과일과 야채가 쌍을 이뤄 결과로 반환된 모습입니다.
청사과는 오이, 케일과 쌍을 이루어 두 개의 행을 반환했습니다.😁
3. 비동등 조인 (Non equi join)
위 구문에서 일치 조건을 불일치 조건으로 바꾸면 비동등 조인이 됩니다.
즉, 조인 조건이 되는 컬럼의 값이 다른 경우를 반환하게 됩니다.
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f, vegetable v
WHERE
f.color <> v.color;
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f
INNER JOIN vegetable v
ON f.color <> v.color
컬럼의 값이 일치하는 경우보다 불일치 하는 경우의 수가 훨씬 많기 때문에 동등조인에 비해 결과 행이 늘어난 모습입니다.
4. 외부 조인 (Outer join)
외부 조인은 비교하는 컬럼의 값이 모두 일치하지 않아도 기준이 되는 테이블의 모든 데이터를 표시해 주는 조인입니다.
Left outer join, Right outer join 두 가지로 나뉩니다.
재미있는 점은 테이블과 조인 조건이 같아도 Left join이냐 Right join냐에 따라 결과 값이 달라집니다.
그 이유는 기준이 되는 테이블이라는 구절에 있는데요,
Left 조인의 경우 좌측에 위치한 테이블이 기준이 되고 Right 조인의 경우 우측에 위치한 테이블이 기준이 됩니다.
좌측에 위치한 fruit 테이블을 기준으로 삼은 Left join 구문입니다.
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f
LEFT OUTER JOIN vegetable v
ON f.color = v.color
fruit 테이블의 값은 모두 표시되어 있고 vegetable 테이블에는 중간중간 값이 빈 행이 보입니다.
이번에는 Right join의 구문과 결과를 확인하겠습니다.
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f
RIGHT OUTER JOIN vegetable v
ON f.color = v.color
야채의 색은 green, yellow, purple 이 네 가지인데, 이 색들은 fruit 테이블에도 모두 존재하기 때문에 값이 빈 행이 없습니다.
fruit 테이블에는 없는 white 색을 추가한 뒤 다시 결과를 확인해 보았습니다.
다시 정리해 보자면 아래처럼 설명할 수 있을 것 같습니다.
Left join : Join 연산자를 기준으로 좌측에 명시한 테이블 값을 모두 가져옵니다.
Right join : Join 연산자를 기준으로 우측에 명시한 테이블 값을 모두 가져옵니다.
5. 자체 조인 (Self join)
기준이 되는 테이블이 자기 자신의 데이터를 또다시 참조하는 조인입니다.
자체 조인을 실행할 때에는 컬럼을 명시할 때 테이블의 별칭을 꼭 붙여줘야 한다는 점을 주의해야 합니다.
SELECT
f1.name
,f1.color
,f2.name
FROM
fruit f1
INNER JOIN fruit f2
ON f1.color = f2.color
자체 조인은 부서나 계급처럼 계층을 이루는 데이터를 구성하거나
자기 자신의 데이터를 한번 더 재가공하고 싶을 때 활용합니다.
7. 마치며
조인 구문에도 WHERE 절을 이용해 조건을 달 수 있습니다.
물론 ORDER BY 절을 이용해 정렬도 가능합니다.
또한 테이블과 테이블을 쉼표로 구분하고 WHERE 절에 조인 조건을 명시하는 방법으로도 조인을 걸 수 있지만
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f, vegetable v
WHERE
f.color = v.color
아래와 같이 조인 구문과 조인 조건을 직접적으로 명시하여 작성하는 것이 더 선진화된 표현입니다.
SELECT
f.name as fruit_name
,v.name as veget_name
,f.color as fruit_color
,v.color as veget_color
,f.taste as fruit_taste
,v.taste as vaget_taste
FROM
fruit f
INNER JOIN vegetable v
ON f.color = v.color
조인을 더 명확히 구분할 수 있고, (가독성 면에서 유리합니다.) 조인 조건과 전체 쿼리의 반환 조건을 구분하기에도 유리하기 때문입니다.
오늘은 조인에 대해 공부했습니다.
집합연산자와 조인을 적절히 활용하여 더욱 다양하고 체계적으로 데이터를 다룰 수 있게 되길 바랍니다.
감사합니다.😉
'Database > SQL' 카테고리의 다른 글
[SQL] 집합 연산자 (2) | 2023.11.04 |
---|---|
[SQL] 키와 제약 조건 (2) | 2023.11.04 |
[SQL] 함수 - 그룹 함수 (0) | 2023.11.04 |
[SQL] 함수 - 단일 행 함수 (2) (0) | 2023.11.02 |
[SQL] 함수 - 단일 행 함수 (1) (2) | 2023.10.23 |