공부 내용 정리 mySQL :: 초급 I
# Join 초급
기초에서 다루었던 Join의 내용을 토대로, 자세한 내용을 학습하였다.
JOIN이란, 여러개의 표로 분산된 정보를 결합해서 하나의 단일한 표로 만드는 기술이 바로 JOIN이다.
JOIN의 학습에 앞서, 데이터에 관하여 짤막한 사족을 붙이자면, SQL이건, 데이터이건 무언가 자료에 혹은 코딩에 중복이 발생한다는 것은 상당히 안좋은 징후가 있다는 것을 암시한다. 따라서 작성하고 있는 무언가에 대해 개선이 필요하다는 것을 의미하는 것이다.
여러 정보를 담고 있는 데이터 베이스를 효율적으로 관리하기 위해서는 데이터간의 체계와 관계를 구성이 절대적으로 필요하다. 상기와 같은 예로서 거대한 데이터베이스를 운용함에 있어 중복되는 내용이 발생하면, 같은 수정이 반복되어 발생할 필요가 생기고 그렇게 된다면 실수 혹은 오류의 발생이 용이해지기 때문이다.
중복을 제거하고, 데이터를 효율적으로 관리하기 위해서는 한가지 데이터를 여러개의 테마로 묶어서 분할하여 관리하는 것이다. 하나의 데이터는 하나의 주제만 가져야 된다 라는 말이 있듯이, 그렇게 관리한다면 중복을 제거하고 유지, 보수에 대한 효율이 극대화될 것이다.
이러한 문제를 해결하기 위해서 나온 것이 바로 JOIN이다.
# FOREIGN KEY
테이블 A와 B를 Join 한다고 하면, 공통적으로 보유하고 있는 데이터들이 있을 것이다. 예를들면 id와 같은 key들 일 것인데, A를 기준으로 B를 합친다고 하였을 때, 테이블 B에 존재하는, 조회하여 합치는 key를 외부키, 즉 foreign key 라고 부른다.
# LEFT JOIN
테이블 A와 B가 있을 때, A에 있는 데이터만 출력하는 것 그것이 Outer Join 중 Left Outer Join이다
SELECT *
FROM A
LEFT JOIN B
SELECT * // A의 모든 데이터를 선택
FROM A
LEFT JOIN B // B의 왼쪽에 A를 위치
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id
상기코드블럭은 테이블 A의 id Column과 테이블 B의 id Column 의 같은 값을 참고해서, 두개의 테이블을 하나의 테이블로 보여달라는 코드이다. 이러한 조건은 JOIN의 밑에 ON이라는 키워드 뒤에 사용한다. LEFT JOIN은 ON에서의 조건이 같다면, 조건에 포함되는 모든 열(row)을 다 가져와 표시하게 된다.
그리고 왼쪽에 놓은 기준이 되는 데이터(FROM 뒤)에는 있지만 테이블 B에는 그것이 존재하지 않는다면, NULL로서 그 값을 가져오게 된다.
# RIGHT JOIN
SELECT *
FROM A
RIGHT JOIN B
...
LEFT JOIN 과 마찬가지로 상기와 같은 코드로 다음과 같은 형식을 갖는다.
SELECT * // A의 모든 데이터를 선택
FROM A
LEFT JOIN B // B의 오른쪽에 A를 위치
그 외의 나머지 기능은 LEFT JOIN과 같으므로 사실상 테이블명인 A 와 B의 위치를 치환하여 사용하는 것이 일반적인 경우이다.
# INNER JOIN
JOIN을 사용할 때, 앞에 outer, left, right와 같은 키워드를 사용하지 않으면 자동으로 INNER JOIN으로 인식하여 INNER JOIN 을 하게된다.
INNER JOIN은 A테이블과 B테이블에 모두 존재하는 행(ROW)만 가지고 새로운 표를 표시하는 방법이다.
상기의 그림과 같이, A와 B 테이블에 공통적으로 존재하는 행(ROW)만 조회하여 표시하기 때문에 NULL값이 존재할 수가 없다. 코드는 다음의 형식을 따른다.
SELECT *
FROM A
INNER JOIN B
...
# FULL OUTER JOIN
FULL OUTER JOIN은 A 와 B 테이블 모든 쪽에 있는 데이터를 전부 가져오는 방법이다. 도식화하면 다음과 같다.
수학의 집합연산자 중 합집합 연산자와 유사하다. 역시 완전히 중복되는 내용은 제거된 뒤 표시가 된다.
많은 SQL에서 FULL OUTER JOIN을 지원하지 않는다. 따라서 같은 결과를 취하고자 한다면, LEFT JOIN의 결과물과 RIGHT결과물을 합한 뒤 중복을 제거해주면 된다. 이와 관련된 코드는 하기와 같다.
// FULL OUTER JOIN QUERY
SELECT *
FROM A
FULL OUTER JOIN B
ON A.id = B.id
// USE UNION FULL OUTER JOIN RESULT
(SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id
)
UNION (DISTINCT) // 중복을 제거하는 키워드가 생략이 되어있는 상태이다.
(SELECT *
FROM A
RIGHT JOIN B
ON A.id = B.id
)
# EXCLUSIVE JOIN
Exclusive join은 테이블 A의 입장에 있어서는 B와 관련된 것(A와 공통된 데이터도 포함)을 배제하고, 역으로 테이블 B의 입장에 있어서는 A와 관련된것 (B와 공통된 데이터 포함)을 배제시켜 호출한 뒤 출력하는 기능을 갖고 있다.
상기 그림과 같이, 합치고자 하는 테이블에 속하는 모든 것을 제외하고 자신 본연만 갖고 있는 데이터를 표시하기 위하여 사용하는 기능이다. 사용빈도수는 적은 편이다. 코드는 하기와 같다.
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE B.id is NULL // B 테이블에 없는 값을 출력한다.
이로써 SQL 초급단계 JOIN의 학습을 1차 완료하였다.