
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฌ๋ค๋ ๊ฑด ๋จ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ธ์ฐ๋ ๊ฒ ์๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ธ์ , ์ด๋ค ์์๋ก, ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง๋ฅผ ์ดํดํ๋ ๊ฒ ํต์ฌ์ด๋ค.
โ CRUD์ ์ ํํ ์๋ฏธ
โ ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์ ์กด์ฌํ๋์ง
โ ์ค์ ํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ํ ์ค์ต
โ SELECT ์ฟผ๋ฆฌ์ ์ง์ง ์คํ ์์
๋ฅผ ์ ๋ฆฌํ๋ค ๐
CRUD๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํํ๋ ๋ชจ๋ ๊ธฐ๋ณธ ๋์์ ๋ฌถ์์ด๋ค.
C โ Create (์์ฑ) R โ Read (์กฐํ) U โ Update (์์ ) D โ Delete (์ญ์ )
๋ชจ๋ ์๋น์ค๋ ์ด ๋ค ๊ฐ์ง๋ฅผ ๋ฒ์ด๋์ง ์๋๋ค.
ํ์๊ฐ์
, ๋ก๊ทธ์ธ, ๊ฒ์๊ธ ์์ , ํํด โ ์ ๋ถ CRUD๋ค.
CREATE(์์ฑ)๋ ํ
์ด๋ธ์ ์๋ก์ด ํ(Row)์ ์ถ๊ฐํ๋ ์์
์ด๋ค.
์ด๋ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ก INSERT๋ค.
์ค์ํ ํฌ์ธํธ๋ ์ด๊ฑฐ๋ค.
INSERT INTO [ํ
์ด๋ธ ๋ช
][์นผ๋ผ1, ์นผ๋ผ2...] VALUES([๊ฐ1, ๊ฐ2...]);
๐งช ์ค์ต 1 โ ํ์ ๋ฐ์ดํฐ ์ถ๊ฐ
INSERT INTO students (name, birthdate)
VALUES ('๊ฐ๋์', '1990-05-20');
์ด ์ฟผ๋ฆฌ๊ฐ ์๋ฏธํ๋ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
1๏ธโฃ students ํ
์ด๋ธ ์ ํ
2๏ธโฃ name, birthdate ์ปฌ๋ผ์ ๊ฐ ์ง์
3๏ธโฃ ์๋ก์ด ํ 1๊ฐ ์์ฑ
๐งช ์ค์ต 2 โ ์ฌ๋ฌ ํ ํ ๋ฒ์ ์ถ๊ฐ (Multi-row Insert)
INSERT INTO students (name, birthdate)
VALUES
('๊ฐ๋์', '1990-05-20'),
('์ก๊ฐํธ', '1967-01-17'),
('์ ๋์ฐ', '1973-02-11');
โ ์ฌ๋ฌ INSERT๋ฅผ ๋๋๋ ๊ฒ๋ณด๋ค
โ ํ ๋ฒ์ ๋ฃ๋ ๊ฒ ์ฑ๋ฅ + ํธ๋์ญ์
์ธก๋ฉด์์ ํจ์ฌ ์ ๋ฆฌํ๋ค.
์ฐธ๊ณ ์ฌํญ:
AUTO_INCREMENT ์ปฌ๋ผ์ ์๋ตํ๋ฉด ์๋ ์์ฑ๋จ (๊ถ์ฅ)
NOT NULL ์ปฌ๋ผ์ ๋ฐ๋์ ๊ฐ์ด ํ์ํจ
๋ฌธ์์ด์ '' ๋ก ๊ฐ์ธ๊ธฐ
์์๋ฐ์ดํ๋ฅผ ๋ ๋ฒ ์ฐ์ ์ฐ๋ฉด escape ์ฒ๋ฆฌ ๋จ
-> O'Brien ์ ์ฅ: ('O''Brien')
๐ต READ โ ๋ฐ์ดํฐ ์กฐํ
๐ ๊ฐ๋
์ ์
READ(์กฐํ)๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ๋ ์์
์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์ด ์์
์ ์ฃผ์ธ๊ณต์ด ๋ฐ๋ก SELECT๋ค.
SELECT [์นผ๋ผ ๋ชฉ๋ก] FROM [ํ
์ด๋ธ ๋ช
];
๐งช ์ค์ต 1 โ ์ ์ฒด ์กฐํ
SELECT * FROM students;
โ ๏ธ ์ค๋ฌด์์๋ SELECT * ์ฌ์ฉ์ ์ต์ํํ๋ค.
ํ์ํ ์ปฌ๋ผ๋ง ์กฐํํ๋ ๊ฒ ์ฑ๋ฅ๊ณผ ๊ฐ๋
์ฑ ๋ชจ๋ ์ข๋ค.
๐งช ์ค์ต 2 โ ์กฐ๊ฑด ์กฐํ
SELECT name, birthdate
FROM students
WHERE birthdate >= '1990-01-01';
WHERE ์ ์ ํ์ ํํฐ๋งํ๋ค.
์ด ๋จ๊ณ์์ ๋ฐ์ดํฐ ์์ด ํ ์ค์ด๋๋ ๊ฒ ์ค์ํ๋ค.
์ฐธ๊ณ ์ฌํญ:
NULL ํค์๋:
* ๊ฐ์ด NULL์ผ ๊ฒฝ์ฐ -> [๊ฐ] IS NULL
* ๊ฐ์ด NULL์ด ์๋ ๊ฒฝ์ฐ -> [๊ฐ] IS NOT NULL
LIKE๋ก ํจํด ๊ฒ์:
* %: 0๊ธ์ ์ด์ (e.g., '์ฒ %' -> ์ฒ , ์ฒ ์, ์ฒ ์์๋ฒ์ง)
* _: ์ ํํ 1๊ธ์ (e,g,, '์ฒ _' -> ์ฒ ์, ์ฒ ํธ ('์ฒ ' ํ๊ธ์ X))
๐ก UPDATE โ ๋ฐ์ดํฐ ์์
๐ ๊ฐ๋
์ ์
UPDATE [ํ
์ด๋ธ ๋ช
] SET [์นผ๋ผ] = [๊ฐ] WHERE [์กฐ๊ฑด];
UPDATE๋ ๊ธฐ์กด ํ์ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ์์
์ด๋ค.
์ด๋ ๊ฐ์ฅ ์ํํ ์ค์๊ฐ ์๋ค.
โ WHERE ์๋ UPDATE
โ ํ
์ด๋ธ ์ ์ฒด ์์
๐งช ์ค์ต โ ํน์ ํ์ ์ด๋ฆ ์์
UPDATE students
SET name = '์๋น'
WHERE student_id = 1;
์ด ์ฟผ๋ฆฌ๋ ์ด๋ ๊ฒ ๋์ํ๋ค.
1๏ธโฃ students ํ
์ด๋ธ ์ ํ
2๏ธโฃ student_id = 1 ์ธ ํ ์ฐพ๊ธฐ
3๏ธโฃ ํด๋น ํ์ name ์ปฌ๋ผ๋ง ๋ณ๊ฒฝ
๐
WHERE๋ถํฐ ๋จผ์ ์ฐ๊ณ UPDATE๋ฅผ ์์ฑํ๋ ๊ฒ ์์ !
๐ด DELETE โ ๋ฐ์ดํฐ ์ญ์
๐ ๊ฐ๋
์ ์
DELETE๋ ํ ์์ฒด๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ค.
๋๋๋ฆด ์ ์๋ค (๋ฐฑ์
์์ผ๋ฉด ๋).
DELETE FROM [ํ
์ด๋ธ ๋ช
] WHERE [์กฐ๊ฑด]
๐งช ์ค์ต โ ํน์ ํ์ ์ญ์
DELETE FROM students
WHERE student_id = 1;
UPDATE์ ๋ง์ฐฌ๊ฐ์ง๋ก
WHERE ์๋ DELETE = ํ
์ด๋ธ ์ด๊ธฐํ๋ค.
์ฐธ๊ณ ์ฌํญ:
Foreign Key๊ฐ ์์ ๋, ์ฆ ๋ค๋ฅธ ํ
์ด๋ธ์์ ์ฐธ์กฐํ๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ญ์ ํ ์ ์๋ค
(์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์ ํ๊ฑฐ๋, ON DELETE CASCADE ์ค์ ์ ํด์ผํจ)
DELETE vs TRUNCATE vs DROP
๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ์ธ ๊ฐ์ง ๋ช
๋ น์ด์ ์ฐจ์ด
๋ช
๋ น์ด ๋์ ์ค๋ช
DELETE ํน์ ํ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ์ ํ์ ์ผ๋ก ์ญ์ TRUNCATE ๋ชจ๋ ํ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ญ์ (ํ
์ด๋ธ ๊ตฌ์กฐ ์ ์ง) DROP ํ
์ด๋ธ ์์ฒด ํ
์ด๋ธ ๊ตฌ์กฐ๊น์ง ์์ ํ ์ญ์
-- ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ์ญ์
DELETE FROM users WHERE age < 20;
-- ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ , ํ
์ด๋ธ ๊ตฌ์กฐ๋ ์ ์ง
TRUNCATE TABLE users;
-- ํ
์ด๋ธ ์์ฒด๋ฅผ ์ญ์
DROP TABLE users;

