CRUD ๊ธฐ๋ณธ
CRUD ๊ธฐ๋ณธ¶
CRUD๋ Create(์์ฑ), Read(์ฝ๊ธฐ), Update(์์ ), Delete(์ญ์ )์ ์ฝ์๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ ์์ ์ ๋๋ค.
0. ์ค์ต ์ค๋น¶
-- ์ค์ต์ฉ ํ
์ด๋ธ ์์ฑ
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INTEGER,
city VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW()
);
1. INSERT - ๋ฐ์ดํฐ ์ฝ์ ¶
๋จ์ผ ํ ์ฝ์ ¶
-- ๋ชจ๋ ์ปฌ๋ผ ์ง์
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 30, '์์ธ');
-- ์ผ๋ถ ์ปฌ๋ผ๋ง ์ง์ (๋๋จธ์ง๋ DEFAULT ๋๋ NULL)
INSERT INTO users (name, email)
VALUES ('์ด์ํฌ', 'lee@email.com');
๋ค์ค ํ ์ฝ์ ¶
INSERT INTO users (name, email, age, city) VALUES
('๋ฐ๋ฏผ์', 'park@email.com', 25, '๋ถ์ฐ'),
('์ต์ง์', 'choi@email.com', 28, '๋์ '),
('์ ์์ง', 'jung@email.com', 35, '์์ธ');
DEFAULT ๊ฐ ์ฌ์ฉ¶
-- ํน์ ์ปฌ๋ผ์ DEFAULT ์ฌ์ฉ
INSERT INTO users (name, email, age, city, created_at)
VALUES ('ํ๊ธธ๋', 'hong@email.com', 40, '์ธ์ฒ', DEFAULT);
-- ๋ชจ๋ ์ปฌ๋ผ DEFAULT (id๋ง ์๋ ์์ฑ)
INSERT INTO users DEFAULT VALUES; -- ์๋ฌ: NOT NULL ์ปฌ๋ผ ๋๋ฌธ
RETURNING - ์ฝ์ ๋ ๋ฐ์ดํฐ ๋ฐํ¶
-- ์ฝ์
ํ ์์ฑ๋ ID ๋ฐํ
INSERT INTO users (name, email, age, city)
VALUES ('์ ์งฑ๊ตฌ', 'shin@email.com', 5, '๋ก์๋ง์')
RETURNING id;
-- ์ฌ๋ฌ ์ปฌ๋ผ ๋ฐํ
INSERT INTO users (name, email, age, city)
VALUES ('๊น๋ฏธ์', 'mikim@email.com', 32, '์์ธ')
RETURNING id, name, created_at;
-- ๋ชจ๋ ์ปฌ๋ผ ๋ฐํ
INSERT INTO users (name, email)
VALUES ('ํ
์คํธ', 'test@email.com')
RETURNING *;
2. SELECT - ๋ฐ์ดํฐ ์กฐํ¶
๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ¶
-- ๋ชจ๋ ์ปฌ๋ผ
SELECT * FROM users;
-- ํน์ ์ปฌ๋ผ๋ง
SELECT name, email FROM users;
์ปฌ๋ผ ๋ณ์นญ (Alias)¶
SELECT
name AS ์ด๋ฆ,
email AS ์ด๋ฉ์ผ,
age AS ๋์ด
FROM users;
-- AS ์๋ต ๊ฐ๋ฅ
SELECT name ์ด๋ฆ, email ์ด๋ฉ์ผ FROM users;
์ค๋ณต ์ ๊ฑฐ (DISTINCT)¶
-- ์ค๋ณต ๋์ ์ ๊ฑฐ
SELECT DISTINCT city FROM users;
-- ์ฌ๋ฌ ์ปฌ๋ผ ์กฐํฉ์ ์ค๋ณต ์ ๊ฑฐ
SELECT DISTINCT city, age FROM users;
๊ณ์ฐ ๋ฐ ํํ์¶
-- ๊ณ์ฐ
SELECT name, age, age + 10 AS age_after_10_years FROM users;
-- ๋ฌธ์์ด ์ฐ๊ฒฐ
SELECT name || ' (' || email || ')' AS user_info FROM users;
-- CONCAT ํจ์
SELECT CONCAT(name, ' - ', city) AS name_city FROM users;
์กฐ๊ฑด ์กฐํ (๊ฐ๋จํ)¶
-- WHERE ์ (์์ธํ ๋ด์ฉ์ ๋ค์ ์ฅ)
SELECT * FROM users WHERE city = '์์ธ';
SELECT * FROM users WHERE age >= 30;
3. UPDATE - ๋ฐ์ดํฐ ์์ ¶
๊ธฐ๋ณธ UPDATE¶
-- ํน์ ํ ์์
UPDATE users
SET age = 31
WHERE name = '๊น์ฒ ์';
-- ์ฌ๋ฌ ์ปฌ๋ผ ์์
UPDATE users
SET age = 26, city = '๋๊ตฌ'
WHERE email = 'park@email.com';
์กฐ๊ฑด ์๋ UPDATE (์ฃผ์!)¶
-- ๋ชจ๋ ํ์ด ์์ ๋จ!
UPDATE users SET city = '์์ธ'; -- ์ํ!
-- ํญ์ WHERE ์ ํ์ธ
๊ณ์ฐ์ ์ด์ฉํ UPDATE¶
-- ๋ชจ๋ ์ฌ์ฉ์ ๋์ด 1 ์ฆ๊ฐ
UPDATE users SET age = age + 1;
-- ํน์ ์กฐ๊ฑด ์ฌ์ฉ์๋ง
UPDATE users SET age = age + 1 WHERE city = '์์ธ';
RETURNING์ผ๋ก ์์ ๋ ๋ฐ์ดํฐ ํ์ธ¶
UPDATE users
SET age = 32
WHERE name = '์ด์ํฌ'
RETURNING *;
UPDATE users
SET city = '๊ด์ฃผ'
WHERE age < 30
RETURNING id, name, city;
NULL๋ก ์ค์ ¶
UPDATE users
SET city = NULL
WHERE name = 'ํ
์คํธ';
4. DELETE - ๋ฐ์ดํฐ ์ญ์ ¶
๊ธฐ๋ณธ DELETE¶
-- ํน์ ํ ์ญ์
DELETE FROM users WHERE name = 'ํ
์คํธ';
-- ์ฌ๋ฌ ์กฐ๊ฑด
DELETE FROM users WHERE city IS NULL AND age IS NULL;
์กฐ๊ฑด ์๋ DELETE (์ฃผ์!)¶
-- ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ !
DELETE FROM users; -- ์ํ!
-- ํ
์ด๋ธ์ ๋จ์์์
RETURNING์ผ๋ก ์ญ์ ๋ ๋ฐ์ดํฐ ํ์ธ¶
DELETE FROM users
WHERE email = 'test@email.com'
RETURNING *;
TRUNCATE - ํ ์ด๋ธ ๋น์ฐ๊ธฐ¶
-- DELETE๋ณด๋ค ๋น ๋ฆ (๋ก๊ทธ ์์ด ์ ์ฒด ์ญ์ )
TRUNCATE TABLE users;
-- SERIAL ์ฌ์์
TRUNCATE TABLE users RESTART IDENTITY;
-- ๊ด๋ จ ํ
์ด๋ธ๋ ํจ๊ป (์ธ๋ํค)
TRUNCATE TABLE users CASCADE;
DELETE vs TRUNCATE¶
| ํน์ง | DELETE | TRUNCATE |
|---|---|---|
| WHERE ์กฐ๊ฑด | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ |
| ์๋ | ๋๋ฆผ | ๋น ๋ฆ |
| ํธ๋์ญ์ ๋กค๋ฐฑ | ๊ฐ๋ฅ | ์ ํ์ |
| RETURNING | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ |
| ํธ๋ฆฌ๊ฑฐ ์คํ | ์คํ๋จ | ์คํ ์๋จ |
| SERIAL ๋ฆฌ์ | ์๋จ | ์ ํ ๊ฐ๋ฅ |
5. UPSERT (ON CONFLICT)¶
์ฝ์ ์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ ๋ฐ์ดํธํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ถฉ๋ ์ ๋ฌด์¶
-- ์ด๋ฏธ ์กด์ฌํ๋ฉด ์๋ฌด๊ฒ๋ ์ ํจ
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 35, '๋ถ์ฐ')
ON CONFLICT (email) DO NOTHING;
์ถฉ๋ ์ ์ ๋ฐ์ดํธ¶
-- ์ด๋ฏธ ์กด์ฌํ๋ฉด ์
๋ฐ์ดํธ
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 35, '๋ถ์ฐ')
ON CONFLICT (email)
DO UPDATE SET
age = EXCLUDED.age,
city = EXCLUDED.city;
EXCLUDED ํค์๋¶
EXCLUDED๋ ์ฝ์
ํ๋ ค๊ณ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 35, '๋ถ์ฐ')
ON CONFLICT (email)
DO UPDATE SET
age = EXCLUDED.age, -- ์ ๊ฐ (35)
city = users.city, -- ๊ธฐ์กด ๊ฐ ์ ์ง
name = EXCLUDED.name; -- ์ ๊ฐ (๊น์ฒ ์)
์กฐ๊ฑด๋ถ UPSERT¶
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 35, '๋ถ์ฐ')
ON CONFLICT (email)
DO UPDATE SET
age = EXCLUDED.age,
city = EXCLUDED.city
WHERE users.age < EXCLUDED.age; -- ๊ธฐ์กด ๋์ด๋ณด๋ค ํด ๋๋ง ์
๋ฐ์ดํธ
6. ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ INSERT¶
SELECT ๊ฒฐ๊ณผ ์ฝ์ ¶
-- ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋ณต์ฌ
CREATE TABLE users_backup AS SELECT * FROM users;
-- ๋๋
INSERT INTO users_backup SELECT * FROM users;
-- ์กฐ๊ฑด๋ถ ๋ณต์ฌ
INSERT INTO users_backup
SELECT * FROM users WHERE city = '์์ธ';
๊ณ์ฐ๋ ๊ฐ ์ฝ์ ¶
INSERT INTO statistics (city, user_count)
SELECT city, COUNT(*) FROM users GROUP BY city;
7. ์ค์ต ์์ ¶
์ค์ต ๋ฐ์ดํฐ ์ค๋น¶
-- ํ
์ด๋ธ ์ด๊ธฐํ
TRUNCATE TABLE users RESTART IDENTITY;
-- ์ํ ๋ฐ์ดํฐ ์ฝ์
INSERT INTO users (name, email, age, city) VALUES
('๊น์ฒ ์', 'kim@email.com', 30, '์์ธ'),
('์ด์ํฌ', 'lee@email.com', 25, '๋ถ์ฐ'),
('๋ฐ๋ฏผ์', 'park@email.com', 35, '์์ธ'),
('์ต์ง์', 'choi@email.com', 28, '๋์ '),
('์ ์์ง', 'jung@email.com', 32, '์์ธ'),
('ํ๊ธธ๋', 'hong@email.com', 40, '์ธ์ฒ'),
('๊ฐ๋์', 'kang@email.com', 27, '๋ถ์ฐ'),
('์์์ง', 'son@email.com', 33, '์์ธ');
์ค์ต 1: ๊ธฐ๋ณธ CRUD¶
-- 1. ์ ์ฌ์ฉ์ ์ถ๊ฐ
INSERT INTO users (name, email, age, city)
VALUES ('์ ๊ทํ์', 'new@email.com', 22, '๊ด์ฃผ')
RETURNING *;
-- 2. ์์ธ ์ฌ์ฉ์ ์กฐํ
SELECT * FROM users WHERE city = '์์ธ';
-- 3. ๋์ด 30 ์ด์ ์ฌ์ฉ์์ ๋์๋ฅผ '์๋๊ถ'์ผ๋ก ๋ณ๊ฒฝ
UPDATE users
SET city = '์๋๊ถ'
WHERE age >= 30
RETURNING name, age, city;
-- 4. ๊ด์ฃผ ์ฌ์ฉ์ ์ญ์
DELETE FROM users
WHERE city = '๊ด์ฃผ'
RETURNING *;
์ค์ต 2: UPSERT¶
-- ์ด๋ฉ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด ๋์ด์ ๋์ ์
๋ฐ์ดํธ
INSERT INTO users (name, email, age, city)
VALUES ('๊น์ฒ ์', 'kim@email.com', 31, '๊ฒฝ๊ธฐ')
ON CONFLICT (email)
DO UPDATE SET
age = EXCLUDED.age,
city = EXCLUDED.city
RETURNING *;
-- ์กด์ฌํ์ง ์๋ ์ด๋ฉ์ผ์ด๋ฉด ์๋ก ์ฝ์
INSERT INTO users (name, email, age, city)
VALUES ('์ํ์', 'newuser@email.com', 29, '์ ์ฃผ')
ON CONFLICT (email)
DO UPDATE SET age = EXCLUDED.age, city = EXCLUDED.city
RETURNING *;
์ค์ต 3: ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ¶
-- ๋ฐฑ์
ํ
์ด๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ๋ณต์ฌ
CREATE TABLE users_backup AS
SELECT * FROM users WHERE 1=0; -- ๊ตฌ์กฐ๋ง ๋ณต์ฌ
INSERT INTO users_backup
SELECT * FROM users;
-- ํน์ ์กฐ๊ฑด ์ฌ์ฉ์๋ง ๋ฐฑ์
INSERT INTO users_backup
SELECT * FROM users WHERE city IN ('์์ธ', '๋ถ์ฐ');
-- ๋ฐฑ์
ํ์ธ
SELECT COUNT(*) FROM users_backup;
8. ์ฃผ์์ฌํญ ๋ฐ ํ¶
SQL Injection ๋ฐฉ์ง¶
-- ๋์ ์ (๋ฌธ์์ด ์ง์ ์ฐ๊ฒฐ)
-- "SELECT * FROM users WHERE name = '" + userInput + "'"
-- ์ข์ ์ (ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์ฌ์ฉ - ์ ํ๋ฆฌ์ผ์ด์
์์)
-- "SELECT * FROM users WHERE name = $1"
UPDATE/DELETE ์ ํ์ธ¶
-- 1. ๋จผ์ SELECT๋ก ๋์ ํ์ธ
SELECT * FROM users WHERE city = '์์ธ';
-- 2. ํ์ธ ํ UPDATE/DELETE ์คํ
UPDATE users SET age = age + 1 WHERE city = '์์ธ';
ํธ๋์ญ์ ํ์ฉ¶
-- ์ค์ํ ์์
์ ํธ๋์ญ์
์ผ๋ก
BEGIN;
UPDATE users SET age = age + 1 WHERE city = '์์ธ';
-- ๊ฒฐ๊ณผ ํ์ธ ํ
COMMIT; -- ๋๋ ROLLBACK;
๋ค์ ๋จ๊ณ¶
05_Conditions_and_Sorting.md์์ WHERE ์ ๊ณผ ORDER BY๋ฅผ ์์ธํ ๋ค๋ค๋ด ์๋ค!