DATA
[SQL] 인프런 Do it! SQL 입문 정리 (3) - JOIN & SUBQUERY
진자이
2023. 7. 18. 21:16
OVERVIEW
- 조인(JOIN)
- 서브쿼리(SQBQUERY)
JOIN
- 두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법
- 검색하고 싶은 칼럼이 다른 테이블에 있을 경우 주로 사용
- 여러 테이블을 하나의 테이블인 것 처럼 활용하는 방법
SELECT
<col>
FROM [table1] as T1
JOIN [table2] as T2 on T1.col1 = T2.col1
WHERE <col> = [value]
ORDER BY [COL]
--→ ON은 조인할 때 어떠한 컬럼을 기준으로 매핑을 하는지를 설정하는 영역
JOIN TYPE
- INNER JOIN : 키 값이 있는 테이블의 컬럼 값을 비교 후, 조건이 맞는 값을 검색
- OUTER JOIN : 조건이 만족하지 않아도 모든 행을 출력하고 싶을 때 사용
- LEFT (OUTER) JOIN과 RIGHT (OUTER) JOIN이 있음
- JOIN의 기준이 되는 데이터는 모두 출력 (LEFT면 왼쪽 구문 테이블 모두 출력)
- (LEFT 기준) WHERE B.KEY IS NULL 을 입력하면 순수 A 데이터만 출력
- FULL OUTER JOIN : 양쪽 모두 조건이 일치하지 않는 것 까지 모두 결합하여 출력
- WHERE A.KEY IS NULL OR B.KEY IS NULL을 입력하면 교집합 영역은 출력X
- CROSS JOIN : 조인에 포함된 테이블의 카티션(Cartesian) 곱을 산출
- ex) 테이블 A에 3행, B에 3행이라면 총 9행이 생성됨
- WHERE 절이 포함되면 INNER JOIN이 됨
- SELF JOIN : 테이블의 행을 같은 테이블 안에 있는 다른 행과 조인할 때 사용
- 계층적인 구조를 테이블화 할 경우에 주로 사용함
- 반드시 테이블에 Alias명을 사용해서 질의해야 함
SUBQUERY
- INNER QUERY라고도 하며, 하나의 쿼리문 안에 포함된 또 하나의 쿼리문
- 메인쿼리가 서브쿼리를 포함하는 종속적 관계
- 여러 번의 쿼리를 수행해야 얻을 수 있는 결과를 하나의 중첩된 문장으로 간편하게 조회가능
- 사용가능한 곳 : SELECT, FROM ,WHERE, HAVING, ORDER BY 등
FROM 절에서 서브쿼리 = 인라인 뷰
- FROM 절에 테이블 명 대신 서브쿼리를 사용
- 서브쿼리에서 조회된 값을 테이블 처럼 사용
-- 아래 두 개는 같은 결과를 보여준다.
-- 1번 서브쿼리
SELECT
*
FROM STOCK
WHERE SYMBOL IN (
SELECT
SYMBOL
FROM NASDAQ_COMPANY
WHERE COMPANY_NAME LIKE '%MICRO%')
AND DATE >= '2021-04-01'
AND DATE < '2021-04-10'
ORDER BY DATE, SYMBOL
-- 2번
SELECT
A.*
FROM STOCK AS A
INNER JOIN(
SELECT
SYMBOL
FROM NASDAQ_COMPANY
WHERE COMPANY_NAME LIKE '%MICRO%'
) AS B ON A.SYMBOL = B.SYMBOL
WHERE A.DATE >='2021-04-01'
AND A.DATE < '2021-04-10'
ORDER BY A.DATE, A.SYMBOL
서브쿼리 반환값에 따른 서브 쿼리 종류
- 단일 행 서브쿼리 : 서브쿼리의 결과가 1행
- 다중 행 서브쿼리 : 서브쿼리의 결과가 여러 행
- 다중 컬럼 서브쿼리 : 서브쿼리의 결과가 여러 컬럼
서브쿼리 주의 사항
- 서브쿼리를 괄호로 묶어서 사용
- 서브쿼리 안에서는 Order by 절은 사용 못함
- 연산자로 오른쪽에 사용해야 함
SELECT 절에서 서브쿼리 = 스칼라 서브 쿼리
- 결과값은 하나만 출력 되어야 함
- 서브쿼리에서 다중 컬럼 사용 불가