SQL advanced

트랜잭션

  • 트랜잭션 : 통상적으로 정보의 교환이나 데이터베이스 갱신 등 일련의 작업들에 대해 연속처리단위를 의미
    • DB의 무결성이 보장되는 상태에서 요청된 작업을 완수하기 위한 작업의 기본 단위로 간주
    • 간단히 DB의 상태를 변화시키는 작업의 모음
    • 주로 DB의 상태를 변화시키는 INSERT, DELETE, UPDATE 중 한개 이상의 DML(Data Manipulation Language)과 같이 사용
  • 생활 속 예시

스크린샷 2021-09-10 12 32 39

  • 위 작업 중 어느 하나가 실패로 실행된다면 위의 전제는 실행되어선 안된다.

COMMIT과 Rollback

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE user ( -- 테이블 생성
	id varchar(10) primary Key,
	name varchar(10)
);

INSERT INTO user VALUES ('id1', 'user1'); -- 값 insert
INSERT INTO user VALUES ('id2', 'user2');

COMMIT; -- commit을 하지 않으면 재가동 시 위의 값들 모두 reset

INSERT INTO user VALUES ('id3', 'user3');

ROLLBACK; -- commit을 잘못하면 수동적으로 rollback
  • 트랜잭션 : 여러 개의 작업을 하나의 실행 유닛으로 묶어즌 것
  • 각 트랜잭션은 하나의 특정 작업으로 시작해 묶여 있는 모든 작업을 다 완료해야 끝나게 되어있다.
  • 만약 한 개의 작업이라도 실패하게 된다면 전부 실패한다.
  • 작업이 하나라도 실패하면 트랜잭션도 실패이고 모든 작업이 성공적이면 트랜잭션 또한 성공적이게 된다.
  • 트랜잭션은 미완료된 단계없이 전부를 성공해야 한다.
  • 데이터베이스 트랜잭션의 정의는 ACID 특성을 가지고 있다.

ACID

Atomicity(원자성)

  • 하나의 트랜잭션을 구성하는 작업은 전부 성공하거나 전부 실패해야 된다.
  • 부분적으로 실행되면 안된다.
  • SQL에서 특정 쿼리를 실행했는데 부분적으로 실패하는 부분이 있다면 전부 실패하게 되어있다(충돌 요인에 대해 선택지를 제공한다).

Consistency(일관성)

  • 하나의 트랜잭션 이전과 이후 데이터베이스 상태는 이전과 같이 유효해야 한다.
  • 데이터베이스의 제약이나 규칙에 의거한 데이터베이스여야 한다.
  • cf. user 테이블에 id와 name이 있어야 한다면, 둘 중 하나가 없다면 진행되지 않는다.

Isolation(고립성)

  • 하나의 트랜잭션이 다른 트랜잭션과 독립되어야 한다.
  • 실제로 동시에 여러 개의 트랜잭션이 수행될 때 각 트랜잭션은 고립되어 있어 연속으로 실행된 것과 동일한 결과를 나타내야 한다.
  • 각 트랜잭션은 다른 트랜잭션의 연산 내용을 알 수 없다.
  • 동시에 실행될 때와 연속으로 실행될 때의 데이터 베이스 상태가 동일해야 한다.

Durability(지속성)

  • 하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그가 남고 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야 한다.

SQL More

내장함수

GROUP BY

  • 데이터를 조회할 때 분류하여 묶어서 조회하는 기능
1
SELECT * FROM customers;
  • 각 주 기반 그룹화
1
2
3
SELECT State, COUNT(*)
FROM customers
GROUP BY State;

HAVING

  • GROUP BY로 조회된 결과에 대한 필터
1
2
3
4
SELECT State, COUNT(*)
FROM customers
GROUP BY State
HAVING COUNT(*) >= 3
  • coustomers의 수가 3을 넘는 결과만 조회
  • WHERE는 그룹화하기 전에 조회되는 레코드를 필터

GROUP BY 후

  • COUNT() : 몇 개인지 값을 리턴
  • SUM() : 합
  • AVG() : 평균
  • MAX(), MIN() : 최대, 최소값
1
2
SELECT *, COUNT(*) FROM customers
GROUP BY State;

SELECT 실행 순서

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
1
2
3
4
5
6
SELECT CustomerId, AVG(Total) -- 5. 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값 추출
FROM invoices -- 1. invoices 테이블에 접근
WHERE CustomerId >= 10 -- 2. CustomerId 필드가 10 이상인 레코드 조회
GROUP BY CustomerId -- 3. CustomerId 기준 그룹화
HAVING SUM(Total) >= 30 -- 4. Total 필드의 값들의 합이 30 이상인 결과들만 필터
ORDER BY 2 -- 6. AVG(Total) 필드를 기준으로 오름차순 정렬

etc

  • CASE : SQL에서의 if문
  • SUBQUERY : 쿼리문을 작성할 때 다른 쿼리문을 포함하는 것(JOIN과 유사)
1
2
3
4
5
6
7
8
9
10
SELECT customers.LastName ,
	   (SELECT COUNT(*) FROM invoices WHERE customers.CustomerId = invoices.CustomerId) AS InvoiceCount
FROM   customers;

-- JOIN
SELECT c.LastName , COUNT(*) AS invoceCount
FROM customers c
JOIN invoices i 
ON   c.CustomerId == i.CustomerId
GROUP BY c.CustomerId;

Reference

0%