01_basic_crud.sql

Download
sql 264 lines 7.4 KB
  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;