
- Transaction
- 기타 고급 문법
Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법.Atomic하다는 것은 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다. 즉 작업이 모두 반영되거나 모두 반영되지 않아야 한다는 뜻이다.
예를들어 은행 계좌 이체에 있어서 인출과 입금 작업이 있을 때 하나의 작업만 성공하는 경우 계좌 잔액의 오류가 생기기 때문에 인출과 입금은 모두 성공하거나 실패해야 한다.
BEGIN;
A의 계좌로부터 인출;
B의 계좌로 입금;
END;
END대신 COMMIT 사용 가능. 만일 BEGIN 전의 상태로 돌아가고 싶다면 ROLLBACK을 실행하면 된다. 이 동작은 commit mode에 따라 달라진다.autocommit = True : 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN 과 END(COMMIT)/ROLLBACK으로 처리한다.autocommit = False : 모든 레코드 수정/삭제/추가 작업이 COMMIT 호출될 때까지 커밋되지 않는다.DELETE FROM table_name : 테이블에서 모든 레코드를 삭제, WHERE을 통해 특정 레코드만 삭제 가능하다.TRUNCATE table_name : 이것도 테이블에서 모든 레코드를 삭제하지만 DELTE FROM 보다 빠르게 수행된다. 따라서 전체 테이블의 내용을 삭제할 시 에는 TRUNCATE가 유리하다. 하지만 WHERE를 지원하지 않고 Transaction을 지원하지 않기 때문에 주의해야한다.UNION은 중복을 제거하고 UNION ALL은 중복을 제거하지 않음.SELECT 'sangwon' as first_name, 'jwa' as last_name
UNION
SELECT 'elon', 'musk'

SELECT userid, LISTAGG(channel, '->') WITHIN GROUP (ORDER BY ts) channels
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
GROUP BY 1
LIMIT 10;

[문법]
function(expression) OVER ( [PARTITION BY expression] [ORDER BY expression] )
LAG : 현재 행 이전의 행에 있는 값을 가져올 때 사용된다. 주로 시계열 데이터나 순서에 따른 이전 값의 비교 등에 활용
SELECT usc.*, st.ts, LAG(channel, 1) OVER (PARTITION BY userId ORDER BY ts DESC) 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
LIMIT 5;


SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3": "1"},"f4":{"f5":"99","f6":"star"}}','f4', 'f6');

SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3": "1"},"f4":{"f5":"99","f6":"star"}}','f4');
