[๋ฐ๋ธŒ์ฝ”์Šค] ์‚ฌ์šฉ์ž-๊ฒŒ์‹œ๊ธ€ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ํ…Œ์ด๋ธ” ์„ค๊ณ„์™€ ์ปฌ๋Ÿผ ์†์„ฑ, ์ œ์•ฝ์กฐ๊ฑด

2025. 4. 28. 18:55ยท๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL

๐Ÿ—‚๏ธBoard ์Šคํ‚ค๋งˆ ์ƒ์„ฑ

CREATE DATABASE Board;
USE Board

๐Ÿ—‚๏ธ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ” ์ƒ์„ฑ

 CREATE TABLE users (
    -> id INT NOT NULL AUTO_INCREMENT, // PRIMARY KEY ์ถ”๊ฐ€
    -> name VARCHAR(30) NOT NULL,
    -> job VARCHAR(100),
    -> birth DATE
    -> );

 

โŒ์˜ค๋ฅ˜: Incorrect table definition

Incorrect table definition; there can be only one auto column and it must be defined as a key

AUTO_INCREMENT ์†์„ฑ์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์ด ํ•˜๋‚˜ ์ด์ƒ์ด๊ฑฐ๋‚˜, PRIMARY KEY ๋˜๋Š” UNIQUE KEY๋กœ ์„ค์ •๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์— AUTO_INCREMENT๋ฅผ ๋ถ™์˜€์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” MySQL ์˜ค๋ฅ˜์ด๋‹ค.

 

id ์ปฌ๋Ÿผ์ด AUTO_INCREMENT์ธ๋ฐ, PRIMARY KEY ๋˜๋Š” UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์˜€๋‹ค. id ์ปฌ๋Ÿผ์— PRIMARY KEY๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

 

AUTO_INCREMENT

AUTO_INCREMENT๋Š” ์ƒˆ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” MySQL์˜ ์†์„ฑ

 

โœ…์‚ฌ์šฉ ์กฐ๊ฑด:

  • AUTO_INCREMENT๋Š” INT ๊ณ„์—ด ์ˆซ์ž ํƒ€์ž…์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (e.g., INT, BIGINT, SMALLINT)
  • ๋ฐ˜๋“œ์‹œ PRIMARY KEY ๋˜๋Š” UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋”ฑ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100)
);

INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');
id name
1 Alice
2 Bob

 

์•„๋ž˜์ฒ˜๋Ÿผ ์‹œ์ž‘๊ฐ’์„ ์„ค์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ALTER TABLE users AUTO_INCREMENT = 100;

 

 

๐Ÿ’ก์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ:

  • ์ค‘๊ฐ„ ๊ฐ’์ด ์‚ญ์ œ๋˜์–ด๋„, ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์€ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
  • ์ˆซ์ž ์žฌ์‚ฌ์šฉ์„ ์›ํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ TRUNCATE๋กœ ์ „์ฒด ์ดˆ๊ธฐํ™” ํ•„์š”ํ•˜๋‹ค.

 

DESC

MySQL์—์„œ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ(์Šคํ‚ค๋งˆ)๋ฅผ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด

 

DESC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

DESC users

 

์ œ์•ฝ ์กฐ๊ฑด

์ œ์•ฝ ์กฐ๊ฑด(Constraints)์€ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ(์ •ํ™•์„ฑ + ์ผ๊ด€์„ฑ)์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™

PRIMARY KEY ๊ฐ ํ–‰์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„. NULL ํ—ˆ์šฉ โŒ id INT PRIMARY KEY
UNIQUE ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ ํ—ˆ์šฉ. ์ค‘๋ณต โŒ, NULL โœ… email VARCHAR(100) UNIQUE
NOT NULL NULL ์ž…๋ ฅ โŒ name VARCHAR(50) NOT NULL
DEFAULT ๊ฐ’์ด ์—†์„ ๋•Œ ์ž๋™์œผ๋กœ ์„ค์ •๋  ๊ธฐ๋ณธ๊ฐ’ created_at DATETIME DEFAULT NOW()
CHECK ์กฐ๊ฑด ๋งŒ์กฑ ์‹œ๋งŒ ์‚ฝ์ž… ํ—ˆ์šฉ age INT CHECK (age >= 0)
FOREIGN KEY ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ‚ค๋ฅผ ์ฐธ์กฐ (๊ด€๊ณ„ ์„ค์ •) user_id INT, FOREIGN KEY (user_id) REFERENCES users(id)

