Oracle에서 ORDER BY 없이 인덱스만으로 자동 정렬이 될까?
결론부터 말하겠습니다.
“안 됩니다. 반드시 ORDER BY를 써야 합니다.”
인덱스가 정렬된 구조라 하더라도, Oracle은 쿼리 결과의 순서를 자동으로 보장하지 않습니다.
1. 왜 안 되는가?
- SQL에서 ORDER BY가 없으면 결과 순서는 미정(indeterminate) 입니다.
- 인덱스는 내부적으로 정렬된 구조(B-tree)를 유지하지만, 데이터를 읽어오는 순서는 옵티마이저가 결정합니다.
- 옵티마이저는 인덱스를 항상 순차적으로 읽는 보장이 없고, 다른 실행 계획(Full Table Scan 등)으로 바꿀 수 있습니다.
2. “근데 인덱스를 타면 정렬돼서 나오던데요?”
맞습니다. 다음과 같은 조건에서는 우연히 정렬처럼 보일 수 있습니다.
- Index Range Scan이나 Index Full Scan을 사용
- 쿼리에서 필요한 컬럼이 모두 인덱스에 포함됨 (Covering Index)
- 실행 계획이 변하지 않고, 통계 정보나 데이터 양이 비슷한 경우
하지만 이건 어디까지나 지금 환경에서만 우연히 정렬된 것입니다.
- Posted
- Filed under DataBase/Oracle
Oracle SQL에서 WHERE 절에 조건을 걸 때, NULL 값이 포함된 컬럼은 왜 조회되지 않을까요? 특히 =나 LIKE 조건을 사용하면 NULL인 행이 결과에서 빠지는 이유와 이를 처리하는 방법을 정리했습니다.
1. NULL은 비교 연산에서 항상 FALSE 또는 UNKNOWN
SQL에서 NULL은 "값이 없음"을 뜻합니다.
그래서 다음 조건들은 모두 FALSE 또는 UNKNOWN으로 처리됩니다.
- 컬럼 = NULL → 항상 FALSE (실제로는 UNKNOWN)
- 컬럼 LIKE '%' → 컬럼이 NULL이면 결과는 UNKNOWN
- 컬럼 LIKE '%' → 컬럼이 NULL이면 결과는 UNKNOWN
따라서 WHERE 컬럼 = 'abc' 조건은 컬럼이 NULL인 행을 전혀 포함하지 않습니다.
2. NULL 값을 정확히 조회하려면 IS NULL 사용
NULL을 직접 조회할 때는 반드시 IS NULL 조건을 사용해야 합니다.
SELECT * FROM 테이블명 WHERE 컬럼 IS NULL;
컬럼 = NULL은 절대 쓰면 안 됩니다.
3. NULL 포함 조회 방법
예를 들어, 컬럼이 'abc'이거나 NULL인 행 모두 조회하려면:
3. NULL 포함 조회 방법
예를 들어, 컬럼이 'abc'이거나 NULL인 행 모두 조회하려면:
SELECT * FROM 테이블명 WHERE 컬럼 = 'abc' OR 컬럼 IS NULL;
마찬가지로, LIKE 조건과 NULL 포함 조회는 이렇게 씁니다:
SELECT * FROM 테이블명 WHERE 컬럼 LIKE '%패턴%' OR 컬럼 IS NULL;
4. NVL 함수를 활용한 NULL 처리
NVL 함수는 NULL 값을 다른 값으로 대체합니다. 예를 들어:
WHERE NVL(컬럼, '대체값') LIKE '%패턴%'
이때 주의할 점은 NVL(컬럼, '%') LIKE '%' 처럼 사용하면 NULL도 포함되지만, 조건 자체가 항상 참이 되어 버려 실질적인 필터링 의미가 없어집니다.
정리
- NULL은 비교 연산자(=, LIKE 등)에서 항상 제외된다.
- NULL을 조회하려면 IS NULL을 꼭 써야 한다.
- NULL 포함 조건은 OR 컬럼 IS NULL을 추가하거나 NVL로 처리 가능하나, 무조건 참이 되지 않도록 주의해야 한다.

