모던지 / SQL 개발자 / 실전 감각 5강. 마지막 점검

실전 감각 5강. 마지막 점검

시험 전날은 새로 배우는 날이 아니라 좁히는 날입니다. 여기 모은 것은 아는 사람이 틀리는 자리들뿐입니다.

풀고 시작

문제 1. SELECT 절에 붙인 별칭을 WHERE 절에서는 쓸 수 없는데 ORDER BY 절에서는 쓸 수 있는 이유는 무엇인가요?
논리적 처리 순서 하나로 설명됩니다. FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 순서를 외워 두면 이런 문항이 자동으로 풀립니다.

처리 순서 하나로 풀리는 것들

외울 것이 하나뿐이라면 이것을 고르시면 됩니다. FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. 작성 순서가 아니라 처리 순서입니다.

이 한 줄에서 파생되는 문항이 여럿입니다. WHERE에서 별칭을 못 쓰는 이유, ORDER BY에서는 쓸 수 있는 이유, WHERE에 집계 함수를 못 쓰는 이유, HAVING에는 쓸 수 있는 이유가 전부 여기서 나옵니다. 윈도우 함수를 WHERE에서 바로 쓰지 못하고 인라인 뷰로 감싸야 하는 이유도 같습니다. 윈도우 함수는 SELECT 시점에 계산되므로 WHERE가 볼 때는 아직 존재하지 않습니다.

한 가지 더 붙여 두시면 좋습니다. 거를 수 있으면 최대한 앞에서 거릅니다. 결과가 같더라도 WHERE로 미리 줄인 것과 HAVING으로 나중에 버린 것은 일하는 양이 다릅니다.

헷갈리는 짝을 한 줄씩

시험장에서 손이 멈추는 자리는 대개 아래의 짝입니다. 왼쪽을 보고 오른쪽이 나오는지 확인해 보십시오.

가르는 한 문장
WHERE · HAVING 앞은 묶기 전 행을, 뒤는 묶은 뒤 그룹을 거릅니다
RANK · DENSE_RANK 공동 순위 다음에 등수를 건너뛰면 RANK, 건너뛰지 않으면 DENSE_RANK입니다
ROW_NUMBER · RANK 값이 같아도 다른 번호를 주면 ROW_NUMBER입니다
UNION · UNION ALL 중복을 지우면 UNION, 그대로 쌓으면 UNION ALL입니다
ROLLUP · CUBE 오른쪽부터 지워 계층 소계를 만들면 ROLLUP, 모든 조합이면 CUBE입니다
DELETE · TRUNCATE · DROP 조건으로 골라 지우기, 전부 비우고 구조는 남기기, 구조까지 없애기
ON · WHERE (외부 조인) 앞은 짝을 찾을 때, 뒤는 NULL로 채워진 뒤에 적용됩니다
IN · NOT IN 앞은 OR로 이어 NULL에 강하고, 뒤는 AND로 이어 NULL에 무너집니다
ROWS · RANGE 앞은 물리적 행 개수, 뒤는 같은 정렬값을 한 덩어리로 봅니다
뷰 · 구체화된 뷰 앞은 질의만 저장하고 뒤는 결과를 저장합니다
식별 관계 · 비식별 관계 부모 키가 자식 키에 들어가면 식별입니다
부분 종속 · 이행 종속 복합키 일부에 매달리면 부분, 키가 아닌 속성에 매달리면 이행입니다

자주 놓치는 규칙 여덟 개

하나. BETWEEN은 양쪽 경계를 포함합니다. 한쪽만 포함해야 하면 부등호로 써야 합니다.

둘. 문자 위치는 일부터 시작합니다. 프로그래밍 언어의 영부터와 다릅니다.

셋. 정렬을 명시하지 않으면 순서는 보장되지 않습니다. 우연히 정렬되어 보여도 실행 계획이 바뀌면 달라집니다.

넷. 그룹으로 묶은 결과도 정렬되어 나오지 않습니다. 순서가 필요하면 ORDER BY를 적어야 합니다.

다섯. LAST_VALUE는 기본 프레임이 현재 행까지라 그냥 쓰면 현재 행의 값이 나옵니다. 파티션의 마지막 값을 얻으려면 프레임을 끝까지로 명시해야 합니다.

여섯. NATURAL JOIN과 USING에 쓰인 컬럼에는 테이블 별칭을 붙일 수 없습니다. 하나로 합쳐진 것으로 취급되기 때문입니다.