๐Ÿ—‚๏ธ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

INSERT INTO users(name, job, birth) VALUES("gongu", "actor", "800123");


๐Ÿ—‚๏ธ๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE posts (
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> title VARCHAR(100) NOT NULL,
    -> content VARCHAR(2000),
    -> created_at TIMESTAMP DEFAULT NOW(),
    -> updated_at TIMESTAMP DEFAULT NOW()
    -> );

 

MySQL ๋‚ ์งœ/์‹œ๊ฐ„ ํƒ€์ž…

DATE: ๋‚ ์งœ๋งŒ ์ €์žฅ(yyyy-mm-dd)
DATETIME: ๋‚ ์งœ + ์‹œ๊ฐ„(yyyy-mm-dd hh:mm:ss)
TIME: ์‹œ๊ฐ„๋งŒ(hh:mm:ss)
TIMESTAMP: ์‹œ์Šคํ…œ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด์— ๋งž๊ฒŒ ์ผ์‹œ๋ฅผ ์ €์žฅ(yyyy-mm-dd hh-mm-ss)

 

TIMESTMAP

TIMESTAMP๋Š” MySQL์—์„œ ์‹œ์Šคํ…œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ €์žฅ๋˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” UTC๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ณด๊ด€๋˜๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…

 

๐Ÿงญ TIMESTAMP์˜ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

 

1. ์ €์žฅ ์‹œ: ๋กœ์ปฌ ์‹œ๊ฐ„ → UTC๋กœ ๋ณ€ํ™˜
MySQL ์„œ๋ฒ„์˜ ์‹œ์Šคํ…œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅํ•œ ๊ฐ’์€ ์ž๋™์œผ๋กœ UTC๋กœ ๋ณ€ํ™˜๋˜์–ด ์ €์žฅ๋œ๋‹ค.

์˜ˆ์‹œ (์„œ๋ฒ„๊ฐ€ KST = UTC+9์ผ ๊ฒฝ์šฐ):
INSERT INTO logs (created_at) VALUES ('2025-05-02 12:00:00');
  • ์ž…๋ ฅ๊ฐ’: 2025-05-02 12:00:00 (KST)
  • ์‹ค์ œ ์ €์žฅ๋˜๋Š” ๊ฐ’: 2025-05-02 03:00:00 (UTC)

 

2. ์กฐํšŒ ์‹œ: UTC → ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜๋˜์–ด ์ถœ๋ ฅ
์ €์žฅ๋œ UTC ๊ฐ’์€ ํ˜„์žฌ ์„ธ์…˜์˜ ์‹œ๊ฐ„๋Œ€(time_zone)์— ๋”ฐ๋ผ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ณด์—ฌ์ง„๋‹ค.

→ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ์ž…๋ ฅํ•˜๊ณ  ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

  DATETIME TIMESTAMP
์ €์žฅ ๋ฐฉ์‹ ์ž…๋ ฅ๋œ ๊ทธ๋Œ€๋กœ ์ €์žฅ ๋‚ด๋ถ€์ ์œผ๋กœ UTC๋กœ ์ €์žฅ
์‹œ๊ฐ„๋Œ€ ์˜ํ–ฅ ์—†์Œ ์žˆ์Œ (๋ณ€ํ™˜๋จ)
๊ถŒ์žฅ ์‚ฌ์šฉ ์ ˆ๋Œ€ ์‹œ๊ฐ„ ๊ธฐ๋ก (์ƒ์ผ, ์˜ˆ์•ฝ์ผ ๋“ฑ) ๋ณ€ํ™”ํ•˜๋Š” ์‹œ์  ๊ธฐ๋ก (๋กœ๊ทธ, ์ƒ์„ฑ์ผ ๋“ฑ)
ํ‘œํ˜„ ๋ฒ”์œ„ 1000-01-01 ~ 9999-12-31 1970-01-01 ~ 2038-01-19

 

 