INNER JOIN ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT ์ปฌ๋ผ1, ์ปฌ๋ผ2, ...
FROM ํ
์ด๋ธ1
INNER JOIN ํ
์ด๋ธ2 ON ํ
์ด๋ธ1.์ปฌ๋ผ = ํ
์ด๋ธ2.์ปฌ๋ผ
WHERE ์กฐ๊ฑด;
๊ตฌ์ฑ ์์
๊ตฌ์ฑ ์์ ์ญํ FROM ํ
์ด๋ธ1 ๊ธฐ์ค์ด ๋๋ ์ฒซ ๋ฒ์งธ ํ
์ด๋ธ INNER JOIN ํ
์ด๋ธ2 ์ฐ๊ฒฐํ ๋ ๋ฒ์งธ ํ
์ด๋ธ ON ์กฐ๊ฑด ๋ ํ
์ด๋ธ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ ์ง ์กฐ๊ฑด
ON์ ์ญํ
ON users.id = posts.user_id
์ด ์กฐ๊ฑด์ "users ํ
์ด๋ธ์ id์ posts ํ
์ด๋ธ์ user_id๊ฐ ๊ฐ์ ํ๋ผ๋ฆฌ ์ฐ๊ฒฐํด์ค"๋ผ๋ ์๋ฏธ
JOIN์ ์ฌ์ฉํ ๋๋ "ํ
์ด๋ธ๋ช
.์ปฌ๋ผ๋ช
" ํ์์ผ๋ก ์์ฑํ๋ค.
-- ๋ช
ํํ ํ๊ธฐ
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON users.id = posts.user_id;
๋ ํ
์ด๋ธ์ ๊ฐ์ ์ด๋ฆ์ ์ปฌ๋ผ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ.
์๋ฅผ ๋ค์ด, users ํ
์ด๋ธ์๋ id๊ฐ ์๊ณ , posts ํ
์ด๋ธ์๋ id๊ฐ ์๋ค๋ฉด ์ด๋ ์ชฝ์ธ์ง ๋ช
ํํ ํด์ผ ํ๋ค.
๋ณ์นญ์ ๋ถ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ธฐ
-- u๋ users์ ๋ณ์นญ, p๋ posts์ ๋ณ์นญ
SELECT u.name, p.title
FROM demo.users u
INNER JOIN demo.posts p ON u.id = p.user_id;
๐ง SELECT ์ฟผ๋ฆฌ์ ์คํ ์์
๐ ๋
ผ๋ฆฌ์ ์คํ ์์
- FROM: ๋ฐ์ดํฐ ์์ค ์ง์
- ํ
์ด๋ธ์ด๋ ๋ทฐ์ ๊ฐ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ํํ๋ค.
FROM ํ
์ด๋ธ๋ช
- JOIN: ํ
์ด๋ธ ๊ฒฐํฉ
- ๋ค๋ฅธ ํ
์ด๋ธ๊ณผ์ ๊ฒฐํฉ์ ์ํํ๋ค.
JOIN ๋ค๋ฅธํ
์ด๋ธ๋ช
ON ์กฐ๊ฑด
- WHERE: ์กฐ๊ฑด ํํฐ๋ง
- ๊ฒฐํฉ๋ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋๋ง ํํฐ๋งํ๋ค.
WHERE ์กฐ๊ฑด
- GROUP BY: ๊ทธ๋ฃนํ
- ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํ๋ค.
GROUP BY ์ปฌ๋ผ๋ช
- HAVING: ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ ํํฐ๋ง
GROUP BY ์ ์ ์ํด ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ๋ํ ์กฐ๊ฑด์ ์ง์ ํ๋ค.HAVING ์กฐ๊ฑด
- SELECT: ์ถ๋ ฅํ ์ปฌ๋ผ ์ ํ
- ์ต์ข
์ ์ผ๋ก ์ถ๋ ฅํ ์ปฌ๋ผ์ ์ ํํ๋ค.
SELECT ์ปฌ๋ผ๋ช
- DISTINCT: ์ค๋ณต ์ ๊ฑฐ
- ๊ฒฐ๊ณผ์์ ์ค๋ณต๋ ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ค.
SELECT DISTINCT ์ปฌ๋ผ๋ช
- ORDER BY: ์ ๋ ฌ
- ๊ฒฐ๊ณผ๋ฅผ ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
ORDER BY ์ปฌ๋ผ๋ช
- LIMIT: ๋ฐํํ ๋ ์ฝ๋ ์ ์ ํ
- ๊ฒฐ๊ณผ์์ ๋ฐํํ ๋ ์ฝ๋์ ์๋ฅผ ์ ํํ๋ค.
LIMIT ์ซ์
๐งช ์์ ์ฟผ๋ฆฌ
SELECT -- 6
DISTINCT s.name, c.course_name -- 7
FROM enrollments AS e -- 1
JOIN students AS s ON e.student_id = s.student_id -- 2
JOIN courses AS c ON e.course_id = c.course_id -- 2
WHERE s.student_id != 0 -- 3
GROUP BY s.name, c.course_name -- 4
HAVING COUNT(*) > 0 -- 5
ORDER BY s.name -- 8
LIMIT 5; -- 9
๐ ํ๋ฆ

๐ ๊ฐ ๋จ๊ณ๋ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์ฒ๋ฆฌํ๋ฉฐ,
์ต์ข
์ ์ผ๋ก LIMIT ๋จ๊ณ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ์ฌ ๋ฐํํ๋ค.
โ
์ต์ข
์์ฝ
- CRUD๋ ๋ชจ๋ ๋ฐ์ดํฐ ์์
์ ๊ธฐ๋ณธ
- INSERT๋ ํ ์ถ๊ฐ, ๊ตฌ์กฐ ๋ณ๊ฒฝ ์๋
- SELECT๋ ์ฝ๊ธฐ ์ ์ฉ
- UPDATE / DELETE๋ ๋ฐ๋์ WHERE
- SELECT ์คํ ์์๋ ์๊ธฐ + ์ดํด