SQL

INNER JOIN, OUTER JOIN

Bordercolli 2023. 8. 28. 19:48
728x90

🐕JOIN

JOIN은 여러 테이블에서 필요로 하는 정보를 조합해서 추출할때 쓰는 문법

현업에서 다양한 테이블이 있는 경우가 많고, 데이터의 중복을 최소화하고 데이터의 무결성을 강화하기 위해서 여러 개의 테이블로 데이터를 분산해놓는 경우가 많다. 거기서 내가 원하는 데이터를 꺼내다보면 여러 테이블을 연결시켜야 하고 이때 쓰는 연산이 SQL JOIN

 

두 가지 측면으로 볼 수 있다.

1. 데이터 분석/ 데이터 추출 및 과학적 측면 분야에서는 JOIN을 많이 사용

2.  개발자 측면에서는 SQL JOIN 구문을 가급적 지양하는 편

 

프론트앤드: 화면에 보이는 부분으로 사용자의 요청을 받고 출력해줌.

백앤드: 어떤 아이콘을 클릭하였을 때, 이에 맞는 데이터가 들어가서 보여지는 경우가 많은데 백앤드에서 요청을 처리한다.

 

단점

1. 개발시 속도가 굉장히 떨어진다. → 하나의 테이블에서 처리하는 것이 아니라 JOIN은 항상 두 개 이상의 테이블을 붙여서 처리하는 것 이 작업이 생각보다 시간이 많이 필요로 하다.

 

JOIN종류: INNER JOIN, OUTER JOIN 

INNER JOIN: 기본적으로 많이 사용하는 JOIN으로 INNER를 쓰지 않아도 된다. 

 

🐕INNER JOIN

두 테이블에서 해당 필드값이 매칭되는 레코드만 가져와서 두 테이블을 하나로 붙임.

두 테이블 중 학번이 서로 같지 않은 행이 있다면 그 행은 버리고 겹치는 행들만 JOIN을 한다.

 

즉, INNER JOIN은 두 테이블을 특정 조건으로 행과 행끼리 붙힌다. 그 다음 WHERE을 하든 수정을 한다.

 

SELECT * FROM items INNER JOIN ranking ON ranking.item_code = items.item_code WHERE ranking.main_category = 'ALL';

 # items테이블과 ranking테이블을 조인한다.

# item코드가 동일하다는 것을  on 뒤에 조건으로 달아준다. 

# 이렇게 하여 두 테이블을 하나의 테이블로 만들어 준다.

# 그렇게 하여 조인한 컬럼들을 한 테이블로 만들어 준 것을 출력한다.

# 대신 조건으로 main_category가 ALL인 것만 출력을 하라. (main_category컬럼은 ranking에 있음.)

ranking테이블
items테이블
병합한 것

join까지 하고 나서 기존에 쓰는 문법 순서대로 하면 된다.

ex) join ~~~ where > group by > order by > limit  

 

많은 데이터 분석가 들이 JOIN을 쓸때 테이블명을 다른 기호로 바꾸는 것을 많이 한다.

 

  SELECT A.title FROM items AS A INNER JOIN ranking AS B ON B.item_code = A.item_code WHERE ranking.main_category = 'ALL';

 

이런 식으로 하면 쿼리문의 길이가 짧아져서 편리함.

main_category에 있는 컬럼은 ranking테이블에만 있는 컬럼이라서 앞에 테이블 명시를 생략함

정리: join은 두 테이블을 on을 사용하여 특정 조건에 맞는 행으로 붙여서 하나의 통합 테이블을 만드는 것이다. 

🐕JOIN 실전문제

문제1. 전체 베스트상품(ALL메인카테고리)에서 판매자별로 베스트 상품 갯수 출력하기

SELECT items.provider, COUNT(*) AS 판매자별상품개수, ranking.main_category  FROM ranking INNER JOIN items ON item.item_code = ranking.item_code WHERE main_category = 'ALL' GROUP BY provider;

 

문제2. 메인 카테고리가 패션의류이고 , 패션의류 전체 베스트상품에서 판매자별 베스트 상품 갯수가 5이상인 판매자와 베스트상품 갯수 출력해보기

내가 작성한 코

 

