SQL JOIN
JOIN SQL은 2개 이상의 테이블의 열(records)를 연결시키는 SQL 명령어다. 예를 들어 아래 2개의 테이블이 있다. 한명의 Customer는 여러개의 Order을 가질 수 있지만, Order는 여러명의 Customer가 공유할 수 없다. 따라서 1:N의 관계다.
order 테이블의 customerID는 customer 테이블의 customerID를 가리키고 있다. 두 테이블의 관계는 customerID로 성립된다. 이 경우 INNER JOIN 쿼리문을 사용해서 두 테이블에 공통적으로 매칭되는 데이터를 추출할 수 있다.
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
LEFT JOIN , RIGHT JOIN, FULL JOIN
LEFT JOIN
LEFT JOIN은 두개의 테이블이 관계를 맺고 있을 때 왼쪽 테이블에 속한 모든 레코드와 오른쪽 테이블에 매칭되는 레코드들을 반환한다. 만약 오른쪽 테이블에 매칭되는 데이터가 존재하지 않는 경우 오른쪽 테이블에서는 아무것도 반환하지 않는다.
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
RIGHT JOIN
RIGHT JOIN은 관계를 맺고 있는 2개의 테이블에서 오른쪽에 있는 모든 테이블의 레코드들과 왼쪽 테이블에 매칭되는 레코드들을 함께 반환한다. 만약 왼쪽 테이블에서 매칭되는 데이터가 존재하지 않는 경우 왼쪽 테이블에서는 아무 데이터도 반환되지 않는다.
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
FULL JOIN
FULL JOIN은 왼쪽 테이블에 매칭되는 데이터가 존재하거나 오른쪽 테이블에 매칭되는 데이터가 존재하는 경우 모든 레코드들을 반환한다.
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
Reference
3개 이상 JOIN 하는 방법
위와 같은 테이블이 있다. user테이블에서 category의 name에 일치하는 데이터를 필터링 하기 위해서는 여러개의 JOIN이 필요하다. 만약 category의 name이 health인 user테이블의 name을 출력하는 경우 아래 3가지 과정이 필요하다.
① user LEFT JOIN content
② content LEFT JOIN contentCategory
③ contentCategory LEFT JOIN category
user Table
content Table
contentCategory Table
category Table
role Table
3개 JOIN을 어떻게 처리할 수 있을까?
user 테이블과 content 테이블에서 데이터를 가져와야 하므로, LEFT JOIN 쿼리문을 사용한다.
① user LEFT JOIN content
SELECT name FROM user LEFT JOIN content ON user.id = content.userId;
② content LEFT JOIN contentCategory
SELECT content.userId FROM content LEFT JOIN contentCategory ON content.id = contentCategory.contentId;
③ contentCategory LEFT JOIN category
SELECT contentCategory.contentId FROM contentCategory LEFT JOIN category ON contentCategory.categoryId = category.id WHERE category.name = 'health';
위 3개의 LEFT JOIN을 하나로 합칠 수 있다. LEFT JOIN 문이 길어져서 가독성이 떨어지기는 하지만, 3개의 JOIN문을 한곳에 몰아넣어서 코드의 길이를 줄일 수 있다.
SELECT content.title, content.body, content.created_at, user.name
FROM user
LEFT JOIN content ON user.id=content.userId
LEFT JOIN content_category ON content.id = content_category.contentId
LEFT JOIN category ON content_category.categoryId = category.id
WHERE category.name='health';
JOIN ~ GROUP BY 사용 예제
user 별로 작성한 content의 갯수를 구하기 위해서는 user.name을 기준으로 출력데이터를 군집화해야 한다. 이 때 사용되는 SQL문이 GROUP BY다. 당연히 뒤에 조건을 추가하기 위해서는 HAVING 절을 붙일 수 있고, 출력결과를 sorting 하기 위해서 ORDER BY 문도 쓸 수 있다.
SELECT name, COUNT(content.title) FROM user
LEFT JOIN content ON user.id = content.userId
GROUP BY user.name;
HAVING user.name = 'About-Tech'
ORDER BY COUNT(content.title);
'Programming' 카테고리의 다른 글
[Database] MongoDB Document 데이터 BSON JSON 형식 차이점 (0) | 2022.05.31 |
---|---|
[Database] MongoDB란? NoSQL, 도큐먼트 데이터베이스, cluster replica set Instance (0) | 2022.05.31 |
[Database] MySql User 비밀번호 확인 변경 하는 방법 (0) | 2022.05.30 |
[Database] MySQL 새로운 유저 추가하는 방법 (0) | 2022.05.30 |
[Database] Schema Query Design 관계형 데이터베이스 설계 방법 (0) | 2022.05.30 |
댓글