본문 바로가기

SQL

트랜잭션과 기타 고급 SQL 문법

 

 

 

5주차 고급 SQL 활용

데이터 웨어하우스와 SQL 기본에 대해 배우고 이를 바탕으로 데이터 분석에 대해 학습 (5)

 

학습 주제: 트랜잭션과 기타 고급 SQL 문법

 

 

트랜잭션

 

트랜잭션이란?

Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법

 

은행 계좌 이체를 예로 들 수 있다.

만일 인출은 성공했는데 입금이 실패한다면? 이 두 과정은 동시에 성공하든지 실패하든지 해야 함

조회만 한다면 트랜잭션으로 묶일 이유가 없기 때문에 SELECT에는 사용할 이유가 없고, DDL이나 DML 중 레코드를 수정, 추가, 삭제한 것에만 의미가 있다.

 

BEGIN;

        A의 계좌로부터 인출;

       B의 계좌로 입금;

END;

 

END는 COMMIT과 동일(BEGIN;COMMIT도 가능하다는 뜻)

만일 BEGIN 전의 상태로 돌아가고 싶다면 ROLLBACK 실행

 

트랜잭션 커밋 모드는 autocommit = True 또는 autocommit = False 로 설정할 수 있음

Google Colab의 경우 기본적으로 모든 SQL statement가 바로 커밋되므로, autocommit = True 모드

이를 바꾸고 싶다면 위의 구조처럼 BEGIN;END; 혹은 BEGIN;COMMIT 혹은 ROLLBACK;을 사용

 

DELETE FROM과 TRUNCATE 비교: TRUNCATE은 트랜잭션을 지원하지 않는다는 차이점이 있다.

 

 


 

 

 

기타 알아두면 유용한 SQL 문법들

 

  • UNION, EXCEPT, INTERSECT
  • COALESCE(Expression1, Expression2, ...): 첫번째 Expression부터 값이 NULL이 아닌 것이 나오면 그 값을 리턴하고 모두 NULL이면 NULL을 리턴한다. => NULL 전처리할 때 많이 사용한다.
  • NULLIF(Expression1, Expression2): Expression1과 Expression2의 값이 같으면 NULL 리턴

 

LISTAGG

 

GROUP BY에서 사용되는 Aggregate 함수 중 하나

사용자 ID별로 채널을 순서대로 리스트한다면:

 

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;

 

LISTAGG(channel) 부분을 LISTAGG(channel, '->') 이런 식으로 바꿔주면 가독성이 좋아짐

 

 

WINDOW

 

보통 ROW_NUMBER, FIRST_VALUE, LAST_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

 

 

이외에도 JSCON Parsing 함수가 있다.

 

 


 

 

 

공부하며 어려웠던 내용

 

2주 전에 SQL 기본 문법 배울 때는 괜찮았는데 이번주에 배운 내용들은 확실히 고급 SQL 문법 내용이 많아서 약간 기가 죽었다. 멘토님께서 SQL 자체가 어렵지 않고 필요에 따라 검색해서 쓰면 되니까 중급 수준만 하면 문제없을거라고 하셨는데 불안해서 그냥 안 불안할 때까지(ㅋㅋㅋ) 계속 해보려고 한다...ㅎㅎ 당연히 커리큘럼 따라가는 것을 최우선으로 하면서!!! 그냥 추가적으로 한다는 뜻

 

 

'SQL' 카테고리의 다른 글

JOIN 심화 학습  (0) 2024.03.21
GROUP BY와 Aggregate 함수  (0) 2024.03.20
Redshift, 팀워크 특강  (0) 2024.03.19
데이터 웨어하우스, AWS, Redshift  (0) 2024.03.18
NBA Players 실전 데이터 분석  (2) 2024.03.08