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 절에서 서브쿼리 = 스칼라 서브 쿼리

  • 결과값은 하나만 출력 되어야 함
  • 서브쿼리에서 다중 컬럼 사용 불가