프로그래머스 SQL/DB Essentials - 다중테이블

mohadang·2022년 7월 11일
0

SQL/DB Essentials

목록 보기
7/7
post-thumbnail

Unicon compatible 제약조건

  • 컬럼 개수가 동일
  • 동일 위치에 존재하는 컬럼의 데이터 타입이 상호 호환(INT, SMALL INT) 가능해야 함.(반드시 동일한 데이터 타입일 필요는 없음)

목적

  • 동일 테이블에서 서로 다른 질의를 수행하여 결과를 합칠 떄.
  • 서로 다른 테이블에서 얻은 유사한 형식의 결과를 하나로 합칠 때

종류

  • UNION, INTERSECT, EXCEPT
    • 카디션 프로덕트 : CROSS JOIN

EX)

SELECT * 
FROM table1
UNION | DISTINCT | ALL | INTERSECT |EXCEPT
SELECT *
FROM table1


UNION

EX)

SELECT employeeId, jobTitle, officeCode
FROM employees
WHERE officeCode = '1'
UNION
SELECT employeeId, jobTitle, officeCode
FROM employees
WHERE officeCode = '3'
ORDER BY 이름

WHERE officeCode IN('1', '3')
WHERE officeCode = '1' OR officeCode = '3'

UNICON ALL : 중복 제거 X
UNICON DISTINCT : 중복 제거, 기본값, 생략 가능

Unicon compatible

SELECT 'P' 구분코드 productLine 상품라인, RIYBD(AVG(buyPrice), 2) 평균구매단가
FROM products
GROUP BY productLine
UNION
SElECT 'V' 구분코드, vendor 제조사, ROUND(AVG(buyPrice), 2) 평균구매단가
FROM products
GROUP BY vendor
ORDER BY 1;
  • 컬럼 갯수 다름
  • 컬럼 타입이 호환 가능한 같은 타입
  • 집합 연산자의 결과를 표시할 때, 테이블 헤딩 부분은 첫 번째 SELECT 문에서 사용된 헤딩이 적용됨

INTERSECT

EX) ERROR, MySQL에서는 INTERSECT 지원하지 않음

SELECT employeeId, jobTitle, officeCode
FROM employees
WHERE officeCode = '1'
INTERSECT
SELECT employeeId, jobTitle, officeCode
FROM employees
WHERE jobTitle LIKE '%Sales Manager%'
ORDER BY 이름

WHERE officeCode IN('1', '3')
WHERE officeCode = '1' OR officeCode = '3'


SELECT employeeId, jobTitle, officeCode
FROM employees
WHERE officeCode = '1' AND employeeId 
IN (
	SELECT employeeId
    FROM employees
    WHERE jobTitle LIKE '%Sales Manager%')
ORDER BY 이름;

JOIN

join 연산은 시간이 매우 많이 드는 연산이다

R을 드라이빙 테이블로 할때

for r in R: # PK
  for s in S: # FK
    if r.col == s.col:
      print r + s

S를 드라이빙 테이블로 할때
for s in S: # FK
  for r in R:  # PK, PK는 어차피 하나일 것이기에 더 열거해도 같은 값은 없음
    if r.col == s.col:
      print r + s
      break

다양한 조인의 실행 순서

  • Query optimizer에 의해서 결정
    • A x B x C
    • A x (B x C)
  • 튜닝의 중요 이슈
    • 질의 성능 개선
    • 실행 계획들중 베스트 실행 계획 선택

INNER JOIN
NATURAL JOIN
OUTER JOIN
CROSS JOIN

EX) WHERE 절 조인

SEELCT *
FROM A, B
WHERE A.a = B.b

EX) FROM 절 조인

SELECT A.a, A.b
FROM A JOIN B
  ON A.officeCode = B.officeCode

EX) USING 절 조인

SELECT *
FROM A JOIN B USING(officeCode)

WHERE 절 조인

profile
mohadang

0개의 댓글