[MySQL] JOIN โ‘ 

Hunie_07ยท2026๋…„ 2์›” 9์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
11/18
post-thumbnail

๐Ÿ“Œ JOIN

  • ๋‘ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ณตํ†ตํ‚ค(์ปฌ๋Ÿผ)์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜์˜ ํ–‰(ํŠœํ”Œ)์œผ๋กœ ํ•ฉ์นจ
  • ์กฐ์ธ ์ข…๋ฅ˜
    - ๋‚ด๋ถ€์กฐ์ธ(INNER JOIN)
    - ์™ธ๋ถ€์กฐ์ธ(OUTER JOIN)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

-- ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐํ˜•์‹ ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด ๋ณ€๊ฒฝ
DROP SCHEMA IF EXISTS bookdb;
CREATE SCHEMA bookdb;
USE bookdb;
# ํ…Œ์ด๋ธ” publisher
-- ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€๊ฒฝ
ALTER TABLE publisher
	MODIFY pubNo VARCHAR(10) NOT NULL,
    MODIFY pubName VARCHAR(20);
    
-- ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€
ALTER TABLE publisher
	ADD CONSTRAINT PK_publisher_pubNo
    PRIMARY KEY (pubNo);
# ํ…Œ์ด๋ธ” book
-- ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€๊ฒฝ 
ALTER TABLE book
	MODIFY bookNo VARCHAR(10) NOT NULL,
    MODIFY bookName VARCHAR(20),
    MODIFY bookAuthor VARCHAR(30),
    MODIFY bookDate DATE,
    MODIFY pubNo VARCHAR(10) NOT NULL;

-- ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€
ALTER TABLE book
	ADD CONSTRAINT PK_book_bookNo
    PRIMARY KEY (bookNo);
    
ALTER TABLE book
    ADD CONSTRAINT FK_book_pubNo
    FOREIGN KEY (pubNo)
    REFERENCES publisher(pubNo);
# ํ…Œ์ด๋ธ” bookclient
-- ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€๊ฒฝ
ALTER TABLE bookclient
	MODIFY clientNo VARCHAR(10) NOT NULL,
    MODIFY clientName VARCHAR(30),
    MODIFY clientPhone VARCHAR(15),
    MODIFY clientAddress VARCHAR(50),
    MODIFY clientBirth DATE,
    MODIFY clientHobby VARCHAR(30),
    MODIFY clientGender VARCHAR(1);
    
-- ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€
ALTER TABLE bookclient
	ADD CONSTRAINT PK_bookclient_clientNo
    PRIMARY KEY (clientNo);
# ํ…Œ์ด๋ธ” booksale
-- ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ณ€๊ฒฝ
ALTER TABLE booksale
	MODIFY bsNo VARCHAR(10) NOT NULL,
    MODIFY bsDate DATE,
    MODIFY clientNo VARCHAR(10) NOT NULL,
    MODIFY bookNo VARCHAR(10) NOT NULL;
    
-- ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€
ALTER TABLE booksale
	ADD CONSTRAINT PK_booksale_bsNo
    PRIMARY KEY (bsNo);
    
ALTER TABLE booksale
    ADD CONSTRAINT FK_booksale_clientNo
    FOREIGN KEY (clientNo)
    REFERENCES bookclient(clientNo);

ALTER TABLE booksale
    ADD CONSTRAINT FK_booksale_bookNo
    FOREIGN KEY (bookNo)
    REFERENCES book(bookNo);

ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ

bookbookclient
booksalepublisher

1๏ธโƒฃ INNER JOIN (๋‚ด๋ถ€ ์กฐ์ธ)

  • ๋‚ด๋ถ€์กฐ์ธ(INNER JOIN):
    - ๊ณตํ†ต ์ปฌ๋Ÿผ์˜ ์†์„ฑ ๊ฐ’์ด ๋™์ผํ•œ ํŠœํ”Œ(๋ ˆ์ฝ”๋“œ)๋งŒ ๋ฐ˜ํ™˜

1) WHERE ์ ˆ ์‚ฌ์šฉ

SELECT ์—ด๋ฆฌ์ŠคํŠธ
FROM ํ…Œ์ด๋ธ”1, ํ…Œ์ด๋ธ”2
WHERE ํ…Œ์ด๋ธ”1.ํ‚ค = ํ…Œ์ด๋ธ”2.ํ‚ค;
-- ๋„์„œ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ ๋ช…๋‹จ(์ด๋ฆ„)๊ณผ ์ฃผ๋ฌธ๋Ÿ‰ ์ถœ๋ ฅ
SELECT bookdb.bookclient.clientNo,
	   bookdb.bookclient.clientName, 	
       bookdb.booksale.bsQty
	FROM bookdb.booksale, bookdb.bookclient
	WHERE bookdb.booksale.clientNo = bookdb.bookclient.clientNo;

