Atomic 하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법이다.
Atomic 이란? 묶인 SQL 작업들이 모두 성공하던지 실패하던지 둘 중 하나만 해야한다!
SELECT
는 불필요하다BEGIN;
과 END;
혹은 BEGIN;
과 COMMIT;
사이에 해당 SQL들을 사용한다.ROLLBACK;
으로 커밋 되기 전에 SQL 실행을 되돌릴 수 있다.BEGIN;
A의 계좌로부터 인출;
B의 계좌로 입금;
END; --COMMIT; 과 같음
만일 BEGIN;
이전의 상태로 돌아가고 싶다면 ROLLBACK;
실행하면 된다. 하지만 이 동작은 COMMIT mode에 따라 달라진다.
만약 autocommit
이 true
라면 모든 수정/삭제/추가 작업이 COMMIT;
명령 없이 바로 데이터베이스에 쓰여지고,
false
라면 COMMIT;
이 나올 때까지 데이터베이스에 쓰여지지 않는다.
google colab과 psycopg2의 트랜잭션 방식이다.
BEGIN;
END;/COMMIT;
또는 ROLLBACK;
사용DELETE
TRUNCATE
syntax : function(expression) OVER ([PARTITION BY exp][ORDER BY exp])
자주 사용되는 함수
ROW_NUMBER, FIRST_VALUE, LAST_VALUE, LAG
AVG, SUM, COUNT, MAX, MIN, MEDIAN, NTH_VALUE
이 중에서 많이 쓰이는 LAG에 대해 알아보자
어떤 사용자 세션에서 시간순으로 봤을 때 앞 세션 또는 다음 세션의 채널이 무엇인지 알고싶다면?
SELECT usc.*, st.ts,
LAG(channel,1) OVER (PARTITION BY userId ORDER BY ts) prev_channel
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
ORDER BY usc.userid, st.ts
WINDOW 문법으로 위와 같이 작성해주면 이전 채널을 알 수 있다. 다음 채널을 알고 싶다면 간단하게 LAG(channel,1) OVER (PARTITION BY userId ORDER BY ts)
에서 ORDER BY 항목을 내림차순으로 변경해주면 된다.
이렇게 JSON 파일이 주어졌다고 했을 때
{
"f2":{
"f3":"1"
},
"f4":{
"f5":"99",
"f6":"star"
}
}
이렇게 함수를 사용한다. (f4-f6 값 가져오기)
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":"1"},"f4":{"f5":"99","f6":"star"}}','f4', 'f6');
Colab 링크 : https://colab.research.google.com/drive/1B2qae6TKQj5_fXG6JsBo5cub0nWJ-3ok