DEFAULT vs NOT NULL

DEFAULT์™€ NOT NULL์€ ์—ด์˜ ์ œ์•ฝ์กฐ๊ฑด(Constraints) ์ค‘ ๊ธฐ๋ณธ๊ฐ’๊ณผ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” ํ•ต์‹ฌ ์˜ต์…˜

 

โœ… NOT NULL

  • ํ•ด๋‹น ์ปฌ๋Ÿผ์— NULL ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(data integrity)์„ ๋ณด์žฅํ•œ๋‹ค.

โœ… DEFAULT

  • ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ๊ธฐ๋ณธ๊ฐ’
  • INSERT ์‹œ ํ•ด๋‹น ์ปฌ๋Ÿผ์„ ์ƒ๋žตํ•˜๋ฉด ์ด ๊ฐ’์œผ๋กœ ์ž๋™ ์ž…๋ ฅ๋œ๋‹ค.
  • NULL์€ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์•ˆ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (→ NOT NULL๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด ๋ช…ํ™•ํ•จ)
โญ NOT NULL์€ NULL ์ž…๋ ฅ์„ ๊ฐ•์ œ๋กœ ๋ง‰๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‘˜์„ ๋ณ‘ํ–‰ํ•ด ์“ฐ๋ฉด ๋”์šฑ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ!
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  views INT NOT NULL DEFAULT 0
);

๐Ÿ—‚๏ธ๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ” ์‚ฝ์ž…, ์ปฌ๋Ÿผ ์ถ”๊ฐ€, ์ˆ˜์ •

๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

INSERT INTO posts(title, content) VALUES ("title1", "content");

 

๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ”์— ์ˆ˜์ •์ผ์ž ์ปฌ๋Ÿผ ์ถ”๊ฐ€

 ALTER TABLE posts MODIFY COLUMN updated_at DATETIME DEFAULT NOW() ON UPDATE NOW();

 

๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ” id=2 ์ˆ˜์ •

 UPDATE posts SET content = "updated!" WHERE id = 2;

 

ALTER

์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” SQL ๋ช…๋ น์–ด

 

ALTER TABLE ํ…Œ์ด๋ธ”๋ช… ์ž‘์—…๋‚ด์šฉ;

ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

ALTER TABLE posts 
ADD COLUMN updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
  • MySQL์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹œ๊ฐ„ ๊ฐฑ์‹ ํ•˜๋„๋ก updated_at ์ปฌ๋Ÿผ์„ ์ˆ˜์ •ํ•œ๋‹ค.

 

์ปฌ๋Ÿผ ์ถ”๊ฐ€ ALTER TABLE posts ADD COLUMN views INT DEFAULT 0;
์ปฌ๋Ÿผ ์‚ญ์ œ ALTER TABLE posts DROP COLUMN views;
์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ (MySQL 8+) ALTER TABLE posts RENAME COLUMN old_name TO new_name;
์ปฌ๋Ÿผ ์ž๋ฃŒํ˜• ๋ณ€๊ฒฝ ALTER TABLE posts MODIFY COLUMN title VARCHAR(200);
๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ ALTER TABLE posts ALTER COLUMN views SET DEFAULT 100;
์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€ ALTER TABLE posts ADD CONSTRAINT ...
ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ RENAME TABLE old_name TO new_name;

๐Ÿ—‚๏ธ๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ”์— ์ž‘์„ฑ์ž ์ปฌ๋Ÿผ FK ์ถ”๊ฐ€ ๋ฐ ์„ค์ •

 ALTER TABLE posts
    -> ADD COLUMN user_id INT;
    
ALTER TABLE posts
    -> ADD FOREIGN KEY(user_id)
    -> REFERENCES users(id);

 

Foreign Key

๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์ œ์•ฝ์กฐ๊ฑด

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ…Œ์ด๋ธ” ๊ฐ„ ์—ฐ๊ด€์„ฑ์„ ํ‘œํ˜„ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค(primary key)๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ด(column)์ด๋‹ค.
  • ํ•œ ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์—ด ๊ฐ’์ด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์„ ์„ค์ •ํ•œ๋‹ค.
  • ์ฃผ๋กœ 1:N ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.


 

๐Ÿงฉ์กฐ์ธ

๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” SQL ๋ช…๋ น์–ด

 

SELECT * FROM posts LEFT
    -> JOIN users ON posts.user_id = users.id;

 

์ฃผ๋กœ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ณ , ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๋ถ„์‚ฐ๋œ ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์œ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

INNER JOIN

๋‘ ํ…Œ์ด๋ธ”์— ๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

SELECT * FROM A INNER JOIN B ON A.id = B.a_id;

 

 

OUTER JOIN

LEFT JOIN 
์™ผ์ชฝ ํ…Œ์ด๋ธ”(LEFT)์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”(RIGHT)์—์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์„ ๊ฒฐํ•ฉํ•œ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์€ NULL๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

SELECT * FROM A LEFT JOIN B ON A.id = B.a_id;

 

RIGHT JOIN
์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”(RIGHT)์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ , ์™ผ์ชฝ ํ…Œ์ด๋ธ”(LEFT)์—์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์„ ๊ฒฐํ•ฉํ•œ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์€ NULL๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;

 

FULL JOIN
LEFT JOIN๊ณผ RIGHT JOIN์„ ๊ฒฐํ•ฉํ•œ ๊ฒƒ์œผ๋กœ, ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ฒฐํ•ฉํ•˜๊ณ , ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” NULL๋กœ ์ฑ„์šด๋‹ค.

-- MySQL์—์„œ๋Š” UNION ์‚ฌ์šฉ
SELECT * FROM A LEFT JOIN B ON A.id = B.a_id
UNION
SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;
๐Ÿ’กMySQL์—์„œ๋Š” FULL OUTER JOIN์ด ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ, ๋‹ค๋ฅธ DBMS์—์„œ๋Š” ์ง€์›๋œ๋‹ค. MySQL์—์„œ๋Š” ์ด๋ฅผ UNION์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

LEFT JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ, users์™€ posts ํ…Œ์ด๋ธ” ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์‚ฌ์šฉ์ž์™€ ๊ฒŒ์‹œ๊ธ€์ด๋ผ๋Š” ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ค˜์ง€๋งŒ, ๊ทธ ์•ˆ์— ์ˆจ์€ ์„ค๊ณ„ ํฌ์ธํŠธ์™€ ์ œ์•ฝ์กฐ๊ฑด๋“ค์ด ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ๋‹ค๋Š” ๊ฑธ ์ƒˆ์‚ผ ๋А๊ผˆ๋‹ค. AUTO_INCREMENT, DEFAULT, NOT NULL, TIMESTAMP ๊ฐ™์€ ์†์„ฑ๋“ค์€ ์ด๋ฏธ ์ต์ˆ™ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ณต๋ถ€ํ•˜๋ฉด ํ• ์ˆ˜๋ก ์„ธ๋ถ€ ๋™์ž‘๊ณผ ์„ค์ • ์˜ต์…˜๋“ค์ด ๊ณ„์† ๋‚˜์˜จ๋‹ค.

 

AUTO_INCREMENT๋งŒ ํ•ด๋„ ๋‹จ์ˆœํžˆ ์ž๋™ ์ฆ๊ฐ€๊ฐ€ ์•„๋‹ˆ๋ผ ์ฆ๊ฐ€ ๊ฐ„๊ฒฉ ์„ค์ •, ๋ฝ ๋ชจ๋“œ์— ๋”ฐ๋ฅธ ๋™์ž‘ ์ฐจ์ด, ๋‹ค์ค‘ ํ…Œ์ด๋ธ”์—์„œ์˜ ์ถฉ๋Œ ํšŒํ”ผ ๋“ฑ ์˜์™ธ๋กœ ๊นŠ์€ ์ฃผ์ œ๊ฐ€ ๋งŽ์•˜๊ณ , TIMESTAMP๋„ ํ•œ ํ…Œ์ด๋ธ”์— ํ•˜๋‚˜๋งŒ ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•˜๋‹ค๋“ ์ง€, ์‹œ๊ฐ„๋Œ€ ์„ค์ •๊ณผ์˜ ๊ด€๊ณ„ ๋“ฑ ์‹ค๋ฌด์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์š”์†Œ๊ฐ€ ์ˆจ์–ด ์žˆ์—ˆ๋‹ค.

 

