5/30 서브쿼리 / join

리무 rimu ·2023년 6월 6일
0

DataBase

목록 보기
8/8
  • 서브쿼리 : 테이블을 하나씩 처리, 사람이 생각하는 방식과 같음
  • 조인 : 결합되는 조건이 맞는 열들을 붙여서 하나의 테이블로 봄

크로스조인

: 2개이상의 테이블을 합치는걸 조인이라고 함

  • 2개이상의 테이블을 합치는걸 조인이라고 함
  • 모든 경우의 수를 다 합침
  • 실제로 쓰는 경우는 없고, 성능테스트할 때 사용
  • 레코드들끼리 조합할 수 있는 걸 다 한걸 크로스조인

이너조인(교집합이라 생각)

  • 결합조건이 일치하는 열끼리만 결합
  • 두 개의 테이블을 쓰겠다
  • 누구의 벤더 아이디다 라고 명시
  • vend_id는 product에서 쓰고 있지 않아서 제외됨
  • 연산에 순서가 있음
  • 조인을 쓸건지 서브쿼리를 쓸건지 정해야함
  • 조인은 우리가 생각하는 방식과 비슷
  • 서브쿼리는 쿼리가 복잡해지고 길어짐
  • 뭐가 좋다 이런식으로 정해진건 없음
  • 편한걸로 골라서 사용하면 됨
  • 두가지 방식으로 다 풀어보는걸 권장
  • 일반적인 상황에선 조인이 낫다~

아우터조인

  • 결합조건이 맞지않은 애들도 포함
  • 맞지않는 애들가지고 뭐를 하려고 사용
  • left / right
  • MySQL은 풀아우터조인을 지원하지않음
  • 교집합에 포함되지않는 부분 포함 , 교집합도 포함되긴 함
-- 100개 이상 판매한 제품을 제조한 제조사 이름(vend_name)을 구하라
-- orderItems
-- orders
-- customers
-- 중복 소거 DISTINCT

SELECT vend_name
FROM vendors
WHERE vend_id IN(
	SELECT DISTINCT vend_id
	FROM products
	WHERE prod_id IN (
		SELECT prod_id
		FROM orderItmes
		WHERE quantity >= 100;
	)
);
-- 주 키와 외래키의 열 이름이 같을 때 NATURAL JOIN 사용 가능!
SELECT DISTINCT vend_name
FROM vendors INNER JOIN products INNER JOIN orderItems
ON vendors.vend_id = products.vend_id  AND products.prod_id = orderItems.prod_id 
WHERE quantity >= 100;

SELECT DISTINCT vend_name
FROM vendors NATURAL JOIN products NATURAL JOIN orderItems
WHERE quantity >= 100;
  • NATURAL JOIN은 조건문이 필요없는 형태로
    attribute(열)의 이름이 같은 것을 자동으로 묶어줌
profile
JAVA / SQL / Spring 을 공부하고 있습니다 🐥

0개의 댓글