[MySQL] 7. 두 테이블을 묶는 JOIN(INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN)

2022. 4. 7. 17:11·📟 Database/혼자 공부하는 SQL

JOIN이란 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.

 

두 테이블을 연결할 때 가장 많이 사용되는 것이 내부 조인이다. 일반적으로 그냥 조인이라 부르면 내부 조인을 의미한다.

 

두 테이블을 조인하기 위해서는 테이블이 일대다(one to many) 관계로 연결되어 있어야 한다.

일대다 관계란 한쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 말한다.

일대다 관계는 주로 기본 키(PK)와 외래 키(FK)의 관계로 맺어져 있기 때문에 'PK-FK 관계'라고 부르기도 한다.

 

USE market_db;

SELECT *
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id
    WHERE buy.mem_id = 'GRL';

 

Result

 

 

아래와 같이 작성하면 오류가 발생하는데, 그 이유는 mem_id는 두 테이블 모두가 가지고 있는 열이기 때문에 의미가 모호하기 때문이다.

SELECT mem_id, mem_name, prod_name, addr, CONCAT(phone1, phone2) AS '연락처'
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id;

 

따라서 다음과 같이 수정해주면 해결된다.

SELECT buy.mem_id, mem_name, prod_name, addr, CONCAT(phone1, phone2) AS '연락처'
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id;

 

Result

 

 

실질적으로는 아래와 같이 선택한 모든 열에 대해 그것이 속한 테이블을 밝혀주는 것이 일반적이지만 이렇게 할 경우 코드가 상당히 길어진다.

SELECT buy.mem_id, member.mem_name, buy.prod_name, member.addr, CONCAT(member.phone1, member.phone2) AS '연락처'
    FROM buy
        INNER JOIN member
        ON buy.mem_id = member.mem_id;

 

따라서 다음과 같이 별칭을 붙여 사용하는 것이 일반적이다.

SELECT B.mem_id, M.mem_name, B.prod_name, M.addr, CONCAT(M.phone1, M.phone2) AS '연락처'
    FROM buy B
        INNER JOIN member M
        ON B.mem_id = M.mem_id;

내부 조인은 위와 같이 두 테이블에 모두 포함되는 요소만 출력해주기 때문에 누락되는 데이터가 생기게 된다.

 

외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과를 추출할 수 있다.

자주 사용되는 방식은 아니지만 참고로 알아두면 좋을 것 같다.

 

아래 예제는 LEFT OUTER JOIN이므로 member 테이블의 값은 모두 출력된다.

SELECT M.mem_id, M.mem_name, B.prod_name, M.addr
    FROM member M
        LEFT OUTER JOIN buy B
        ON M.mem_id = B.mem_id
    ORDER BY M.mem_id;

 

Result


기타 조인 방법으로 내부 조인이나 외부 조인만큼 자주 사용되지는 않지만 가끔 유용하게 사용되는 조인으로 상호 조인과 자체 조인이 있다.

 

상호 조인은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능을 말한다. 따라서 상호 조인 결과의 전체 행의 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.

 

상호 조인은 ON 구문을 사용할 수 없으며 보통 의미 없는 대용량 데이터를 생성하고자 할 때 사용하는 조인이다.

 

SELECT * FROM buy CROSS JOIN member;

 

Result

 

 

자체 조인은 자신이 자신과 조인한다는 의미이다. 따라서 자체 조인은 1개의 테이블을 사용한다.

 

자체 조인은 테이블이 1개이기 때문에 다음과 같이 서로 다른 별칭을 사용하여 서로 다른 것처럼 사용하면 된다.

SELECT <열 목록>
    FROM <테이블> 별칭A
        INNER JOIN <테이블> 별칭B
        ON <조인될 조건>
    [WHERE 검색 조건]
저작자표시 (새창열림)

'📟 Database > 혼자 공부하는 SQL' 카테고리의 다른 글

[MySQL] 9. GUI 환경에서 테이블 생성하기, SQL로 테이블 만들기  (0) 2022.04.08
[MySQL] 8. SQL 프로그래밍(IF문, CASE문, WHILE문, 동적SQL)  (0) 2022.04.07
[MySQL] 6. MySQL의 데이터 형식(정수형, 문자형, 실수형, 날짜형)과 형 변환  (0) 2022.04.06
[MySQL] 5. 데이터 변경을 위한 SQL 문(INSERT, UPDATE, DELETE)  (0) 2022.04.06
[MySQL] 4. SQL SELECT 절의 형식(ORDER BY 절과 GROUP BY 절)  (0) 2022.04.06
'📟 Database/혼자 공부하는 SQL' 카테고리의 다른 글
  • [MySQL] 9. GUI 환경에서 테이블 생성하기, SQL로 테이블 만들기
  • [MySQL] 8. SQL 프로그래밍(IF문, CASE문, WHILE문, 동적SQL)
  • [MySQL] 6. MySQL의 데이터 형식(정수형, 문자형, 실수형, 날짜형)과 형 변환
  • [MySQL] 5. 데이터 변경을 위한 SQL 문(INSERT, UPDATE, DELETE)
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[MySQL] 7. 두 테이블을 묶는 JOIN(INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN)
상단으로

티스토리툴바