[4/26] TIL - SQL을 이용한 데이터 분석[5]

Sangwon Jwa·2024년 4월 26일

데브코스 TIL

목록 보기
21/54
post-thumbnail

📖 학습 주제


  1. Transaction
  2. 기타 고급 문법

✏️ 주요 메모 사항 소개


Transaction

Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법. Atomic하다는 것은 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다. 즉 작업이 모두 반영되거나 모두 반영되지 않아야 한다는 뜻이다.
예를들어 은행 계좌 이체에 있어서 인출과 입금 작업이 있을 때 하나의 작업만 성공하는 경우 계좌 잔액의 오류가 생기기 때문에 인출과 입금은 모두 성공하거나 실패해야 한다.

문법

BEGIN;
	A의 계좌로부터 인출;
    B의 계좌로 입금;
END;
  • END대신 COMMIT 사용 가능. 만일 BEGIN 전의 상태로 돌아가고 싶다면 ROLLBACK을 실행하면 된다. 이 동작은 commit mode에 따라 달라진다.
  • autocommit = True : 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGINEND(COMMIT)/ROLLBACK으로 처리한다.
  • autocommit = False : 모든 레코드 수정/삭제/추가 작업이 COMMIT 호출될 때까지 커밋되지 않는다.

알아두면 유용한 SQL 문법들

DELETE FROM vs TRUNCATE

  • DELETE FROM table_name : 테이블에서 모든 레코드를 삭제, WHERE을 통해 특정 레코드만 삭제 가능하다.
  • TRUNCATE table_name : 이것도 테이블에서 모든 레코드를 삭제하지만 DELTE FROM 보다 빠르게 수행된다. 따라서 전체 테이블의 내용을 삭제할 시 에는 TRUNCATE가 유리하다. 하지만 WHERE를 지원하지 않고 Transaction을 지원하지 않기 때문에 주의해야한다.

UNION

  • 여러개의 테이블들이나 SELECT 결과를 하나의 결과로 합쳐줌 (합집합). UNION은 중복을 제거하고 UNION ALL은 중복을 제거하지 않음.
SELECT 'sangwon' as first_name, 'jwa' as last_name

UNION

SELECT 'elon', 'musk'

EXCEPT

  • 하나의 SELECT 결과에서 다른 SELECT 결과를 빼주는 것이 가능 (차집합)

INTERSECT

  • 여러 개의 SELECT 문에서 같은 레코드들만 찾아줌 (교집합)

COALESCE

  • 첫번째 Expression부터 값이 NULL이 아닌 것이 나오면 그 값을 리턴하고, 모두 NULL이면 NULL을 리턴
  • NULL 값을 다른 값으로 바꾸고 싶을 때 사용한다.

NULLIF

  • 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;

WINDOW 함수

[문법]

function(expression) OVER ( [PARTITION BY expression] [ORDER BY expression] )

  1. 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;

JSON Parsing Functions

  • JSON의 포맷을 이미 아는 상황에서만 사용가능한 함수로 JSON String을 입력받아 특정 필드의 값을 추출 가능
    예를들어 다음과 같은 JSON 파일이 있다고 할 때

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');

💦 공부하며 어려웠던 내용


0개의 댓글