일곱. DDL은 실행과 함께 앞선 작업까지 확정하는 것이 일반적입니다. 그래서 TRUNCATE는 되돌릴 수 없습니다.

여덟. 기본값이 지정된 컬럼에 명시적으로 NULL을 넣으면 기본값이 아니라 NULL이 들어갑니다. 생략과 명시적 NULL은 다른 행위입니다.

문항을 읽는 습관

마지막으로 읽기입니다. 아는 내용인데 틀리는 가장 흔한 원인은 개념이 아니라 문장을 잘못 읽는 것입니다.

부정어에 표시를 남기십시오. 옳지 않은 것을 고르라는 문항에서 옳은 것을 고르는 실수는 실력과 무관하게 일어납니다. 손으로 동그라미 하나만 쳐 두면 검토할 때 다시 걸러집니다.

숫자가 나오면 그 숫자가 무엇을 세는 것인지 확인하십시오. 테이블의 행 수인지, 조인 결과의 행 수인지, 조건을 만족하는 행 수인지에 따라 답이 전부 달라집니다.

그리고 보기를 끝까지 읽으십시오. 첫 보기가 맞아 보여도 아래에 더 정확한 진술이 있는 경우가 있습니다. 가장 알맞은 것을 고르라는 문항은 맞는 보기가 여럿이고 그중 하나가 더 정확한 구조로 만들어집니다.

인출 문제

문제 1. SELECT 문의 논리적 처리 순서를 바르게 나열한 것은?
대상을 정하고 행을 거르고 묶고 그룹을 거른 뒤 무엇을 보여 줄지 고르고 마지막에 정렬합니다.
문제 2. 파티션의 마지막 값을 LAST_VALUE로 얻으려 할 때 필요한 조치는?
기본 프레임이 현재 행에서 끝나므로 명시하지 않으면 현재 행의 값이 나옵니다.
문제 3. 기본값이 지정된 컬럼에 명시적으로 NULL을 넣으면?
기본값은 컬럼을 생략했을 때만 적용됩니다. 생략과 명시적 NULL은 다른 행위입니다.
문제 4. 문자열에서 세 번째 글자부터 네 글자를 잘라 낼 때 시작 위치로 주어야 하는 값은?
SQL의 문자 위치는 일부터 시작하므로 세 번째 글자의 위치는 삼입니다.

더 풀기

출제기준의 세세항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. WHERE 절에 집계 함수를 쓸 수 없는 이유로 가장 알맞은 것은?
처리 순서로 설명됩니다. 집계 결과로 거르려면 HAVING을 써야 합니다.
문제 2. 윈도우 함수를 조건절에서 바로 쓸 수 없는 이유는?
순위로 걸러 내려면 인라인 뷰로 한 번 감싼 뒤 조건을 걸어야 합니다.
문제 3. 부서별 급여 상위 세 명을 뽑는 구조로 알맞은 것은?
순위를 먼저 만들고 그 결과를 대상으로 걸러야 합니다.
문제 4. 동점을 모두 포함해 상위 세 명을 뽑고 싶다면 알맞은 순위 함수는?
ROW_NUMBER는 동점 중 하나만 남깁니다. 동점을 함께 보려면 순위를 같게 매기는 함수를 써야 합니다.
문제 5. 정확히 세 행만 필요하고 동점은 임의로 잘라도 된다면 알맞은 함수는?
항상 서로 다른 번호를 매기므로 행 수를 정확히 통제할 수 있습니다.
문제 6. 오라클의 행 번호 의사 컬럼으로 상위 다섯 건을 얻는 조건으로 알맞은 것은?
이하 조건은 첫 행부터 차례로 통과합니다. 같음이나 초과 조건은 첫 행이 탈락하면서 결과가 비게 됩니다.
문제 7. 그 의사 컬럼에 세 번째 행이라는 조건을 직접 걸면?
번호는 결과에 담길 때마다 올라가므로 첫 행이 탈락하면 다음 행이 다시 일에 도전합니다. 영원히 삼이 되지 못합니다.
문제 8. 정렬된 결과의 상위를 얻으려면 그 의사 컬럼을 어떻게 써야 하나요?
번호는 정렬 전에 매겨지므로 정렬 결과의 상위와 다릅니다.
문제 9. 표준 SQL에서 앞의 몇 건을 건너뛰고 그다음부터 가져오는 절은?
OFFSET으로 건너뛸 행 수를, FETCH로 가져올 행 수를 지정합니다.
문제 10. 스무 건씩 보여 주는 목록의 다섯 번째 페이지를 얻으려면 몇 건을 건너뛰어야 하나요?
앞의 네 페이지 여든 건을 건너뛰고 그다음 스무 건을 가져옵니다.

