[혼자공부하는SQL] 10강

2025. 2. 13. 04:09·💻 개발/📀 MySQL
728x90

04-2. 두 테이블을 묶는 조인

0. 시작하기 전에

  • 조인(join) : 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어내는 것

  • 예시
  • : 회원 테이블에는 회원의 이름과 연락처가 있고, 구매 테이블에는 회원이 구매한 테이블이 있다. 물건을 배송하려면, 회원 테이블의 회원 이름과 연락처, 구매 테이블의 회원이 구매한 물건에 대한 정보가 함께 필요하다.

1. 내부 조인

  • 조인이라 부르면, 내부 조인을 의미한다.

1) 일대다 관계의 이해 (one to many)

(1) 예시

  • 일대다 관계 = PK-FK 관계

(2) 기본키 / 외래키

  • 기본키 (Primary key)
  • 외래키 (Foreign key)

2) 내부 조인의 기본

(1) 내부 조인의 형식

SELECT <열 목록>
FROM <첫 번째 테이블>
    INNER JOIN <두 번째 테이블>
    ON <조인될 조건>
[WHERE 검색 조건]
  • INNER JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식한다.

(2) 예시

-- GRL 멤버가 구입했던 물건들에 대한 정보 + GLS 멤버 정보를 JOIN한 결과
USE market_db;
SELECT *
FROM buy
    INNER JOIN member
    ON buy.mem_id = member.mem_id
WHERE buy.mem_id = 'GRL';
  • buy 테이블에서 검색하는데, member 테이블에 JOIN하여 검색한다.

(3) 특정 열에 대한 지정

-- 오류 발생
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;

3) 테이블의 별칭

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;

4) 내부 조인의 한계

: 구매한 사람들만 나왔다. 구매하지 않은 경우도 봐야 하는데 말이다. 구매 안 했으면 구매한 적 없다고 해야 하지 않을까? → 이것이 바로 외부 조인

2. 외부 조인 (Outer JOIN)

  • 내부 조인은 두 테이블에 모두 데이터가 있어야만 결과가 나온다.
  • 하지만, 외부 조인은 한 쪽에만 데이터가 있어도 결과가 나온다.

1) 외부 조인의 기본

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

(1) 형식

SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
    <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
    ON <조인될 조건>
[WHERE 검색 조건]

(2) 예시

-- LEFT JOIN
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;

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

2) FULL OUTER JOIN

  • 왼쪽 외부 요인과 오른쪽 외부 조인이 합쳐진 것
  • 왼쪽이든 오른쪽이든 한 쪽에 들어 있는 내용이면 출력한다.

3. 기타 조인

1) 상호 조인 (CORSS JOIN)

  • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
  • 그래서 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
  • 카티션 곱(cartesian product)이라고도 부른다.

(1) 형태

SELECT *
FROM 테이블
CROSS JOIN 테이블;

(2) 예시

SELECT *
FROM buy
CROSS JOIN member;

(3) 특징

  • ON 구문을 사용할 수 없다.
  • 결과의 내용은 의미가 없다. 랜덤으로 조인하기 때문이다.
  • 상호 조인의 주 용도는 테스트하기 위해 대용량의 데이터를 생성할 때이다.

2) 자체 조인 (Seft JOIN)

  • 자체조인은 자신이 자신과 조인한다는 의미이다.
  • 그래서 자체 조인은 1개의 테이블을 사용한다.
  • 별도의 문법이 있는 것은 아니고, 1개로 조인하면 자체 조인이 된다.

(1) 예시

: 조직도에서 직속 상관에 대한 열을 작성해보자. 경리부장의 직속상관인 관리이사의 연락처를 알고 싶다.

  • 경리부장의 직속상관을 안다.
  • 직속상관의 연락처를 안다.
USE market_db;
CREATE TABLE emp_table (
    emp CHAR(4),
    manager CHAR(4),
    phone VARCHAR(8)
);

