대부분의 데이터베이스는 RDB(Relational Database) 관계형 데이터베이스이다.
즉, 데이터를 중복되는 값없이 효율적으로 저장하기 위해 여러개의 테이블로 나누어 저장한다.
그리고 이 데이터를 사용하기 위해서 테이블들을 다시 연결하여 사용한다.
이때, 사용하는 것이 INNER JOIN과 OUTER JOIN이다.
INNER JOIN
INNER JOIN은 양쪽 테이블에 데이터가 모두 있는 경우에만 출력을 한다.
ex1) Products 테이블의 CategoryID와 Categories 테이블의 CategoryID를 INNER JOIN으로 연결한다.
SELECT *
FROM products AS p
INNER JOIN categories AS c ON p.categoryid = c.categoryid
▷ ProductID, ProductName, SupplierID, CategoryID, Unit, Price → Products
CategoryID, CategoryName, Description → Categories
ex2) Products 테이블의 CategoryID와 Categories 테이블의 CategoryID
Products 테이블의 SupplierID와 Suppliers 테이블의 SupplierID를 INNER JOIN으로 연결한다.
SELECT *
FROM products AS p
INNER JOIN categories AS c ON p.categoryid = c.categoryid
INNER JOIN suppliers AS s ON p.supplierid = s.supplierid
▷ ProductID, ProductName, SupplierID, CategoryID, Unit, Price → Products
CategoryID, CategoryName, Description → Categories
SupplierID, SupplierName, ContactName, Address, City, PostalCode, Country, Phone → Suppliers
OUTER JOIN
▶ LEFT JOIN
: 왼쪽 테이블을 기준으로 join한다.
왼쪽 테이블에는 데이터가 있고, 오른쪽 테이블에는 데이터가 없는 경우에 출력한다.
ex) 한 번도 주문하지 않은 고객 명단 추출하기
SELECT *
FROM customers
LEFT JOIN orders ON customers.customerid = orders.customerid
WHERE orderid IS NULL
▶ RIGHT JOIN
: 오른쪽 테이블을 기준으로 join한다.
왼쪽 테이블에는 데이터가 없고, 오른쪽 테이블에는 데이터가 있는 경우에 출력한다.
※ RIGHT JOIN은 LEFT JOIN과 테이블의 순서만 바뀐 것이므로 자주 사용되지 않는다. 주로 LEFT JOIN을 사용한다.
SELF JOIN
하나의 테이블만 존재할 때, 테이블 자기 자신을 join할 수 있다.
SELF JOIN은 똑같은 테이블을 join하는 것이기 때문에 AS로 별칭 설정을 해줘야한다.
ex) LeetCode 문제 - 181. Employees Earning More Than Their Managers
<employee>
id | name | salary | managerID |
1 | Joe | 70000 | 3 |
2 | Henry | 80000 | 4 |
3 | Sam | 60000 | NULL |
4 | Max | 90000 | NULL |
SELECT *
FROM employee
INNER JOIN employee AS manager ON employee.managerid = manager.id
위의 코드를 실행하면 다음과 같이 출력된다.
id | name | salary | managerID | id | name | salary | managerID |
1 | Joe | 70000 | 3 | 3 | Sam | 60000 | null |
2 | Henry | 80000 | 4 | 4 | Max | 90000 | null |
↘↘↘
[백문이불여일타] 데이터 분석을 위한 중급 SQL
'📖 STUDY > SQL' 카테고리의 다른 글
[SQL] UNION, UNION ALL (0) | 2022.03.15 |
---|---|
[SQL] DATE_ADD, DATE_SUB (0) | 2022.03.15 |
[SQL] CASE_테이블 피봇 (0) | 2022.03.08 |
[SQL] CASE (0) | 2022.03.08 |
[SQL] GROUP BY, HAVING (0) | 2022.03.08 |