티스토리 뷰

Computer Science

[SQLP] 오답노트

jhkang-dev 2020. 5. 3. 18:04

Searched Case Expression과 Simple Case Expression의 차이

- 이 둘의 가장 큰 차이점은 Simple Case Expression은 'expression'을, Searched Case Expression은 'Condition'을 사용하여 Return 값이 정해집니다.

 

예시)

Searched Case Expression 

SELECT t.id,

CASE WHEN t.color = 1 THEN 'Red'

    WHEN t.color = 2 THEN 'Blue'

    WHEN t.color = 3 THEN 'Green'

    ELSE 'NoColor' END AS color

FROM @t t

 

위의 예시를 보면 Searched Case Expression에서는 t.color의 조건에 따라 결과값을 리턴해주는 것을 확인할 수 있다.

출처: https://bangganji.tistory.com/395 [어정쩡하게 살지 말자!]

 

Simple Case Expression

SELECT t.id,

CASE t.color WHEN 1 THEN 'Red'

            WHEN 2 THEN 'Blue'

            WHEN 3 THEN 'Green'

            ELSE 'NoColor' END AS Color

FROM @t t

위의 예시를 보면 Simple Case Expression에서는 t.color가 무슨 값인지의 expression에 따라서 리턴값이 정해진다.

 

 

오라클에서 날짜 연산

1/24 1시간
1/24/60 1분
1/24/30 2분
1/24/12 5분
1/24/6 10분
1/24/(60/10) 10분

 

select sysdate,
         (sysdate-1/24/60) "1분 전",
         (sysdate-1/24/30) "2분 전",
         (sysdate-1/24/12) "5분 전",
         (sysdate-1/24/6) "10분 전",
         (sysdate-1/144) "10분 전",
         (sysdate-30/1440) "30분 전",
         (sysdate-1/24) "1시간 전",
         trunc(sysdate-1) "1일 전",
         trunc(sysdate-7) "7일 전",
         trunc(sysdate-30) "30일 전",
         trunc(sysdate+1)-6/24 "6AM 전",
         trunc(sysdate+1)-2/24 "2PM 전" 
from dual;
출처: https://oracle.tistory.com/216 [안나푸르나]

 

 

 

ISNULL의 사용

ISNULL함수는 결과값이 NULL일 경우 지정된 값을 반환한다. 칼럼의 NULL값을 확인할 때는 ISNULL을 사용해야 한다.

 

추가사항 : SELECT COUNT(COL1) FROM TAB1 WHERE COL2 = NULL  --> 이 WHERE절은 잘못되어있다.

오라클에서 NULL은 데이터가 존재하지 않는 상태이기 때문에, 우리가 알고 있는 일반적인 연산자를 사용할 수 없다.

WHERE COL2 IS NULL 로 사용하여야 NULL값인 경우의 행을 반환한다.

*NULL 비교는 오직 IS NULL, IS NOT NULL로만 가능

NULL을 연산자로 비교한 케이스

 

COALESCE 함수의 쓰임

사용 : 첫번째 NULL이 아닌 값을 반환한다.

각 ROW에서 첫번쨰로 NULL이 아닌 값을 반환한다.

 

집계함수의 NULL 처리

- 다중행 함수에서는 NVL 함수를 사용하게 되면 오히려 불필요한 과부하가 걸려서 다중행 함수안에 NULL처리 함수를 사용할 필요가 없다.

-  다중행 함수는 전체건수 중에서 일부만 NULL인 경우 NULL인 행을 다중행 함수에서 제외하고 처리한다.

- AVG 함수, SUM 함수, COUNT 함수 등에서 NULL인 행은 제외 되고 집계된다

 

SQL 실행순서

-문법 순서-

 

SELECT                            - 1

FROM                               - 2

WHERE                             - 3

GROUP BY                        - 4

HAVING                            - 5

ORDER BY                        - 6

 

-실행 순서-

 

FROM                               - 1

WHERE                             - 2

GROUP BY                        - 3

HAVING                             - 4

SELECT                            - 5

ORDER BY                         - 6

 

** SQL 실행순서에 의해 HAVING 절은 SELECT 절보다 선행처리된다. 그래서 HAVING COUNT(*) > 1  이라는 조건이 있을 경우 건수가 2개이상인 건만 추출이 되게 된다.



출처: https://police84.tistory.com/69 [찐빵의 IT World]

 

 

ORDER BY 절에 대한 것( pg71, 57번)

참고 링크 : http://www.gurubee.net/lecture/2374

- ORDER BY 절에서 컬럼명 대신 Alias 명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있다.

아래와 같이 컬럼의 순서를 나타내는 정수로도 ORDER BY 문 사용이 가능하다.

- GROUP BY 절을 사용하는 경우 ORDER BY 절에 집계 함수를 사용할 수도 있다.(내가 틀렸던 부분)

--> HAVING 절에만 집계함수를 사용할 수 있는줄 알았는데, ORDER BY문에도 가능하다.

 

TOP(N) 쿼리

- SQL SERVER의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용하여야 한다.

 

 

Redo 로그 매커니즘 용어

- Log Force at commit : 로그 버퍼를 주기적으로 로그파일에 기록하되 늦어도 커밋 시점에는 반드시 기록해야 함을 뜻함

- Fast Commit : 사용자의 갱신내용이 메모리상의 버퍼 블록에만 기록된채 아직 디스크에 기록되지 않았지만, Redeo로그를 믿고 빠르게 커밋 완료하는 것을 말한다

- Delayed Block Cleanout : 오라클만의 독특한 메커니즘으로서 변경된 블록을 커밋시점에 바로 Cleanout(로우 Lock정보 해제, 커밋정보 기록) 하지 않고 그대로 두었다가 나중에 해당블록을 처음 읽는 세션에 의해 정리되도록 하는 것을 말한다.

- Write Ahead Logging : 버퍼 캐시블록을 갱신하기 전에 변경사항을 먼저 로그 버퍼에 기록해야 하며, Dirty 버퍼를 디스크에 기록하기 전에 해당 로그 엔트리를 먼저 로그 파일에 기록해야 한다.

 

 

 

댓글