안녕하세요, 10년 차 블로거 김승진입니다. 정보처리기사 실기 시험을 준비할 때 가장 골치 아픈 과목 중 하나가 바로 SQL 응용이더라고요. 프로그래밍 언어와 더불어 합격의 당락을 결정하는 핵심 과목인데, 많은 분들이 단순 암기식으로 접근했다가 실제 시험장에서 살짝만 꼬아 낸 문제를 보고 당황하곤 합니다. 저 역시 예전에 데이터베이스 정규화나 복잡한 서브쿼리 문제를 마주했을 때 괄호 하나 잘못 적어서 아깝게 부분 점수도 못 받았던 씁쓸한 실패담이 있거든요. 그래서 오늘은 시험에 진짜 자주 나오는 핵심 SQL 구문들을 정확하게 정리해 드리고, 헷갈리기 쉬운 개념들을 명확하게 비교해 드리려고 합니다. 꼼꼼하게 읽어보시면 실전에서 큰 도움이 될 것입니다.
목차
1. DDL, DML, DCL 핵심 명령어 구조 비교
정보처리기사 실기 시험에서는 SQL의 카테고리를 분류하거나 각 명령어의 특성을 정확히 알고 있는지 묻는 문제가 매회 출제되더라고요. 특히 DDL(데이터 정의어), DML(데이터 조작어), DCL(데이터 제어어)의 차이점을 명확히 인지하지 못하면 괄호 채우기 문제에서 엉뚱한 답을 적기 십상입니다. 트랜잭션의 제어와 관련된 TCL까지 포함해서 표로 깔끔하게 정리해 드리겠습니다.
| 분류 | 대상 | 주요 명령어 | 자동 반영(Commit) 여부 및 특징 |
|---|---|---|---|
| DDL (정의어) | 스키마, 도메인, 테이블, 뷰, 인덱스 | CREATE, ALTER, DROP | 실행 즉시 데이터베이스에 반영되며 롤백이 불가능함 |
| DML (조작어) | 테이블 내의 실제 레코드(튜플) | SELECT, INSERT, UPDATE, DELETE | 트랜잭션 제어가 가능하며, Commit을 해야 영구 저장됨 |
| DCL (제어어) | 데이터 무결성, 보안, 권한 제어 | GRANT, REVOKE | 사용자에게 권한을 부여하거나 회수할 때 사용함 |
| TCL (트랜잭션 제어) | 트랜잭션의 작업 단위 제어 | COMMIT, ROLLBACK, SAVEPOINT | DML 작업의 최종 반영 및 취소를 결정함 |
테이블 구조 자체를 건드리는 DDL은 실행하는 순간 바로 데이터베이스 구조가 바뀌어 버리기 때문에 롤백이 안 된다는 특징이 있습니다. 반면 우리가 흔히 다루는 DML은 메모리 상에서 작업이 이루어지다가 최종적으로 COMMIT 명령을 내려야 하거든요. 실기 시험 서술형이나 단답형에서 이 개념을 혼동해서 오답을 내는 경우가 정말 많으니 반드시 머릿속에 넣어두셔야 합니다.
2. 시험에 무조건 나오는 SELECT 핵심 구문 분석
단순히 테이블 전체를 조회하는 SELECT 구문은 시험에 나오지 않습니다. 실기 시험에서는 집계 함수와 GROUP BY, 그리고 HAVING 절을 조합하여 조건에 맞는 데이터를 걸러내는 형태가 단골로 출제되더라고요. 아래의 핵심 패턴들을 눈여겨보셔야 합니다.
첫째로 그룹화 구문인 GROUP BY와 HAVING의 관계입니다. WHERE 절은 그룹화하기 전에 개별 행에 필터링을 거는 것이고, HAVING 절은 그룹화가 완료된 결과 집합에 필터링을 거는 것이거든요. 이 순서를 바꾸어 쓰거나 집계 함수를 WHERE 절에 넣는 실수를 범해서는 안 됩니다.
FROM 사원
WHERE 직급 = ‘대리’
GROUP BY 부서
HAVING AVG(급여) >= 3000000;
위 쿼리는 사원 테이블에서 직급이 대리인 사람들을 먼저 필터링한 후에, 부서별로 그룹을 묶고, 그 중 평균 급여가 300만 원 이상인 부서만 출력하는 쿼리입니다. 시험 문제에서는 특정 출력 결과를 보여주고 빈칸에 들어갈 쿼리를 작성하라고 하거나, 쿼리를 실행했을 때 나올 결과 테이블의 행 수를 적으라고 요구하곤 합니다.
둘째로 중복 제거인 DISTINCT와 정렬인 ORDER BY의 조합입니다. 기본적으로 정렬은 오름차순(ASC)이 기본값이지만, 내림차순(DESC)을 사용할 때는 명시적으로 적어주어야 합니다. 특히 정렬 기준이 여러 개일 때 콤마로 구분하여 첫 번째 기준이 같을 때 두 번째 기준으로 정렬되도록 하는 패턴이 자주 나옵니다.
3. 합격을 가르는 서브쿼리와 조인(JOIN) 완벽 정복
많은 수험생들이 가장 어려워하는 부분이 바로 서브쿼리(Subquery)와 조인(Join)입니다. 두 개 이상의 테이블을 연결하여 조건에 맞는 데이터를 뽑아내야 하기 때문에 머릿속으로 테이블을 직접 그려가며 풀어야 하거든요. 기출문제 유형을 보면 IN 연산자를 활용한 중첩 서브쿼리가 굉장히 자주 출제됩니다.
WHERE 학번 IN (SELECT 학번 FROM 수강 WHERE 과목명 = ‘데이터베이스’);
이 쿼리는 수강 테이블에서 과목명이 데이터베이스인 학번들을 먼저 추출한 뒤, 그 학번에 해당하는 학생의 이름을 학생 테이블에서 찾아 출력하는 구조입니다. 괄호 안의 서브쿼리가 먼저 실행되어 결과 리스트를 반환하고, 외부 쿼리가 이를 받아서 처리한다는 흐름을 이해하는 것이 핵심이더라고요.
또한 조인의 경우 INNER JOIN과 OUTER JOIN의 결과 차이를 묻는 문제가 단골입니다. INNER JOIN은 양쪽 테이블에 모두 매칭되는 데이터만 가져오지만, LEFT OUTER JOIN은 왼쪽 테이블의 모든 데이터를 가져오고 오른쪽 테이블에 매칭되는 데이터가 없으면 NULL로 채우게 됩니다. 이 차이를 몰라서 결과 테이블의 행 수를 잘못 계산하는 실수를 많이들 하십니다.
4. 직접 겪은 SQL 작성 실패담과 실전 꿀팁
제가 과거에 정보처리기사 시험을 볼 때 겪었던 뼈아픈 실패담을 하나 말씀드릴게요. 당시 데이터 삭제 문제를 만났는데, 아무 생각 없이 테이블의 모든 행을 삭제하라는 쿼리를 작성하라는 지문에 DELETE FROM 테이블명이라고 적어야 할 것을 UPDATE 문이랑 헷갈려서 DELETE FROM 테이블명이라고 적어버렸습니다. 와일드카드()를 DML 전반에 남발하다가 생긴 습관성 실수였는데, 결국 그 문제 하나 때문에 과락 점수를 간신히 넘겼던 아찔한 기억이 있거든요.
여러분들은 이런 사소한 문법 실수를 절대 하시면 안 됩니다. 특히 DELETE 구문에서는 열 이름을 명시하지 않으며, 특정 행만 지우고 싶다면 반드시 WHERE 절을 붙여야 한다는 점을 기억해 두셔야 합니다. 아래의 꿀팁 박스와 주의 박스를 통해 시험 전에 반드시 점검해야 할 포인트들을 확인해 보세요.
김승진 블로거의 SQL 실전 꿀팁
- COUNT() 함수는 테이블의 전체 행 수를 세지만, COUNT(열이름)은 해당 열에서 NULL 값을 제외한 행 수만 센다는 점을 꼭 기억하세요.
- LIKE 연산자에서 %는 글자 수 제한 없는 와일드카드이고, _(언더바)는 딱 한 글자만 매칭한다는 차이점을 명확히 구분해야 합니다.
- 문자열 상수를 비교할 때는 문제에서 제시된 따옴표 형식(보통 작은따옴표)을 명확하게 지켜서 작성해야 감점을 피할 수 있습니다.
시험장 실수 방지 주의사항
- DELETE 문에는 테이블명 앞에 별표()를 쓰지 않습니다. DELETE FROM 테이블명이 올바른 문법입니다.
- DROP과 TRUNCATE는 DDL이라서 롤백이 안 되지만, DELETE는 DML이라서 트랜잭션 제어(Rollback)가 가능합니다. 명령어 성격을 혼동하지 마세요.
- 서브쿼리를 작성할 때는 반드시 시작 괄호와 끝 괄호의 짝이 맞는지 마지막에 꼭 검토하고 답안지를 제출하셔야 합니다.
5. 자주 묻는 질문 (FAQ)
Q. SQL 소문자로 써도 감점 요인이 안 되나요?
A. 표준 SQL 문법상 예약어와 객체 이름은 대소문자를 구분하지 않기 때문에 감점되지는 않습니다. 다만 가독성을 위해 예약어는 대문자로, 테이블이나 열 이름은 소문자로 일관되게 작성하시는 것을 권장합니다.
Q. NULL이 포함된 연산 결과는 어떻게 처리해야 하나요?
A. SQL에서 NULL과의 모든 산술 연산 결과는 무조건 NULL이 됩니다. 다만 SUM이나 AVG 같은 집계 함수는 기본적으로 NULL 값을 무시하고 계산을 수행하더라고요.
Q. WHERE 절과 HAVING 절의 차이점을 쉽게 설명해 주세요.
A. WHERE 절은 그룹화하기 전에 테이블의 개별 행에 대해 필터링 조건을 거는 것이고, HAVING 절은 GROUP BY에 의해 그룹화가 완료된 그룹 결과에 대해 필터링 조건을 거는 것입니다.
Q. 기출문제에서 서브쿼리 문항을 풀 때 팁이 있을까요?
A. 항상 괄호 안에 있는 안쪽 쿼리(서브쿼리)를 먼저 실행해 보고, 그 결과로 나오는 데이터 세트나 단일 값을 적어둔 뒤에 바깥쪽 메인 쿼리를 대입해서 풀어나가면 실수를 크게 줄일 수 있습니다.
Q. 시험에 나오는 JOIN 구문은 어떤 형식을 따라야 하나요?
A. ANSI 표준 방식인 ‘FROM 테이블A JOIN 테이블B ON 조건’ 방식과 기존 Oracle 등에서 쓰이던 ‘FROM 테이블A, 테이블B WHERE 조건’ 방식 둘 다 정답 처리되지만, 명확성을 위해 ANSI 표준 방식을 권장합니다.
Q. 세미콜론(;)을 끝에 안 붙이면 감점되나요?
A. 정보처리기사 채점 기준상 세미콜론 누락으로 오답 처리를 하지는 않는 것이 일반적입니다. 하지만 시험지 지문에서 지시사항으로 세미콜론을 필수로 요구하는 경우가 있을 수 있으니 문제 지문을 꼼꼼히 읽어보셔야 합니다.
Q. DROP과 TRUNCATE, DELETE의 차이는 무엇인가요?
A. DROP은 테이블 자체를 완전히 없애버리는 것이고, TRUNCATE는 테이블 구조는 남겨두고 데이터만 빠르게 전체 삭제하는 것이며, DELETE는 조건에 맞춰 행 단위로 선택 삭제가 가능하며 롤백이 가능합니다.
Q. 기출 SQL 문제 비중이 얼마나 되나요?
A. 최근 출제 경향을 보면 SQL 응용 및 데이터 입출력 구현 파트가 전체 문항 중 약 15%에서 20% 내외의 비중을 차지하더라고요. 프로그래밍 언어와 합치면 합격의 키를 쥐고 있는 핵심 영역입니다.
지금까지 정보처리기사 실기 시험에 자주 나오는 SQL 구문들과 헷갈리기 쉬운 개념들을 확실하게 짚어보았습니다. 데이터베이스 과목은 한 번 확실하게 원리를 이해해 두면 시험장에서도 꼬아 낸 문제를 쉽게 풀어낼 수 있거든요. 남은 기간 동안 눈으로만 공부하지 마시고, 연습장에 직접 쿼리문을 적어보는 연습을 많이 해보시길 바랍니다. 수험생 여러분의 합격을 진심으로 응원합니다.
면책조항: 본 포스팅에 수록된 정보는 기출 데이터 분석 및 개인적인 학습 경험을 바탕으로 작성되었으며, 출제 기관의 공식 채점 기준 및 변경사항에 따라 실제 채점 결과와 다를 수 있으므로 참고용 자료로만 활용하시기 바랍니다.