INSERT INTO emp_table VALUES('대표', NULL, '0000');
INSERT INTO emp_table VALUES('영업이사', '대표', '1111');
INSERT INTO emp_table VALUES('관리이사', '대표', '2222');
INSERT INTO emp_table VALUES('정보이사', '대표', '3333');
INSERT INTO emp_table VALUES('영업과장', '영업이사', '1111-1');
INSERT INTO emp_table VALUES('경리부장', '관리이사', '2222-1');
INSERT INTO emp_table VALUES('인사부장', '관리이사', '2222-2');
INSERT INTO emp_table VALUES('개발팀장', '정보이사', '3333-1');
INSERT INTO emp_table VALUES('개발주임', '정보이사', '3333-1-1');

SELECT A.emp "직원" , B.emp "직속상관", B.phone "직속상관연락처"
   FROM emp_table A
      INNER JOIN emp_table B
         ON A.manager = B.emp
   WHERE A.emp = '경리부장';

(2) 형식

SELECT <열 목록>
FROM <테이블> 별칭A
    INNER JOIN <테이블> 별칭 B
    ON <조인될 조건>
[WHERE 검색 조건]
728x90

'💻 개발 > 📀 MySQL' 카테고리의 다른 글

[혼자공부하는SQL] 12강  (0) 2025.02.19
[혼자공부하는SQL] 11강  (0) 2025.02.14
[혼자공부하는SQL] 9강  (1) 2025.02.13
[혼자공부하는SQL] 8강  (0) 2025.02.13
[혼자공부하는SQL] 7강  (0) 2025.02.13
'💻 개발/📀 MySQL' 카테고리의 다른 글
  • [혼자공부하는SQL] 12강
  • [혼자공부하는SQL] 11강
  • [혼자공부하는SQL] 9강
  • [혼자공부하는SQL] 8강
pangil_kim
pangil_kim
기록을 통해 지속적인 성장을 추구합니다.
    250x250
  • pangil_kim
    멈추지 않는 기록
    pangil_kim
  • 전체
    오늘
    어제
  • 📝 글쓰기
      ⚙️ 관리

    • 분류 전체보기 (319) N
      • 💻 개발 (128)
        • ※ 참고 지식 (7)
        • 📀 MySQL (24)
        • 🌸 Spring Boot (5)
        • 🟩 Node.js (7)
        • 🦕 React (6)
        • 🎩 Next.js (25)
        • 📘 TypeScript (4)
        • 🌈 CSS (4)
        • 🌀 Dart (2)
        • 🧑🏻‍💻 코테 (25)
        • 🕸️ 알고리즘 (4)
        • 🩵 Flutter (9)
        • 📒 JavaScript (4)
        • 🗒️ 정보처리기사 -실기 (1)
        • 🔸Git (1)
      • 📽️ 프로젝트 (5)
        • 캡스톤디자인2 (5)
      • ✍🏻 회고 (12) N
        • 우테코 (4) N
      • 📰 정보 공유 (12)
      • 🏫 한동대학교 (155) N
        • Database (15)
        • Software Engineering (18)
        • EAP (22)
        • 일반화학 (26)
        • 25-1 수업 정리 (19)
        • Computer Networking (36)
        • OPIc (2)
        • 클라우드 컴퓨팅 (4)
        • 미술의 이해 (13) N
  • 최근 글

  • 인기 글

  • 태그

    어노인팅
    화학
    GLS
    한동대학교
    웹개발
    설교
    묵상
    글로벌리더십학부
    네트워킹
    주일
    날마다 솟는 샘물
    SQL
    typeScript
    예배
    전산전자공학부
    일반화학
    유태준교수님
    csee
    컴네
    QT
    고윤민교수님
    CHEMISTRY
    프론트엔드
    CCM
    데이터베이스
    날솟샘
    FE
    Database
    computer networks and the internet
    찬양
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
pangil_kim
[혼자공부하는SQL] 10강
상단으로

티스토리툴바