묶음 2

문제 1. 페이지 나누기에서 정렬 기준 마지막에 유일한 컬럼을 추가하는 이유는?
순서가 결정적이어야 자르는 위치도 안정적입니다.
문제 2. 계층형 질의에서 WHERE 절의 조건은 언제 적용되나요?
그래서 중간 노드를 WHERE로 걸러도 그 아래 자식은 사라지지 않습니다.
문제 3. 특정 가지를 통째로 잘라 내려면 조건을 어디에 두어야 하나요?
따라가는 규칙 자체를 바꾸어야 가지가 잘립니다.
문제 4. 계층형 질의에서 형제 행들의 순서를 정하는 절은?
일반 정렬을 쓰면 계층 구조가 흐트러집니다.
문제 5. 최상위 사장 아래 부장이 있고 그 아래 과장이 있다면 과장의 계층 깊이 값은?
최상위가 일이고 한 단계 내려갈 때마다 하나씩 늘어납니다.
문제 6. NATURAL JOIN이 위험한 이유로 가장 알맞은 것은?
등록일 같은 흔한 이름이 양쪽에 생기는 순간 조건이 하나 더 붙습니다. 오류도 나지 않습니다.
문제 7. USING 절에 쓴 컬럼에 테이블 별칭을 붙이면?
하나로 합쳐진 것으로 취급되어 소속을 지정할 수 없습니다.
문제 8. UNION을 쓸 때 중복 제거 때문에 생기는 부작용으로 가장 알맞은 것은?
중복 판단은 선택한 컬럼 조합으로만 이루어집니다.
문제 9. 집합 연산자를 쓴 질의에서 ORDER BY는 어디에 쓸 수 있나요?
정렬은 합쳐진 최종 결과에 적용됩니다.
문제 10. 집합 연산의 결과에서 컬럼 이름은 어느 질의를 따르나요?
그래서 별칭은 첫 질의에 붙여야 의미가 있습니다.

묶음 3

문제 1. 소계 행의 NULL과 원래 데이터의 NULL을 구분하려면?
소계 행이면 일을, 원래 데이터의 NULL이면 영을 돌려줍니다.
문제 2. 뷰가 성능을 개선해 준다는 말이 오해인 이유는?
결과를 저장하려면 구체화된 뷰 같은 별도의 기능이 필요합니다.
문제 3. 특정 부서만 보이는 뷰에 다른 부서 행을 넣었더니 입력은 되는데 뷰에서 보이지 않습니다. 원인은?
뷰는 조회 조건일 뿐 입력을 막지 않습니다. 막으려면 옵션을 명시해야 합니다.
문제 4. TRUNCATE를 되돌릴 수 없는 이유로 가장 알맞은 것은?
DDL은 앞선 작업까지 함께 확정하는 것이 일반적입니다.
문제 5. UPDATE 문에서 WHERE 절을 빠뜨리면?
조건이 없으면 전체가 대상입니다. 실행 전에 같은 조건으로 조회해 확인하는 습관이 필요합니다.
문제 6. 교착 상태를 줄이는 실무 습관으로 가장 알맞은 것은?
순서가 뒤바뀌면 서로 마주 보며 기다리게 됩니다.
문제 7. 조건절에서 컬럼에 함수를 씌우면 흔히 생기는 문제는?
인덱스는 원래 값으로 정렬되어 있어 값을 변형하면 그 순서를 쓸 수 없습니다.
문제 8. 정렬 순서와 같은 인덱스가 있으면 상위 몇 건을 빠르게 얻을 수 있는 이유는?
인덱스는 이미 정렬된 구조라 앞에서 몇 건만 읽으면 끝납니다.
문제 9. 조건에 상수 대신 바인드 변수를 쓰는 이점으로 가장 알맞은 것은?
값만 다른 문장을 매번 새로 해석하면 비용이 크고 보안에도 취약합니다.
문제 10. 다음 중 옳지 않은 설명은?
정렬은 보장되지 않습니다. 정렬된 것처럼 보여도 실행 방식이 바뀌면 달라집니다.

이전: 4강 행이 부풀어 오르는 자리 · 서가로: SQL 개발자 서가

모던지 · 궁금하면 모던지 GitHub · 2026-09-10