JOIN
- JOIN 은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해준다.
- 특정 컬럼 기준으로 조인을 하는 경우가 많다. 이때 사용할 수 있는 명령어들이 있다.
- USING(컬럼명)
- NATURAL JOIN : 공통된 컬럼을 필터링하여 시작한다.
SELECT *
FROM products p JOIN suppliers s
ON p.SupplierID = s.SupplierID ;
SELECT *
FROM products p JOIN suppliers s
USING (SupplierID);
SELECT *
FROM products p NATURAL JOIN suppliers s;
Join의 유형
INNER JOIN
INNER JOIN
: Returns records that have matching values in both tables- 보통 생략해서 사용
- JOIN을 사용한다면 보통 INNER JOIN인 경우가 많다.
INSERT INTO my_table1 (col1)
VALUES ('a'),
('b'),
('c');
INSERT INTO my_table2 (col1)
VALUES ('b'),
('c'),
('d'),
('e');
SELECT *
FROM my_table42_a a
JOIN my_table43_b b
ON a.col1 = b.col1;
SELECT *
FROM my_table42_a a
INNER JOIN my_table43_b b
ON a.col1 = b.col1;
OUTER JOIN
OUTER JOIN
은 조인 조건을 만족하지 않는 행까지 함께 출력할 때 사용된다.LEFT OUTER JOIN
,RIGHT OUTER JOIN
,FULL OUTER JOIN
3가지가 있다.LEFT OUTER JOIN
=LEFT JOIN으로
OUTER 키워드는 생략해서 사용 가능하다.LEFT OUTER JOIN
을 대부분 사용하며, FULL OUTER JOIN은 성능상 거의 사용하지 않는다.
LEFT JOIN
- 왼쪽(첫 번째) 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환합니다.
--예제) 주문을 처리한 적 없는 직원을 찾기
SELECT e.LastName, e.FirstName
FROM employees e
LEFT JOIN orders o
ON e.EmployeeID = o.EmployeeID
WHERE o.EmployeeID IS NULL;
왼쪽 테이블(employees)의 레코드 중 일치하지 않는 레코드는 orders의 칼럼의 레코드가 NULL값
으로 나온다.
RIGHT JOIN
- 오른쪽(두 번째) 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환합니다.
FULL OUTER JOIN (CROSS JOIN)
- 두 테이블의 모든 레코드를 반환합니다.
- 대부분 DB는
FULL OUTER JOIN
을 지원하지 않는다. - 구현하고 싶다면 LEFT JOIN 테이블과 RIGHT JOIN 테이블을
UNION
키워드를 통해 합집합 해준다.
UNION
UNION
연산자는 두 개 이상의 SELECT 문의 결과 집합을 결합하는 데 사용됩니다.- UNION 내의 모든 SELECT 문은 동일한 수의 열을 가져야 합니다.
- 열의 데이터 유형도 유사해야 합니다.
- 모든 SELECT 문의 열 순서도 동일해야 합니다.
DISTINCT
(중복제거)가 자동으로 포함되어 있다.
-- UNION 예시)
SELECT *
FROM my_table_a a
LEFT JOIN my_table_b b
ON a.col1 = b.col1
UNION
SELECT *
FROM my_table_a a
RIGHT JOIN my_table_b b
ON a.col1 = b.col1;
SELF JOIN
- 같은 테이블을 JOIN 한다.
- 기본적으로 INNER JOIN과 유사하다.
-- 예) 'Ipoh Coffee' 보다 비싼 상품명 조회
SELECT p1.ProductID, p1.ProductName, p1.Price
FROM products p1
JOIN products p2
WHERE p1.Price > p2.Price
AND p2.ProductName = 'Ipoh Coffee'
ORDER BY 1;
상관서브쿼리
비상관쿼리
: 외부커리의 컬럼이 내부쿼리에 사용되지 않을 때- 연계되지 않고 독립적으로 반환되는 서브쿼리
상관쿼리
: 외부커리의 컬럼이 내부쿼리에 사용될 때- 반환되는 쿼리로부터 연계되는 서브쿼리
- 성능저하에 주의해서 사용
'SQL' 카테고리의 다른 글
[SQL] 트랜잭션(transaction)과 4가지속성(ACID) (0) | 2023.10.20 |
---|---|
[SQL/MariaDB] 제약사항(Constraint) (0) | 2023.10.12 |