📖 학습주제
데이터 웨어하우스와 SQL 기본에 대해 배우고 이를 바탕으로 데이터 분석에 대해 학습 (5)
트랜잭션
- Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는
방법
-> 트랜잭션으로 묶인 SQL중 하나라도 실패하면 실행 전으로 돌아감(ROLLBACK)
- DDL이나 DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음. SELECT에 사용할 이유가 x(트랜잭션 적용해야 할 SQL을 구분해야 함)
- BEGIN과 END 혹은 BEGIN과 COMMIT(혹은 END) 사이에 해당 SQL들을 사용
- ROLLBACK으로 BEGIN 이전으로 돌아갈 수 있음
예를 들어 은행에서 계좌 이체를 하는 과정을 생각해보자.
은행은 송금 계좌에서 돈을 인출해 수금 계좌에 돈을 입급해야 한다. 그런데 인출하는 과정은 성공했으나 입금 과정에서 실패한다면? 이 과정이 트랜잭션으로 묶여있다면 돈을 인출하기 이전으로 돌아간다.(트랜잭션으로 묶이지 않았다면 그대로 돈을 잃을 것이다.)
BEGIN;
A의 계좌로부터 인출;
B의 계좌로 입금;
END;
트랜잭션 커밋 모드: autocommit
autocommit = True
- 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 이를 커밋(Commit)된다고 함
- 만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN과 END(COMMIT)/ROLLBACK으로 처리
autocommit = False
- 모든 레코드 수정/삭제/추가 작업이 COMMIT 호출될 때까지 커밋되지 않음
DELETE FROM vs. TRUNCATE
DELETE FROM table_name
- WHERE 사용해 특정 레코드만 삭제 가능
- 속도가 느림
TRUNCATE table_name
- WHERE을 지원하지 않음 : 특정 레코드만 삭제 불가
- Transaction을 지원하지 않음 : 롤백 불가
둘 다 테이블에서 모든 레코드를 삭제하지만 전체 테이블의 내용 삭제시에는 DELETE FROM보다 TRUNCATE가 여러모로 유리 but 롤백이 안되므로 신중해야 함
SQL 고급 문법
UNION(합집합)
- 여러개의 테이블들이나 SELECT 결과를 하나의 결과로 합쳐줌
- UNION : 중복제거
- UNION ALL : 중복포함
EXCEPT (MINUS)
- 하나의 SELECT 결과에서 다른 SELECT 결과를 빼주는 것이 가능
INTERSECT (교집합)
- 여러 개의 SELECT문에서 같은 레코드들만 찾아줌
COALESCE(Expression1, Expression2, …)
- Expression1부터 인자를 하나씩 살펴서 NULL이 아닌 값이 나오면 그걸 리턴
- 모두 NULL이면 최종적으로 NULL을 리턴
- NULL값을 다른 값으로 바꾸고 싶을 때 사용
NULLIF(Expression1, Expression2)
- Expression1과 Expression2의 값이 같으면 NULL을 리턴
LISTAGG
LISTAGG(field1, sep) WITHIN GROUP (ORDER BY field2)
- GROUP BY에서 사용되는 Aggregate 함수 중의 하나
- 그룹에 속해있는 데이터들을 한 줄에 나열해 리턴
- WITHIN GROUP (ORDER BY field2)으로 정렬 가능
- 두번째 인자로 구분자 지정 가능
WINDOW 함수
문법
window_function(expression) OVER ( [ PARTITION BY expression] [ ORDER BY expression ] )
- OVER 사용
- PARTITION BY : 소그룹으로 나누는 기준
- ORDER BY : 순서를 정하는 기준
- e.g.)
- ROW_NUMBER, FIRST_VALUE, LAST_VALUE, LAG
- Math functions: AVG, SUM, COUNT, MAX, MIN, MEDIAN, NTH_VALUE
LAG
JSON FUNCITONS
https://docs.aws.amazon.com/redshift/latest/dg/json-functions.html