- ์ถœ๋ ฅ

โ˜… FROM ๋ฌธ์—์„œ SCHEMA๋ช….TABLE๋ช… ์„ ๋ณ„์นญ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ

SELECT BC.clientNo,
	   BC.clientName, 	
       BS.bsQty
	FROM bookdb.booksale BS, bookdb.bookclient BC
	WHERE BS.clientNo = BC.clientNo;

2) JOIN ~ ON ์‚ฌ์šฉ

SELECT ์—ด๋ฆฌ์ŠคํŠธ
FROM ํ…Œ์ด๋ธ”A
JOIN ํ…Œ์ด๋ธ”B
ON ํ…Œ์ด๋ธ”A.์ปฌ๋Ÿผc = ํ…Œ์ด๋ธ”B.์ปฌ๋Ÿผc;
SELECT BC.clientNo,
	   BC.clientName, 	
       BS.bsQty
	FROM bookdb.bookclient BC
	JOIN bookdb.booksale BS
    ON BC.clientNo = BS.clientNo;

3) INNER JOIN ~ ON ์‚ฌ์šฉ

SELECT ์—ด๋ฆฌ์ŠคํŠธ
FROM ํ…Œ์ด๋ธ”A
INNER JOIN ํ…Œ์ด๋ธ”B
ON ํ…Œ์ด๋ธ”A.์ปฌ๋Ÿผc = ํ…Œ์ด๋ธ”B.์ปฌ๋Ÿผc;
SELECT BC.clientNo,
	   BC.clientName, 	
       BS.bsQty
FROM bookdb.bookclient BC
INNER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo;
  • ๊ฒฐ๊ณผ๋Š” 1) ~ 3) ๋ชจ๋‘ ๊ฐ™๋‹ค.

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋ฉด ๊ณตํ†ต์—ด์ด ๋‘ ๋ฒˆ ์ถœ๋ ฅ๋˜๊ฒŒ ๋˜์–ด ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. (clientNo ์ด ๋‘ ๋ฒˆ)
SELECT *							
FROM bookdb.bookclient BC
INNER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo;

- ์ถœ๋ ฅ


  • ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์ง€์ •ํ•˜๋ฉฐ ๋™์‹œ์— ์ค‘๋ณต ํ–‰์„ ์‚ญ์ œ (DISTINCT)
  • ๊ฒฐ๊ณผ ์ •๋ ฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. (ORDER BY)
SELECT DISTINCT BC.clientNo, BC.clientName 	
FROM bookdb.bookclient BC
INNER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo
ORDER BY BC.clientName;

4) ์„ธ ํ…Œ์ด๋ธ” ์กฐ์ธ

-- ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ์˜ ์ •๋ณด(๋ฒˆํ˜ธ, ์ด๋ฆ„), ๋„์„œ์ •๋ณด(์ฑ…์ œ๋ชฉ, ์ฑ…๊ฐ€๊ฒฉ), ์ฃผ๋ฌธ์ •๋ณด(์ฃผ๋ฌธ๋ฒˆํ˜ธ, ์ฃผ๋ฌธ์ผ์ž, ์ฃผ๋ฌธ์ˆ˜, ์ฃผ๋ฌธ๊ธˆ์•ก)๋ฅผ ์ตœ๊ทผ ์ฃผ๋ฌธ์ผ์ž ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ
SELECT BS.bsNo, BS.bsDate, BC.clientNo, BC.clientName, B.bookName,
	   B.bookPrice, BS.bsQty, B.bookPrice * BS.bsQty AS ์ฃผ๋ฌธ๊ธˆ์•ก
FROM bookdb.booksale BS
INNER JOIN bookdb.bookclient BC ON BS.clientNo = BC.clientNo
INNER JOIN bookdb.book B ON BS.bookNo = B.bookNo
ORDER BY BS.bsDate DESC;

2๏ธโƒฃ OUTER JOIN (์™ธ๋ถ€ ์กฐ์ธ)

  • ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณตํ†ต์ปฌ๋Ÿผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณตํ†ต์ปฌ๋Ÿผ์˜ ์†์„ฑ ๊ฐ’์ด ์—†๋Š” ํŠœํ”Œ๋„ ๋ฐ˜ํ™˜

1) ์ขŒ์ธก์™ธ๋ถ€์กฐ์ธ (LEFT OUTER JOIN)

  • ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ •๋ณด ์œ ์ง€