์•„์ง ์ด ๊ธ€์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ, ๋‚˜์ค‘์—๋Š” ๋ฝ ๋ชจ๋“œ(Lock Mode)๋‚˜ ID ์ฆ๊ฐ€๊ฐ’ ํŠœ๋‹, ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ™œ์šฉํ•œ ์ œ์•ฝ ๋ณด์™„ ๊ฐ™์€ ๋‚ด์šฉ๋„ ์ •๋ฆฌํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. ํ…Œ์ด๋ธ” ์„ค๊ณ„๋Š” ๋‹จ์ˆœํžˆ ์ปฌ๋Ÿผ ๋‚˜์—ด์ด ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๋Š” ์ž‘์—…์ด๋ผ๋Š” ๊ฑธ ์ ์  ์ฒด๊ฐํ•˜๊ณ  ์žˆ๋‹ค. 

 

'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐ๋ธŒ์ฝ”์Šค] ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: express-validator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ  (0) 2025.05.01
[๋ฐ๋ธŒ์ฝ”์Šค] GUI ํ™œ์šฉ๊ณผ API ์—ฐ๋™์œผ๋กœ ๋ฐฐ์šฐ๋Š” DB ํ™œ์šฉ ์‹ฌํ™”  (0) 2025.05.01
[๋ฐ๋ธŒ์ฝ”์Šค] RDBMS ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ •๊ทœํ™” ์ดํ•ด(RDBMS vs NoSQL, PK, FK)  (3) 2025.04.25
[๋ฐ๋ธŒ์ฝ”์Šค] Express ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆํ™”์™€ userId๋ฅผ ํ™œ์šฉํ•œ API ๊ตฌ์กฐ ๊ฐœ์„   (0) 2025.04.23
[๋ฐ๋ธŒ์ฝ”์Šค] ๋นˆ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ํŒจํ„ด๊ณผ app.route()๋ฅผ ํ™œ์šฉํ•œ Express API ๊ตฌ์กฐํ™”  (1) 2025.04.22
'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐ๋ธŒ์ฝ”์Šค] ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: express-validator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • [๋ฐ๋ธŒ์ฝ”์Šค] GUI ํ™œ์šฉ๊ณผ API ์—ฐ๋™์œผ๋กœ ๋ฐฐ์šฐ๋Š” DB ํ™œ์šฉ ์‹ฌํ™”
  • [๋ฐ๋ธŒ์ฝ”์Šค] RDBMS ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ •๊ทœํ™” ์ดํ•ด(RDBMS vs NoSQL, PK, FK)
  • [๋ฐ๋ธŒ์ฝ”์Šค] Express ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆํ™”์™€ userId๋ฅผ ํ™œ์šฉํ•œ API ๊ตฌ์กฐ ๊ฐœ์„ 
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (173)
      • ๐Ÿ–ฅ๏ธdevelop (2)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (2)
      • ๐Ÿ“šbook (9)
        • npm Deep Dive (4)
      • ๐Ÿ“•review (33)
        • ์ฑ… (24)
        • ํ–‰์‚ฌ (1)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (87)
        • TIL (61)
        • ํ”„๋กœ์ ํŠธ (18)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[๋ฐ๋ธŒ์ฝ”์Šค] ์‚ฌ์šฉ์ž-๊ฒŒ์‹œ๊ธ€ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ํ…Œ์ด๋ธ” ์„ค๊ณ„์™€ ์ปฌ๋Ÿผ ์†์„ฑ, ์ œ์•ฝ์กฐ๊ฑด
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”