딩관
오늘의 가치
딩관
전체 방문자
오늘
어제
  • 분류 전체보기 (176)
    • Kotlin (3)
      • 스프링 (2)
      • 기본문법 (1)
    • Python (75)
      • 기초문법 (43)
      • Python 모듈 (2)
      • Python 문제 (8)
      • Django (21)
      • DRF (1)
    • JavaScript (14)
      • JavaScript (4)
      • Typescript (0)
      • Node.js (4)
      • nest.js (2)
      • express (4)
    • SQL (12)
    • 기초CS (24)
      • 알고리즘 (16)
      • HTTP (4)
      • OperationSystem (2)
      • Linux (1)
    • 프로젝트 (8)
      • fake-trip (3)
      • 위코드 (5)
    • 잡동사니 (12)
    • Git (4)
      • git (1)
      • Git-hub (3)
    • 개발자 정진관 (12)
      • 개발자 이야기 (5)
      • 처음은 누구나 힘들다. (4)
      • 넌 이것도 이해 못하니? (3)
    • JAVA (5)
      • spring (2)
    • HTML & CSS (5)
    • Docker (1)
    • k8s (0)
      • k8s (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • 위코드
  • 개발자
  • Node.js
  • 파이썬
  • http
  • 장고
  • TypeScript
  • Data Structure
  • SQL
  • 백엔드
  • python
  • MYSQL
  • 알고리즘
  • JavaScript
  • Django
  • wecode
  • Database
  • 자바스크립트
  • java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
딩관

오늘의 가치

JOIN - 테이블을 합치게 해준다
SQL

JOIN - 테이블을 합치게 해준다

2022. 5. 12. 20:55

SELECT 문에서 사용한다

  • LEFT JOIN 
  • INNER JOIN
  • FULL JOIN
  • EXCLUSIVE JOIN

예제의 전제

topic , author , profile 3개의 테이블을 먼저 만들어준다.

LEFT JOIN (LEFT OUTER JOIN)

  • LEFT JOIN을 하면 기본적으로 기준테이블이 왼쪽에 표시된다.
  • 왼쪽 기준 테이블에 있는 데이터들을 오른쪽으로 연장 대상테이블에 데이터가 없더라도 연장
  • 왼쪽을 기준으로 오른쪽방향으로 테이블 및 속성을 더하기때문에 LEFT JOIN이다.
SELECT * FROM 테이블1 LEFT JOIN 테이블1 ON 테이블1.속성 = 테이블2.속성

마지막에 나온 테이블1.속성 과 테이블2.속성은 서로 상응하는 관계여야 한다 (보통 뒤쪽의 테이블2.속성은 프라이머리키를 활용)

 

LEFT JOIN의 연속사용

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성 
LEFT JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성

WHERE 문 역시 중첩 가능

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성 
LEFT JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성 WHERE 조건문

테이블을 합치고 조건에 해당하는 데이터만 가져옴

 

실전 예제

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid

결과

  • JOIN시 상응하는 속성의 데이터 값이 NULL 이면 이후 데이터들은 전부 NULL로 표기된다.

WHERE문 실전예제

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid WHERE author.aid=1;

결과

author.aid 가 1인 데이터들만 불러왔다.

  • JOIN 문같이 여러개의 테이블을 사용시 속성의 이름이 같은경우가 많기에 테이블.속성 으로 명확히 어떤속성인지 기재해야한다.

AS사용 속성이름을 AS로 사용할 수 있다

  • AS사용시 각속성 별로 AS사용후 컴마로 표시
SELECT tid,topic.title,name,city,
profile.title AS profile_title , profile.description AS profile_dsecription 
FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid 
WHERE author.aid=1;

결과

INNER JOIN

  • 여러개의 테이블들이 공통적으로 가지고 있는 데이터만 출력
  • NULL = False 값을 가진다.
  • 기본적으로 JOIN이라고 하면 INNER JOIN을 의미함
SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성

연속으로 사용시

SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성
INNER JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성

실전예제

SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid
INNER JOIN profile ON author.profile_id = profile.pid

결과

  • tid값 4를 가진 oracle은 author 테이블에 존재하지 않음으로 출력되지 않는다

FULL JOIN  (FULL OUTER JOIN)

  • 양쪽의 모든 데이터를 결합 기준열이없다
  • UNION + DISTINCT이라는 개념으로 이해하면 좋다
  • 테이블1 기준으로 left join을 하고 그위에 테이블 2를 기준으로 right join 후 중복을 삭제하는것
  • mysql 에서는 FULL JOIN 을 사용하지 않아 UNION과 괄호를 활용하여 사용한다.

기본원리 (Mysql에서는 사용불가)

SELECT * FROM topic FULL OUTER JOIN author on topic.author_id = author.aid

실제 사용코드

(SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid)
UNION (SELECT * FROM topic RIGHT JOIN author ON topic.author_id = author.aid)

결과

관계가 있는 값은 연속적으로 관계가 없는 값은 NULL 값을 채워서 출력되었다

 

EXCLUSIVE JOIN

  • 기준 테이블을 기준으로 기준테이블에만 있는 데이터를 꺼내옴
  • LEFT JOIN 후 WHERE문으로 대상 테이블의 primary key가 NULL인 값을 불러온다
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
WHERE author.aid is NULL

번외 EXPLAIN

  • 실행 계획을 보는 문구
  • JOIN으로 인한 성능 저하시 JOIN문 제일 앞에 붙여서 활용함

 

'SQL' 카테고리의 다른 글

[SQL] 데이터베이스 정규화 (1nf,2nf,3nf,bcnf)  (0) 2022.08.02
이게 바로 개막장 ERD다.  (0) 2022.06.01
SQL SELECT / DML  (0) 2022.05.12
MySQL 내장함수  (0) 2022.05.11
(5)DML 데이터 조작어 - SELECT NOT IN  (0) 2022.05.11
    'SQL' 카테고리의 다른 글
    • [SQL] 데이터베이스 정규화 (1nf,2nf,3nf,bcnf)
    • 이게 바로 개막장 ERD다.
    • SQL SELECT / DML
    • MySQL 내장함수
    딩관
    딩관

    티스토리툴바