오브의 빛나는 별

[SQL] 과목Ⅱ. SQL 기본 및 활용(2) 본문

SQL

[SQL] 과목Ⅱ. SQL 기본 및 활용(2)

오브의 별 2023. 11. 13. 21:50
반응형

TCL

트랜잭션
- 데이터베이스릐 논리적 연산단위
- 하나의 트랜잭션에는 하나 이상의 SQL 문장 포함
- 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작
- 그렇기 떄문에 전부 적용하거나 전부 취소. ALL OR NOTHING의 개념

A-> B 100만원 이체 프로세스
1. A 계좌 잔액 조회
2. A 계좌 100만원 차감
3. B 계좌 잔액 조회
4. B 계좌 100만원 추가

트랜잭션: 트랜잭션 시작 이후 실행되는 쿼리를 하나의 작업으로 처리
- 트랜잭션 범위 내에서 실행되는 쿼리 결과는 커밋 전까지는 DB에 반영되지 않음
트랜잭션 커밋(=SAVE): 트랜잭션 시작 이후 에러가 발생하지 않으면 쿼리 결과를 DB에 반영
트랜잭션 롤백(=LOAD): 에러가 발생하면 실행된 쿼리 결과를 DB에 반영하지 않고 취소

트랜잭션 특성
- 원자성: 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아 있어야 함
- 일관성: 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안됨
- 고립성: 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안됨
- 지속성: 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장됨

잠금: 원자성과 관련도니 것으로 어떤 트랜잭션이 진행 중일 떄 방해받지 못하게 함(ex: 중복 이체)

COMMIT: 입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 -> 트랜잭션 완료
COMMIT이나 ROLLBACK 이전의 상태
- 메모리 버퍼에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능
- 현재 사용자는 SELECT 문장으로 결과 확인 가능
- 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없음
- 변경된 행은 잠금이 설정되어서 다른 사용자가 변경 불가
COMMIT 이후의 데이터 상태
- 데이터에 대한 변경 사항이 데이터베이스에 반영
- 이전 데이터는 영원히 손실
- 모든 사용자는 결과를 볼 수 있음
- 관련된 행에 대한 잠금이 풀리고, 다른 사용자들이 행을 조작할 수 있음
SQL Server에서 COMMIT
- DLL 뿐만 아니라 DML도 AUTO COMMIT -> COMMIT 필요X
- 명령어가 성공하면 COMMIT, 실패하면 ROLLBACK

ROLLBACK
- 테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터에 대해 COMMIT 이전에는 변경 사항을 취소할 수 있는데 데이터베이스에서는 롤백 기능 사용
- 롤백은 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복구되며, 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 데이터 변경을 할 수 있음
ROLLBACK 후의 데이터 상태
- 데이터에 대한 변경사항 취소
- 이전 데이터는 다시 재저장
- 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 행을 조작할 수 있게 됨
SQL Server에서의 ROLLBACK
- AUTO COMMIT이므로, ROLLBACK을 위해서는 명시적으로 트랜잭션을 선언해야 함
- BEGIN TRAN INSERT INTO PLAYER(PLAYER_ID, TEAM_ID, PLAYER_NAME) VALUES('1999035', 'K02', '가나다'); ROLLBACK;
- BEGIN TRAN UPDATE PLAYER SET TEAM_ID='K01'; ROLLBACK;
- BEGIN TRAN DELETE FROM PLAYER; ROLLBACK;
- ROLLBACK을 누르면 BEGIN TRAN으로 돌아감. BEGIN TRAN 뒤에 sql 문이 취소됨
COMMIT과 ROLLBACK 효과
- 데이터 무결성 보장
- 영구적인 변경을 하기 전에 데이터의 변경사항 확인 가능
- 논리적으로 연관된 작업을 그룹핑하여 처리 가능

SAVEPOINT
- 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 SAVEPOINT까지 트랜잭샨의 일부만 롤백
- 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 SAVEPOINT까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행 가능
- 복수의 SAVEPOINT를 정의할 수 있으며, 동일이름으로 SAVEPOINT를 정의했을 때는 나중에 정의한 SAVEPOINT가 유효

 

WHERE 절

