[DB/SQLD] SQLD 문제풀이 중요개념 정리 (2)

2 분 소요

정렬

null, 10, 10이 있을 때 내림차순 정렬을 수행하면

10, 10, null이 된다.



인덱스 사용 못하는 경우

  1. NVL(key, 0) nvl함수로 null 값을 검사했다. 따라서 key 칼럼의 인덱스를 사용할 수 없다.

  2. to_char(vintagedate, ‘yyyymmdd’)=sysdate to_char() 함수로 인덱스 키 칼럼을 형변환하면 인덱스를 사용할 수 없다.

  3. name   ’’=’lim’
      “는 문자열을 결합하는 것으로 name의 인덱스를 변경하였으므로 인덱스를 사용할 수 없다.



scan

사원 테이블에 사원번호는 기본키로 사원번호 1번을 검색하는데 사원 테이블에는 하나의 row만 저장되어 있다.

하나의 데이터(행)를 읽기 위해서는 인덱스를 사용하지 않고 테이블을 full scan하는 것이 효율적이다. 즉, 검색되는 행이 1건이므로 굳이 인덱스를 읽지 않고 바로 테이블을 검색해야 한다.



sort merge

sort merge방식의 조인은 두개의 테이블을 sort 한 후에 merge한다. merge가 완료되면 한번의 full scan으로 데이터를 검색한다. 따라서 기본키와 외래키 관계에서 외래키에 인덱스가 없을 때 옵티마이저가 sort merge 방식의 조인으로 동작하게 한다.



인덱스 튜닝

  • 인덱스를 경우한 테이블의 random 액세스 부하가 심할 때, 클러스터 테이블이나 iot를 활용하는 방안을 고려할 수 있다.

  • 인덱스를 경유한 테이블 액세스 횟수가 같더라도 인덱스 구성에 따라 스캔 효율이 달라진다. 따라서 인덱스 스캔 효율을 높이기 위해 인덱스 칼럼 순서를 바꿔야 할 때가 종종 있다.

  • 조건절이 where deptno=10 and ename=’scott’일 때 인덱스를 [deptno+ename]순으로 구성하나 [ename+deptno]순으로 구성하나 인덱스 스캔 효율에 차이가 없다.

  • 인덱스 칼럼 순서를 아무리 바꿔도 테이블 random 액세스 횟수는 줄지 않는다.



COALESCE

select coalesce(null, '2', '1') from dual;

coalesce함수는 null이 아닌 첫번째 값을 리턴하는 함수이다.



null

select * 
from dual
where null=null;

null과 null을 비교할 수 없다. 그래서 공집합 즉 아무런 row가 나오지 않는다.



SQL SERVER

sql server에서 오름차순으로 정렬하면 null값이 가장 먼저 나온다.



case문

case문에서 else 조건이 생략되면 else 조건이 만족될 때 null이 된다.



subquery

서브쿼리 특징
Access Subquery 쿼리의 변형이 없고 제공자의 역할을 하는 서브쿼리
Filter Subquery 쿼리의 변형이 없고 확인자 역할을 하는 서브쿼리
Early Filter Subquery 쿼리의 변형이 없고 서브쿼리가 먼저 실행하여 데이터를 걸러낸다



natural join

natural join은 ANSI/ISO 표준 SQL에서 두 테이블 간에 동일한 칼럼 이름을 가지는 것을 모두 출력하는 조인 방식이다.

natural join의 특징으로 Alias를 사용할 수 없고, 두 테이블에서 동일한 칼럼 이름을 가지는 칼럼은 모두 조인된다. 동일한 칼럼이 두 개 이상일 경우 join~using 문장을 사용한다.



단일행 숫자형 함수

숫자형 함수 설명
ABS(숫자) 절댓값을 반환
SIGN(숫자) 양수,음수,0을 구분. 양수면 1을 반환, 음수면 -1을 반환
CEIL/CEILING(숫자) 숫자보다 크거나 같은 최소의 정수를 반환
FLOOR(숫자) 숫자보다 작거나 같은 최소의 정수를 반환
ROUND(숫자[,m]) m의 기본값은 0이고 m+1 자리에서 반올림
TRUNC(숫자[,m]) m의 기본값은 0이고 m+1 자리를 자른다.



날짜 함수

select next_day(add_months (sys-date,6), '월요일')
from dual;

add_months 함수는 6개월을 더하고 next_day 함수는 지정된 요일의 첫 번째 날짜를 출력한다. 즉 위 쿼리는 6개월 후 첫 번째 월요일을 출력한다.



view

view는 실제 데이터를 가지고 있지 않는다.



서브쿼리

서브쿼리는 order by 절에 사용할 수 있다.