2025. 1. 12. 01:26ㆍLang/SQL
1. INNER JOIN (교집합)
: SELECT 보고싶은 컬럼명 FROM 조회하고 싶은 메인 테이블 INNER JOIN 비교하고 싶은 테이블 ON 비교 조건
# 핸드폰과 PC이 같은 같은 제조사인 기기를 찾을 때
SELECT *
FROM PHONE AS A
INNER JOIN PC AS B
ON A.CONPANY_NAME = B.CONPANY_NAME;
=> 만약, 두개 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개있을때
조회 결과 row는 10개이다.
2. LEFT JOIN ( 부분집합 + 남은 부분 )
: SELECT 보고싶은 컬럼명 FROM 조회하고 싶은 메인 테이블 LEFT JOIN 비교하고 싶은 테이블 ON 비교 조건
# 핸드폰의 정보를 모두 보고 싶은데 그중에서 TV 제조사에도 있는 제조사가 어느 제조사인지 찾고 싶을때
SELECT *
FROM PHONE AS A
LEFT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;
=> 만약, 두개의 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개씩 있을때
조회결과 row는 100개가 나온다.
++ 결과는 항상 메인 테이블(A) 기준으로 모든 row가 출력되지만 조건이 일치하지 않는 비교대상 테이블(B) 관련 컬럼의 값은 null로 출력된다.
3. RIGHT JOIN ( 반대방향 부분집합)
: SELECT 보고싶은 컬럼명 FROM 비교하고 싶은 테이블 RIGHT JOIN 조회하고 싶은 메인 테이블 ON 비교 조건
# PC의 정보를 모두 보고 싶은데 그중에서 핸드폰 제조사에도 있는 제조사가 어느 제조사인지 찾고 싶을때
SELECT *
FROM PHONE AS A
RIGHT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;
=> 만약, 두개의 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개씩 있을때
조회결과 row는 100개가 나온다.
++ 결과는 LEFT JOIN을 RIGHT JOIN을 했을 때의 테이블 순서만 바꾸면 똑같은 결과가 나온다
(즉, RIGHT JOIN을 쓸 필요가 크게 없다)
4. FULL OUTER JOIN (합집합)
mySQL 기준:
SELECT <보고 싶은 컬럼명> FROM <메인 테이블(A)> LEFT JOIN <비교 테이블(B)> ON <조건>
UNION
SELECT <보고 싶은 컬럼명> FROM <비교 테이블(B)> LEFT JOIN <메인 테이블(A)> ON <조건>;
그외의 RDB: SELECT <보고 싶은 컬럼명> FROM <테이블A> FULL OUTER JOIN <테이블B> ON <조건>;
# 핸드폰과 PC의 모든 기기를 보고 싶은 경우
## 일반적 RDB 기준 FULL OUTER JOIN
SELECT *
FROM PHONE AS A
FULL OUTER JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;
## mySQL의 UNION 문법- FULL OUTER JOIN 대체
SELECT *
FROM PHONE AS A
LEFT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME
UNION
SELECT *
FROM PC AS B
LEFT JOIN PHONE AS A
ON B.COMPANY_NAME = A.COMPANY_NAME;
=> 만약, 두개의 테이블의 row가 A가 100개 B가 200개이고 서로 곂치는 조건인 row가 20개 일때
조건이 일치하는 ROW: 20 개
A 테이블에만 있는 ROW: 100 - 20 = 80개
B 테이블에만 있는 ROW: 200 - 20 = 180개
+)_____________________________________
전체 결과 row 개수 = 280개
으로 두개의 테이블 row를 합할 때보다 많은 결과가 나오게 될수 있다.
++ mySQL은 FULL OUTER JOIN 을 지원하지 않아 위 예시 처럼 UNION을 활용해서 구현해야한다.
'Lang > SQL' 카테고리의 다른 글
[OracleDB] SCOTT 계정 활성화 (19c 버전) (0) | 2024.07.03 |
---|---|
[SQL] 기초부터 다시 다지기~! (1) DML (0) | 2024.02.14 |