WERER
- 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대해 제한할 수 있음
- WHERE 조건절을 사용하지 않고 필요 없는 많은 자료들을 데이터베이스로부터 요청하는 SQL 문장은 대량의 데이터를 점색하기 위해 서버의 CPU나 MEMORY와 같은 시스템 자원들을 과다하게 사용. 네트워크에 부하도 일으킴
- 이런 문제점을 방지하기 위해 WHERE 절에 조건이 없는 FTS 문장은 SQL 튜닝의 1차적인 검토 대상이 됨.(FTS가 무조건 나쁜 것은 아니며 병렬 처리 등을 이용해 유용하게 사용하는 경우도 많음
- SELECT ~ FROM ~ WHERE 순서

연산자의 종류
- K-리그 일부 선수들의 이름과 포지션, 백넘버를 알고싶음
- 조건은 소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들 중에서 포지션이 미드필드이면서, 키는 170cm 이상, 180cm 이하여야 함
- 조건을 주체적으로 설정하기 위해 다향한 연산자의 조합이 필요
관련 연산
- WHERE TEAM_ID = 'K02'
- WHERE POSITION = "MF"
- WHERE HEIGHT >= 170
- WHERE HEIGHT <= 180
-> '180'이라고 표현하더라도, HEIGHT라는 칼럼이 숫자 유형의 변수이므로 내부적으로 '180'이라는 문자열을 숫자 유형 180으로 바꾸어 처리
관련 연산
- WHERE TEAM_ID IN ('K02', 'K07')
- WHERE POSITION LIKE 'MF'
WHERE HEIGHT BETWEEN 170 AND 180
- 조건은 소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들 중에서 포지션이 미드필드이면서, 키는 170cm 이상, 180cm 이하여야 함
- SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER WHERE (TEAM_ID='K02' OR TEAM_ID='K07') AND POSITION='MF AND HEIFHT>=170 AND HEIGHT<=180;
- SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER WHERE TEAM_ID IN('K02', 'K07') AND POSITION='MF AND HEIFHT 170 BETWEEN 180;

ROWNUM
- Oracle의 ROWNUM은 칼럼과 비슷한 성격의 Pseudo Column으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호
- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용(MYSQL의 limit와 유사)
- 1건의 행만 가져오고 싶을 때
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1;
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM < 2;
- 2건 이상의 N 행을 가져오고 싶을 때
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM < N+1;

TOP 절
- SQL Server는 TOP 절을 사용하여 결과 집합으로 출력되는 행의 수 제한
- TOP (Expression) [PERCENT] [WITH TIES]
- Expression: 반환할 행의 수를 지정하는 숫자
- PERCENT: 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨
- WITH TIES: ORDER BY 절이 지정된 경우에만 사용할 수 있으며, TOP N(PERCERNT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력
- 1건의 행만 가져오고 싶을 떄
- SELECT TOP(1) PLAYER_NAME FROM PLAYER;
- 2건 이상의 N 행을 가져오고 싶을 때
- SELECT TOP(N) PLAYER_NAME FROM PLAYER;

 

함수

함수의 분류
- 벤더에서 제공하는 함수인 내장 함수(ex: Oracle, MYSQL 등)
- 사용자가 정의할 수 있는 함수

내장 함수
- SQL을 더욱 강력하게 해주고 데이터 값을 간편하게 조작하는데 사용
- 벤더별로 가장 큰 차이를 보이나, 핵심적인 기능들은 이름이나 표현법이 다르더라도 대부분의 데이터베이스가 공통적으로 제공
- 단일행 값이 입력되는 단일행 함수
- 여러 행의 값이 입력되는 다중행 함수 - 집계 함수, 그룹 함수, 윈도우 함수

단일행 함수의 특징
- SELECT, WHERE, ORDER BY 절에 사용 가능
- 각 행들에 대해 개별적으로 작용하여 데이터 값들을 조작하고, 각각의 행에 대한 조작 결과를 리턴
- 여러 인자를 입력해도 단 하나의 결과만 리턴
- 함수의 인자로 상수, 변수, 표현식이 사용 가능하고, 하나의 인수를 가지는 경우도 있지만 여러 개의 인수를 가질 수도 있음
- 특별한 경우가 아니면 함수의 인자로 함수를 사용하는 함수의 중첩 가능

DUAL 테이블
- 사용자 SYS가 소유하며 모든 사용자가 액세스 가능
- SELECT~FROM~의 형식을 갖추기 위한 일종의 DUMMY 테이블
- SQL Server의 경우 SELECT만으로도 SQL 문장 실행 가능(DUAL 필요X)


날짜형 함수
- 데이터베이스는 날짜를 지정할 때 내부적으로 세기, 년, 월, 일, 시, 분, 초와 같은 숫자 형식으로 변환하여 저장
- 날짜는 여러 가지 형식으로 출력이 되고 날짜 계산에도 사용되기 때문에 그 편리성을 위해서 숫자형으로 저장하는 것
- 날짜를 숫자로 저장하기 때문에 덧셈, 뺄셈 같은 산술 연산자로도 계산 가능
연산 결과 설명
날짜 + 숫자 날짜 숫자만큼의 날수를 날짜에 더한다.
날짜 - 숫자 날짜 숫자만큼의 날수를 날짜에서 뺀다.
날짜1 - 날짜2 날짜수 날짜에서 다른 날짜를 빼면 일수가 나옴
날짜 + 숫자/24 날짜 시간을 날짜에 더한다

변환형 함수
- 명시적 데이터 유형 반환: 데이터 변환형 함수로 데이터 유형을 변환하도록 명시해주는 경우
- 암시적 데이터 유형 반환: 데이터베이스가 자동으로 데이터 유형을 반환하여 계산하는 경우
- 암시적 데이터 유형 반환의 경우 성능 저하가 발생할 수 있으며, 자동적으로 데이터베이스가 알아서 계산하지 않는 경우가 있어 에러를 발생할 수 있으므로 명시적인 데이터 유형 변환 방법을 사용하는 것이 바람직함


NULL의 특징
- 널 값은 아직 정의되지 않은 값으로 0 또는 공백과 다름 - 0은 숫자, 공백은 문자
- 테이블을 생성할 때 NOT NULL 또는 PROMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을 포함할 수 있음
- NULL 값을 포함하는 연산의 경우 결과 값도 NULL 값
- 결과값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL(Oracle)/ISNULL(SQLServer) 함수 사용
- NULL 값의 대상이 숫자 유형 데이터인 경우는 주로 0으로, 문자 유형 데이터인 경우는 공백보다는 'x' 같이 해당 시스템에서 의미 없는 문자로 바꾸는 경우가 많음
- NVL 함수를 다중행 함수의 인자로 사용하는 경우는 오히려 불필요한 부하를 발생할 수 있으므로 굳이 NVL 함수를 사용할 필요x
반응형