본문 바로가기
Programming

[Database] 3개 이상 테이블 LEFT RIGHT JOIN 하기 (GROUP BY 사용)

by 개발자 염상진 2022. 5. 30.

 

 

 

SQL JOIN 

 

JOIN SQL은 2개 이상의 테이블의 열(records)를 연결시키는 SQL 명령어다. 예를 들어 아래 2개의 테이블이 있다. 한명의 Customer는 여러개의 Order을 가질 수 있지만, Order는 여러명의 Customer가 공유할 수 없다. 따라서 1:N의 관계다.

 

 

Order 테이블

 

Customer 테이블

 

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);

 

 

 

 

 

 

 

[Database] MySql User 비밀번호 확인 변경 하는 방법

User 비밀번호 확인 & 변경 ① mysql 실행 $ sudo systemctl start mysql // root 계정으로 접속 $ sudo -u root -p ② mysql DATABASE 선택 mysql> use mysql; ③ User 현재 암호 확인 및 변경 암호화된 비밀번..

about-tech.tistory.com

 

 

[Database] SQL이란?

SQL이란? SQL(Structured Query Language)는 구조화된 Query언어다. Query언어란 직연하자면 질의문을 의미한다. 구글이나 네이버에서 검색을 치는 행위가 query문이다. 구글이나 네이버 데이터베이스에 저장

about-tech.tistory.com

 

 

[Database] SQL(구조화 쿼리) vs NoSQL(비구조화 쿼리) 차이점

What is the diffrence between SQL and NoSQL? SQL vs NoSQL 개념? 데이터베이스는 크게 관계형 데이터베이스와 비관계형 데이터베이스로 구분된다. 관계형 데이터베이스는 SQL을 기반으로 작성되고, 비관계형..

about-tech.tistory.com

 

댓글