SELECT ์—ด๋ฆฌ์ŠคํŠธ
FROM ํ…Œ์ด๋ธ”1
LEFT OUTER JOIN ํ…Œ์ด๋ธ”2
ON ์กฐ์ธ์กฐ๊ฑด(๊ธฐ๋ณธํ‚ค=์™ธ๋ž˜ํ‚ค);
  • ์™ผ์ชฝ ํ…Œ์ด๋ธ”์ธ bookclient ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋Š” ๋ชจ๋‘ ์œ ์ง€ํ•˜๋ฉด์„œ LEFT OUTER JOIN ์„ ์ง„ํ–‰ํ•œ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์ธ bookdsale ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๊ฐ€ ์—†์–ด๋„ NULL ๊ฐ’์œผ๋กœ ํ‘œ์‹œํ•œ ๋ชจ์Šต์ด๋‹ค.
SELECT *
FROM bookdb.bookclient BC
LEFT OUTER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo
ORDER BY BC.clientNo;

- ์ถœ๋ ฅ

Ex) ๊ณ ๊ฐ(client) ์ค‘ ํ•œ๋ฒˆ๋„ ๊ตฌ๋งคํ•œ ์ ์ด ์—†๋Š” ๊ณ ๊ฐ ๋ช…๋‹จ์„ ๊ตฌํ•ด๋ณด์ž.

  • ๊ณ ๊ฐ๋ช…๋‹จ(bookclient)์€ ์œ ์ง€ํ•˜๋ฉด์„œ ํŒ๋งค๊ธฐ๋ก(booksale)์—” ์—†๋Š” ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜๊ธฐ์— bookclient๋ฅผ ์™ผ์ชฝ์— ๋‘” LEFT OUTER JOIN์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
-- ๊ณ ๊ฐ ์ค‘ ํ•œ๋ฒˆ๋„ ๊ตฌ๋งคํ•œ ์ ์ด ์—†๋Š” ๊ณ ๊ฐ ์ถœ๋ ฅ
SELECT BC.clientNo, BC.clientName
FROM bookdb.bookclient BC
LEFT OUTER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo
WHERE BS.clientNo IS NULL
ORDER BY BC.clientNo;

2) ์šฐ์ธก์™ธ๋ถ€์กฐ์ธ (RIGHT OUTER JOIN)

  • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ •๋ณด ์œ ์ง€
SELECT ์—ด๋ฆฌ์ŠคํŠธ
FROM ํ…Œ์ด๋ธ”1
RIGHT OUTER JOIN ํ…Œ์ด๋ธ”2
ON ์กฐ์ธ์กฐ๊ฑด(๊ธฐ๋ณธํ‚ค=์™ธ๋ž˜ํ‚ค);

Ex) ํ•œ๋ฒˆ์ด๋ผ๋„ ์ฃผ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” ๊ณ ๊ฐ์˜ ๋ฒˆํ˜ธ์™€ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋˜ ์ค‘๋ณต๋œ ๊ฒฝ์šฐ ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅํ•ด๋ณด์ž.

  • ํŒ๋งค๊ธฐ๋ก(booksale) ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์žˆ๋Š” clientNo๋ฅผ ํ†ตํ•ด ๊ณ ๊ฐ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ธฐ์— booksale ํ…Œ์ด๋ธ”์„ ์˜ค๋ฅธ์ชฝ์— ๋‘” RIGHT OUTER JOIN๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
-- ํ•œ๋ฒˆ์ด๋ผ๋„ ์ฃผ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” ๊ณ ๊ฐ์˜ ๋ฒˆํ˜ธ์™€ ์ด๋ฆ„ ์ถœ๋ ฅ, ์ค‘๋ณต๋œ ๊ฒฝ์šฐ ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅ
SELECT DISTINCT BC.clientNo, BC.clientName
FROM bookdb.bookclient BC
RIGHT OUTER JOIN bookdb.booksale BS
ON BC.clientNo = BS.clientNo
ORDER BY BC.clientNo;

- ์ถœ๋ ฅ


3) ์™„์ „์™ธ๋ถ€์กฐ์ธ

  • MySQL ์˜ ๊ฒฝ์šฐ FULL OUTER JOIN ๋ช…๋ น์–ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์กฐ์ธ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด LEFT OUTER JOIN ๊ณผ RIGHT OUTER JOIN ์„ UNION ํ•œ๋‹ค.
(SELECT *
	FROM bookdb.bookclient BC
    LEFT OUTER JOIN bookdb.booksale BS
    ON BC.clientNo = BS.clientNo)
UNION    
(SELECT *
	FROM bookdb.bookclient BC
    RIGHT OUTER JOIN bookdb.booksale BS
    ON BC.clientNo = BS.clientNo);

0๊ฐœ์˜ ๋Œ“๊ธ€