1-- =============================================================================
2-- PostgreSQL CRUD ๊ธฐ๋ณธ ์์
3-- Basic CRUD Operations (Create, Read, Update, Delete)
4-- =============================================================================
5
6-- ์ด ํ์ผ์ PostgreSQL์ ๊ธฐ๋ณธ CRUD ์์
์ ๋ณด์ฌ์ค๋๋ค.
7-- ์คํ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ธ์: psql -U postgres -d your_database
8
9-- =============================================================================
10-- 1. CREATE - ํ
์ด๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ฝ์
11-- =============================================================================
12
13-- ํ
์ด๋ธ ์์ฑ
14DROP TABLE IF EXISTS employees CASCADE;
15DROP TABLE IF EXISTS departments CASCADE;
16
17-- ๋ถ์ ํ
์ด๋ธ
18CREATE TABLE departments (
19 dept_id SERIAL PRIMARY KEY,
20 dept_name VARCHAR(50) NOT NULL UNIQUE,
21 location VARCHAR(100),
22 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
23);
24
25-- ์ง์ ํ
์ด๋ธ
26CREATE TABLE employees (
27 emp_id SERIAL PRIMARY KEY,
28 first_name VARCHAR(50) NOT NULL,
29 last_name VARCHAR(50) NOT NULL,
30 email VARCHAR(100) UNIQUE,
31 hire_date DATE DEFAULT CURRENT_DATE,
32 salary NUMERIC(10, 2) CHECK (salary > 0),
33 dept_id INTEGER REFERENCES departments(dept_id),
34 is_active BOOLEAN DEFAULT TRUE,
35 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
36 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
37);
38
39-- ์ธ๋ฑ์ค ์์ฑ
40CREATE INDEX idx_employees_dept ON employees(dept_id);
41CREATE INDEX idx_employees_email ON employees(email);
42
43-- =============================================================================
44-- INSERT - ๋ฐ์ดํฐ ์ฝ์
45-- =============================================================================
46
47-- ๋จ์ผ ํ ์ฝ์
48INSERT INTO departments (dept_name, location)
49VALUES ('Engineering', 'Seoul');
50
51INSERT INTO departments (dept_name, location)
52VALUES ('Marketing', 'Busan');
53
54INSERT INTO departments (dept_name, location)
55VALUES ('Sales', 'Daegu');
56
57INSERT INTO departments (dept_name, location)
58VALUES ('HR', 'Seoul');
59
60-- ์ฌ๋ฌ ํ ํ๋ฒ์ ์ฝ์
61INSERT INTO employees (first_name, last_name, email, hire_date, salary, dept_id)
62VALUES
63 ('์ฒ ์', '๊น', 'kim.cs@company.com', '2020-01-15', 50000, 1),
64 ('์ํฌ', '์ด', 'lee.yh@company.com', '2019-06-20', 55000, 1),
65 ('๋ฏผ์', '๋ฐ', 'park.ms@company.com', '2021-03-10', 48000, 2),
66 ('์์ง', '์ ', 'jung.sj@company.com', '2018-11-05', 62000, 1),
67 ('๋์ฑ', '์ต', 'choi.dw@company.com', '2022-08-01', 45000, 3),
68 ('๋ฏธ์', '๊ฐ', 'kang.my@company.com', '2020-05-15', 52000, 2),
69 ('์งํ', '์กฐ', 'cho.jh@company.com', '2019-09-20', 58000, 3),
70 ('์์', '์ค', 'yoon.sy@company.com', '2021-12-01', 47000, 4);
71
72-- RETURNING ์ ๋ก ์ฝ์
๋ ๋ฐ์ดํฐ ํ์ธ
73INSERT INTO employees (first_name, last_name, email, salary, dept_id)
74VALUES ('์์ง์', 'ํ
์คํธ', 'test@company.com', 40000, 1)
75RETURNING emp_id, first_name, last_name;
76
77-- =============================================================================
78-- 2. READ - ๋ฐ์ดํฐ ์กฐํ
79-- =============================================================================
80
81-- ์ ์ฒด ์กฐํ
82SELECT * FROM employees;
83
84-- ํน์ ์ปฌ๋ผ๋ง ์กฐํ
85SELECT first_name, last_name, email, salary
86FROM employees;
87
88-- ์กฐ๊ฑด๋ถ ์กฐํ (WHERE)
89SELECT first_name, last_name, salary
90FROM employees
91WHERE salary > 50000;
92
93-- ์ฌ๋ฌ ์กฐ๊ฑด (AND, OR)
94SELECT *
95FROM employees
96WHERE dept_id = 1 AND salary > 50000;
97
98SELECT *
99FROM employees
100WHERE dept_id = 1 OR salary > 55000;
101
102-- BETWEEN, IN, LIKE
103SELECT first_name, last_name, salary
104FROM employees
105WHERE salary BETWEEN 45000 AND 55000;
106
107SELECT first_name, last_name, dept_id
108FROM employees
109WHERE dept_id IN (1, 2);
110
111SELECT first_name, last_name, email
112FROM employees
113WHERE email LIKE '%@company.com';
114
115-- NULL ์ฒดํฌ
116SELECT *
117FROM employees
118WHERE email IS NOT NULL;
119
120-- ์ ๋ ฌ (ORDER BY)
121SELECT first_name, last_name, salary
122FROM employees
123ORDER BY salary DESC;
124
125SELECT first_name, last_name, dept_id, salary
126FROM employees
127ORDER BY dept_id ASC, salary DESC;
128
129-- ์ ํ (LIMIT, OFFSET)
130SELECT first_name, last_name, salary
131FROM employees
132ORDER BY salary DESC
133LIMIT 5;
134
135-- ํ์ด์ง๋ค์ด์
(2ํ์ด์ง, ํ์ด์ง๋น 3๊ฐ)
136SELECT first_name, last_name, salary
137FROM employees
138ORDER BY emp_id
139LIMIT 3 OFFSET 3;
140
141-- DISTINCT - ์ค๋ณต ์ ๊ฑฐ
142SELECT DISTINCT dept_id
143FROM employees;
144
145-- ๋ณ์นญ (AS)
146SELECT
147 first_name AS "์ด๋ฆ",
148 last_name AS "์ฑ",
149 salary AS "์ฐ๋ด"
150FROM employees;
151
152-- ๊ณ์ฐ ์ปฌ๋ผ
153SELECT
154 first_name,
155 last_name,
156 salary,
157 salary * 12 AS annual_salary,
158 salary * 1.1 AS after_raise
159FROM employees;
160
161-- =============================================================================
162-- 3. UPDATE - ๋ฐ์ดํฐ ์์
163-- =============================================================================
164
165-- ๋จ์ผ ํ ์์
166UPDATE employees
167SET salary = 52000
168WHERE emp_id = 1;
169
170-- ์ฌ๋ฌ ์ปฌ๋ผ ์์
171UPDATE employees
172SET salary = 55000, updated_at = CURRENT_TIMESTAMP
173WHERE emp_id = 1;
174
175-- ์กฐ๊ฑด๋ถ ๋๋ ์์
176UPDATE employees
177SET salary = salary * 1.1
178WHERE dept_id = 1;
179
180-- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ์์
181UPDATE employees
182SET salary = salary * 1.05
183WHERE dept_id = (SELECT dept_id FROM departments WHERE dept_name = 'Engineering');
184
185-- RETURNING์ผ๋ก ์์ ๋ ๋ฐ์ดํฐ ํ์ธ
186UPDATE employees
187SET salary = salary * 1.02
188WHERE emp_id = 3
189RETURNING emp_id, first_name, salary;
190
191-- =============================================================================
192-- 4. DELETE - ๋ฐ์ดํฐ ์ญ์
193-- =============================================================================
194
195-- ์กฐ๊ฑด๋ถ ์ญ์
196DELETE FROM employees
197WHERE emp_id = 9;
198
199-- ์ ์ฒด ์ญ์ (์ฃผ์!)
200-- DELETE FROM employees;
201
202-- TRUNCATE (๋น ๋ฅธ ์ ์ฒด ์ญ์ , ํธ๋์ญ์
๋ถ๊ฐ)
203-- TRUNCATE TABLE employees RESTART IDENTITY;
204
205-- RETURNING์ผ๋ก ์ญ์ ๋ ๋ฐ์ดํฐ ํ์ธ
206DELETE FROM employees
207WHERE email = 'test@company.com'
208RETURNING *;
209
210-- =============================================================================
211-- 5. ํธ๋์ญ์
(Transaction)
212-- =============================================================================
213
214-- ํธ๋์ญ์
์์
215BEGIN;
216
217INSERT INTO employees (first_name, last_name, email, salary, dept_id)
218VALUES ('ํธ๋์ญ์
', 'ํ
์คํธ', 'trans@company.com', 45000, 1);
219
220UPDATE employees
221SET salary = salary * 1.05
222WHERE email = 'trans@company.com';
223
224-- ํ์ธ
225SELECT * FROM employees WHERE email = 'trans@company.com';
226
227-- ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ
228COMMIT;
229-- ๋๋ ROLLBACK;
230
231-- =============================================================================
232-- 6. UPSERT (INSERT ... ON CONFLICT)
233-- =============================================================================
234
235-- ์ค๋ณต ์ ๋ฌด์
236INSERT INTO departments (dept_name, location)
237VALUES ('Engineering', 'Incheon')
238ON CONFLICT (dept_name) DO NOTHING;
239
240-- ์ค๋ณต ์ ์
๋ฐ์ดํธ
241INSERT INTO departments (dept_name, location)
242VALUES ('Engineering', 'Incheon')
243ON CONFLICT (dept_name)
244DO UPDATE SET location = EXCLUDED.location;
245
246-- =============================================================================
247-- 7. ํ
์ด๋ธ ํ์ธ ๋ฐ ์ ๋ณด
248-- =============================================================================
249
250-- ํ
์ด๋ธ ๊ตฌ์กฐ ํ์ธ
251\d employees
252
253-- ํ
์ด๋ธ ๋ชฉ๋ก
254\dt
255
256-- ์ธ๋ฑ์ค ํ์ธ
257\di
258
259-- =============================================================================
260-- ์ ๋ฆฌ (ํ์์)
261-- =============================================================================
262-- DROP TABLE IF EXISTS employees CASCADE;
263-- DROP TABLE IF EXISTS departments CASCADE;