반응형
💡 isolation level이 낮은 경우 발생할 수 있는 문제점
- Dirty read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것
- Phantom read : 한 트랙잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상
- Non-Repeatable read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상
💡 ORACLE과 SQL server에서의 commit과 rollback [29]
- ORACLE에서는 DDL(create, drop, alter..) 문장 수행 후 자동으로 commit을 수행
- SQL server에서는 DDL 문장 수행 후 자동으로 commit을 수행하지 않음
- SQL server에서는 CREATE TABLE 문장도 TRANSACTION의 범주에 포함
=> ROLLBACK 문장에 의해서 최종적으로 B 테이블은 생성되지 않음
💡 저장점(SAVEPOINT)
- 저장점을 정의하면 롤백 할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 savepoint 까지 트랜잭션의 일부만 롤백할 수 있음
- [ORACLE]
SAVEPOINT SVPT1;
...
ROLLBACK TO SVPT1;
=> ...에 있던 부분은 모두 ROLLBACK - [SQL server]
SAVE TRANSACTION SVPT1;
...
ROLLBACK TRANSACTION SVPT1;
=> ...에 있던 부분은 모두 ROLLBACK
💡 논리연산자의 우선순위
- NOT > AND > OR
💡 NULL
- NULL 값이 포함된 사칙 연산의 결과는 NULL
- NULL 값을 조건절에서 사용하는 경우 IS NULL / IS NOT NULL 이란 키워드를 사용해야 함
💡 [37]
- [SQL]
ㄱ. SELECT * FROM 서비스 WHERE 서비스번호 = 1;
ㄴ. INSERT INTO 서비스 VALUES ('999', '', '2015-11-11');
ㄷ. SELECT * FROM 서비스 WHERE 서비스명 = '';
ㄹ. SELECT * FROM 서비스 WHERE 서비스명 IS NULL; - ㄴ과 같이 데이터를 입력하면, 서비스명 컬럼의 데이터에 대해서 ORACLE에서는 NULL로 입력됨
- ㄴ과 같이 데이터가 입력되어있을 때, ORACLE에서 데이터를 조회하려면 서비스명 IS NULL 조건으로 조회해야 함
- ㄴ과 같이 데이터가 입력되어있을 때, SQL server에서 데이터를 조회하려면 서비스명=''로 조회해야 함
💡 내장함수 [40]
- 함수는 벤더에서 제공하는 함수인 내장 함수와 사용자가 정의할 수 있는 함수로 나눌 수 있음
- 내장 함수는 다시 단일행함수와 다중행함수로 나눌 수 있음
- 다중행 함수는 집계함수, 그룹함수, 윈도우 함수로 구분
- 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분
- 단일행 함수 예 : =, >, <...
- 다중행 함수 예 : IN, EXIST...
- 단일행 함수는 select, where, order by, update의 set절에 사용이 가능
- 일대다 조인이라 하더라도 다쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 단일행 함수 사용가능
- 다중행 함수와 단일행 함수는 동일하게 단일 값만을 반환
💡 라인 수 구하기 sql [41]
TAB1
ROWNUM | C1 |
1 | A ↓ A |
2 | B ↓ B ↓ B |
SELECT SUM(CC)
FROM(
SELECT(LENGTH(C1)-LENGTH(REPLACE(C1, CHR(10)))+1) CC FROM TAB1
)
LENGTH : 문자열의 길이를 반환하는 함수
CHR : 주어진 ASCII 코드에 대한 문자를 반환하는 함수 (CHR(10)-> 줄바꿈)
REPLACE : 문자열을 치환하는 함수 (REPLACE(C1, CHR(10))-> 줄바꿈 제거)
함수 결과 값
ROWNUM | C1 | LENGTH(C1) | REPLACE(C1, CHR(10)) | LENGTH(REPLACE(C1, CHR(10))) | |
1 | A A |
3(A+줄바꿈+A) | 변경 전 A A |
변경 후 AA |
2 |
2 | B B B |
5 | 변경 전 B B B |
변경 후 BBB |
3 |
2+3 =5
답 5
💡 ORACLE 에서의 날짜 연산 [42]
SELECT TO_CHAR(TO_DATE('2015.01.10 10', 'YYYY.MM.DD HH24')+1/24/(60/10), 'YYYY.MM.DD HH24:MI:SS') FROM DUAL;
- 오라클에서 날짜의 연산은 숫자의 연산과 같음
- 특정 날짜에 1을 더하면 하루를 더한 결과와 같으므로 1/24/60 = 1분을 의미
1=하루
1/24 = 하루를 24로 나눈다= 한시간
1/24/60 = 한시간을 60으로 나눈다 = 1분
1/24/(60/10) = 한시간을 6으로 나눈다 = 10분 - 따라서 10분 더해주면 된다.
답 : 2015.01.10 10:10:00
💡 SEARCHED_CASE_EXPRESSION -> SIMPLE_CASE_EXPRESSION 으로 변환 [43]
[ SEARCHED_CASE_EXPRESSION ]
WHEN LOC = 'NEW YORK' THEN 'EAST'
[ SIMPLE_CASE_EXPRESSION ]
LOC WHEN 'NEW YORK' THEN 'EAST'
=> SIMPLE은 부등호를 없앤다
💡 ISNULL함수 [45]
- ISNULL 함수는 결과값이 NULL일 경우 지정된 값을 반환
ISNULL(COL2,'X')
=> COL2값이 NULL이면 'X'를 반환 - WHERE 절안에서 컬럼의 NULL 값을 확인할 때는 IS NULL을 사용해야 함
💡 단일행 NULL 관련 함수 [46]
- NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2)
=> 표현식1의 결과값이 NULL이면 표현식2의 값을 출력
=> 단 표현식1과 표현식2의 결과 데이터 타입이 같아야 함
=> NULL 관련 가장 많이 사용되는 함수로 상당히 중요 - NULLIF(표현식1, 표현식2)
=> 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 반환 - COALESCE(표현식1, 표현식2, ...)
=> 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타냄
=> 모든 표현식이 NULL이라면 NULL 리턴
사원 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시하려고 한다.
=> NULLIF(MGR, 7698) 사용
💡 NULL AVG 연산
- NULL은 AVG 연산 대상에서 제외, COUNT도 마찬가지.
반응형
'CS > SQLD' 카테고리의 다른 글
[sqld 오답노트] 2-1 SQL 기본 (3) (0) | 2023.11.16 |
---|---|
[sqld 오답노트] 2-1 SQL 기본 (1) (0) | 2023.11.14 |
[sqld 오답노트] 1-2 데이터 모델과 성능 (0) | 2023.11.07 |
[sqld 오답노트] 1-1 데이터 모델 (1) | 2023.11.06 |