오늘은 우리 SQL 실력에 또 하나의 마법 같은 기능을 추가할 거야: 바로 RETURNING 명령어! 이건 진짜 강력한 도구인데, 삽입, 업데이트, 삭제 후에 바로 원하는 데이터를 다시 받아올 수 있어. 예를 들어, 테이블에 행을 추가하자마자 그 행의 고유 ID를 바로 받을 수 있다고 생각해봐. 완전 편하지? 그럼 바로 배워보자!
INSERT, UPDATE, DELETE 같은 작업을 하고 나면, 가끔 바로 영향을 받은 데이터를 받아와야 할 때가 있어. 예를 들어, 테이블에 새 행을 추가했을 때 자동으로 생성된 기본키(고유 식별자)가 필요할 수 있지. 이런 경우, 따로 데이터를 받으려고 또 쿼리를 날릴 필요 없이, RETURNING을 쓰면 한 번에 해결돼!
예를 들어, students 테이블에 새로운 학생을 추가한다고 해보자. 각 학생마다 자동으로 생성되는 고유 ID(student_id)가 있어. 새 레코드를 추가한 다음, 바로 그 ID를 받아서 학생의 수강 기록 같은 데에 써야 할 수도 있지. RETURNING 없이 하려면, 먼저 학생을 추가하고, 그 다음에 SELECT 쿼리로 ID를 찾아야 해. 근데 RETURNING을 쓰면 이걸 한 번에 끝낼 수 있어!
RETURNING 명령어 문법
RETURNING은 INSERT, UPDATE, DELETE 명령 뒤에 붙여서 써. 기본 문법은 이래:
-- INSERT 문법:
INSERT INTO 테이블 (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING 컬럼;
-- UPDATE 문법:
UPDATE 테이블
SET column1 = value1
WHERE 조건
RETURNING 컬럼;
-- DELETE 문법:
DELETE FROM 테이블
WHERE 조건
RETURNING 컬럼;
RETURNING을 쓰면, 변경된 행에서 어떤 컬럼을 받아올지 직접 지정할 수 있어. 예를 들어 기본키 하나만 받을 수도 있고, 여러 컬럼을 한 번에 받을 수도 있어.
INSERT에서 RETURNING 사용하기
예시로 students 테이블을 만들어보자:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
새 학생을 추가하면서 바로 그 학생의 ID를 받아보자:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_id;
이 쿼리를 실행하면 추가된 학생의 ID가 바로 반환돼:
| student_id |
|---|
| 1 |
방금 Otto Lin 학생을 추가했는데, PostgreSQL이 바로 student_id를 알려줬지? 완전 편하지!
이번엔 여러 컬럼을 한 번에 받아보자. 만약 student_id뿐만 아니라 학생의 이름, 성도 같이 받고 싶으면 RETURNING에 여러 컬럼을 지정하면 돼:
INSERT INTO students (first_name, last_name, email)
VALUES ('Alex', 'Ming', 'alex.ming@example.com')
RETURNING student_id, first_name, last_name;
결과:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Alex | Ming |
UPDATE에서 RETURNING 사용하기
가끔 데이터를 업데이트한 후에 어떤 행이 바뀌었는지 바로 알고 싶을 때가 있어. RETURNING이 이럴 때 딱이야.
예를 들어, Otto Lin 학생이 이메일을 바꾼다고 해보자. 데이터를 업데이트하면서 바뀐 행의 정보를 바로 받아보자:
UPDATE students
SET email = 'lin.new@example.com'
WHERE student_id = 1
RETURNING student_id, email;
결과:
| student_id | |
|---|---|
| 1 | lin.new@example.com |
이제 student_id = 1인 학생의 이메일이 제대로 바뀌었는지 바로 확인할 수 있어.
DELETE에서 RETURNING 사용하기
테이블에서 데이터를 삭제할 때, 어떤 행이 삭제됐는지 알고 싶을 때가 있지. RETURNING을 쓰면 삭제된 행의 데이터를 바로 받아올 수 있어.
예를 들어, Peter Ming 학생이 자퇴했다고 해보자. 그 학생을 테이블에서 삭제하면서 삭제된 정보를 받아보자:
DELETE FROM students
WHERE student_id = 2
RETURNING student_id, first_name, last_name;
결과:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Peter | Ming |
이제 진짜 Peter Ming 학생이 삭제됐다는 걸 확실히 알 수 있지.
실전 꿀팁
RETURNING을 꼭 써서, 영향을 받은 행의 데이터가 필요할 때 바로 받아와! 이걸로 DB 쿼리 횟수를 줄일 수 있어.
반환되는 데이터는 최소한으로! 만약 기본키만 필요하면, 그것만 받아와.
트랜잭션이랑 같이 쓰면 RETURNING은 진짜 강력해져. 예를 들어, 여러 연관된 테이블에 데이터를 추가할 때, RETURNING으로 받은 ID를 바로 넘겨줄 수 있어.
RETURNING 쓸 때 흔한 실수
초보자들이 자주 하는 실수 중 하나는 RETURNING이 변경된 행에만 적용된다는 걸 까먹는 거야. 예를 들어, UPDATE나 DELETE 쿼리가 아무 행도 못 찾으면, RETURNING은 빈 결과를 반환해. 놀라지 말고, 쿼리가 제대로 됐는지 확인하거나, 이런 경우를 코드에서 처리해줘.
또 하나 자주 나오는 실수는, 테이블에 없는 컬럼을 RETURNING에 넣는 거야. 꼭 요청하는 컬럼이 테이블에 있는지 확인해!
이제 RETURNING을 써서 데이터 작업을 훨씬 쉽게 할 수 있게 됐어. 이건 진짜 실전에서 엄청 유용한 도구니까, 꼭 써먹어봐! 앞으로 더 멋진 SQL 실력을 향해 고고!
GO TO FULL VERSION