문제3. 메인 카테고리가 신발/ 잡화인 서브 카테고리를 포함해서 전체 베스트상품에서 판매자별 베스트 상품 갯수가 5이상인 판매자와 베스트상품 갯수 출력해보기 

 

문제4. 메인 카테고리가 신발/잡화인 서브 카테고리 포함, 전체 베스트상품에서 판매자별 베스트상품 갯 수가 10이상인 판매자와 베스트상품 갯수를 베스트상품 갯수 순으로 출력해보기

문제5. 메인 카테고리가 화장품/헤어인 서브 카테고리 포함, 전체 베스트상품의 평균, 최대, 최소 할인 가격 출력해보기

정리
SELECT > FROM > INNER JOIN > ON > WHERE > GROUP BY > HAVING > ORDER BY > LIMIT
표 별칭 지정 가능
ex) items 는 I로 지정가능
ON 을 완료한 이후부터는 앞에 테이블 명을 붙이고 컬럼을 작성하지 않아도 된다.
INNER JOIN은 매칭되지 않는 행은 삭제해버린다.

🐕 LEFT OUTER JOIN

종류: LEFT OUTER JOIN / RIGHT OUTER JOIN

 

LEFT OUTER JOIN작성방법

SELECT 컬럼 FROM 왼쪽에 붙힐 테이블 LEFT OUTER JOIN 오른쪽에 붙힐 테이블  ON 테이블1.컬럼=테이블2=컬럼;

 

LEFT OUTER JOIN원리

INNER JOIN은 A, B테이블 순서대로 있다고 하면 A테이블을 다 가지고 B테이블의 왼쪽에다가 그대로 붙힌다.

이렇게 붙힌 후 on뒤에 조건에 맞는 order_table에 맞는 행만 붙힌다. 

이러면 INNER JOIN과 같지 않는가??? 

INNER JOIN은 둘 중에서 하나라도 안맞으면 행을 지워버리지만, LEFT OUTER JOIN은 덧붙여지는 왼쪽 테이블의 값은 몽땅 그대로 두고 오른쪽 테이블에서 왼쪽 테이블과 매칭이 안되는 행을 NULL로 처리한다.

하지만 데이터를 결측치로 만드는지 여부는 코드 작성 순서를 어떻게 구성하느냐에 따라서 달라진다.

정리: INNER JOIN과 LEFT OUTER JOIN의 차이점은 쿼리 작성 순서를 어떻게 하느냐에 따라서 출력되는 결과가 달라진다!!!

또한 LEFT OUTER JOIN은 왼쪽 테이블을 싹다 가지고 와서 왼쪽에는 그대로 부착하는 형태

🐕 RIGHT OUTER JOIN

RIGHT OUTER JOIN작성방법

SELECT * FROM 왼쪽 테이블 RIGHT OUTER JOIN 오른쪽 테이블 ON 왼쪽테이블. 기준컬럼 = 오른쪽테이블. 기준컬럼 

 

RIGHT OUTER JOIN원리

오른쪽 테이블을 싹 다 내려서 오른쪽 테이블을 기준으로 왼쪽 테이블은 오른쪽 테이블과 기준이 맞는 행을 붙이고, 만약 조건에 맞는 행이 없으면 NULL값으로 붙힌다. 

RIGHT와 LEFT의 차이는 기준 테이블이 어느 쪽 테이블이냐의 차이이다.

 

문제. sakila 데이터베이스에서 address 테이블에는 address_id 가 있지만, customer 테이블에는 없는 데이터의 갯수 출력하기

address테이블에는 있지만, customer 테이블에는 없는 데이터가 4개 있다는 것을 알 수 있다. 

※ 조건문에 결측치를 걸러내고시팓면 =NULL이 아니라 IS NULL 또는 IS NOT NULL을 입력해야한다.

 

IS NULL / IS NOT NULL!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

'SQL' 카테고리의 다른 글

[문제풀이] 파이널 테스트  (0) 2023.08.29
SUBQUERY  (0) 2023.08.28
HAVING  (0) 2023.08.28
[🎉중급🎉] 외래키  (1) 2023.08.28
[실전] GROUP BY, AS, ORDER BY  (0) 2023.08.28