정보처리기사 필기
시험 직전 요약장
판단 기준과 헷갈리는 개념, 대표 예제를 짧게 확인하세요.
SELECT 처리 순서·조건·NULL·집계·정렬
원래 이론 →판단 기준
WHERE는 FROM과 JOIN이 만든 각 행에 검색 조건을 적용한다. 조건 결과가 TRUE인 행만 다음 단계로 전달되고, FALSE와 UNKNOWN인 행은 제외된다.
| 조건 종류 | 대표 구문 | 의미 | 주의점 |
|---|---|---|---|
| 비교 | =, <>, <, <=, >, >= | 두 값을 비교 | NULL과 일반 비교하면 UNKNOWN |
| 범위 | BETWEEN a AND b | a 이상 b 이하 | 양 끝값을 모두 포함 |
| 목록 | IN (값1, 값2, ...) | 목록 중 하나와 일치 | NULL이 섞인 부정 조건에 주의 |
| 패턴 | LIKE | 문자열 패턴과 일치 | %는 0자 이상, _는 정확히 1자 |
| NULL 검사 | IS NULL, IS NOT NULL | 값의 부재 여부를 검사 | = NULL을 사용하지 않음 |
| 논리 결합 | NOT, AND, OR | 조건을 부정·결합 | 괄호로 업무 의도를 명시 |
헷갈리는 개념
| 구분 | 필터 대상 | 처리 시점 | 집계 함수 조건 |
|---|---|---|---|
WHERE | 원본의 개별 행 | 그룹화 전 | 같은 질의 블록에서 직접 사용하지 않음 |
HAVING | GROUP BY가 만든 그룹 | 그룹화·집계 후 | COUNT(*), AVG(salary) 등 사용 가능 |
SELECT department,
COUNT(*) AS employee_count
FROM employee
WHERE status = 'ACTIVE'
GROUP BY department
HAVING COUNT(*) >= 2;
WHERE status = 'ACTIVE'는 재직 중인 행만 그룹화 대상으로 남긴다. HAVING COUNT(*) >= 2는 그 결과로 만들어진 그룹 중 인원이 2명 이상인 부서만 남긴다. HAVING이 있으면 GROUP BY가 없더라도 선택된 전체 행을 하나의 그룹으로 취급하는 그룹 질의가 될 수 있다. 그러나 행 조건을 대신하는 절로 남용하면 의미가 흐려진다.
대표 계산·예제
ROLLUP(a,b,c)가 만드는 집합은 (a,b,c), (a,b), (a), ()다. 앞에서부터의 계층만 만들기 때문에 (b,c) 소계는 없다. CUBE(a,b,c)는 이 집합뿐 아니라 (a,c), (b,c), (b), (c)도 포함하여 8개의 그룹 기준 집합을 만든다. GROUPING SETS는 명시한 집합만 만들며, ()를 적지 않았다면 총계가 자동으로 추가되는 것은 아니다.
아래 매출에서 ROLLUP(지역,상품)을 계산한다고 하자.
| 지역 | 상품 | 금액 |
|---|---|---|
| 동부 | A | 20 |
| 동부 | B | 30 |
| 서부 | A | 40 |
지역·상품 집계 3행, 지역별 소계 2행, 전체 총계 1행으로 결과는 6행이다. 소계는 동부 50·서부 40, 총계는 90이다. 그룹 기준 집합 3개와 출력 행 6개는 다른 수다. 결과 순서는 ORDER BY 없이는 보장하지 않는다.
집계에서 생략한 열은 NULL로 표시될 수 있다. 원본 값 자체가 NULL인 그룹과 구별하려면 GROUPING(열)을 사용한다. 그 열이 집계 기준에서 생략된 행은 1, 실제 그룹 키로 참여한 행은 값이 NULL이어도 0이다. SQLite는 이러한 그룹 확장 구문을 직접 지원하지 않으므로, 이 개념을 SQLite의 실행 결과라고 혼동하지 않는다.
ROLLUP과 CUBE의 그룹 집합
ROLLUP(A,B)는 (A,B), (A), ()이고 CUBE(A,B)는 여기에 (B)를 더한다. ()는 전체 합계다. 한 그룹 집합에서도 실제 키 값 수에 따라 여러 결과 행이 나온다. GROUPING은 집계 NULL과 실제 NULL을 구분한다.
내 최근 연습 오답
현재 브라우저의 연습 채점 기록에서 공개된 단원과 연결된 오답을 확인합니다.
오답 기록을 확인하고 있습니다.