SQL 개발자 (SQLD) SQL 기본 핵심정리
26년 11월 1일 검사 완료
SQL 기본, 핵심정리
- SELECT 문 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 입니다.
- NULL 은 = 로 비교할 수 없고 IS NULL 로 찾습니다. NOT IN 목록에 NULL 이 있으면 결과가 나오지 않습니다.
- COUNT(*)는 모든 행, COUNT(컬럼)은 그 컬럼이 NULL 이 아닌 행만 셉니다.
- NVL·COALESCE·NULLIF·CASE 의 결과를 손으로 따라갈 수 있어야 합니다.
- LEFT OUTER JOIN 은 왼쪽 표의 행을 모두 남기고, 짝이 없으면 오른쪽 컬럼을 NULL 로 채웁니다.
- CROSS JOIN 결과 행 수는 두 표의 행 수를 곱한 값입니다.
- 중요도
- ★★★★★ (5 / 5)
- 출제 비중
- SQL 기본 및 활용 40문항 중 약 16문항 (40%)
관계형 데이터베이스 개요, SELECT 문, 문자·숫자·날짜·변환·NULL 관련 함수, WHERE 절, GROUP BY·HAVING, ORDER BY, 조인과 표준 조인(INNER·OUTER·NATURAL·CROSS)을 다룹니다.
📖 SQL 기본 개념 정리 더보기 →SQL 기본 대표 문제 10개
문제 1. SELECT 문을 실행할 때 가장 먼저 처리되는 절은?
- ① ORDER BY
- ② FROM
- ③ SELECT
- ④ WHERE
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② FROM
핵심: 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT 문은 적힌 순서와 실행 순서가 다릅니다.
- FROM: 어느 테이블에서 가져올지
- WHERE: 행 걸러 내기
- GROUP BY: 묶기
- HAVING: 묶은 결과 걸러 내기
- SELECT: 보여 줄 컬럼 고르기
- ORDER BY: 정렬
가장 먼저 처리되는 것은 FROM 입니다.
틀린 선지
- ORDER BY: 가장 마지막에 처리됩니다.
- SELECT: 맨 앞에 적지만 실행은 다섯 번째입니다.
- WHERE: FROM 으로 테이블을 정한 다음에 처리됩니다.
문제 2. GROUP BY 로 묶은 결과에 'SUM(SAL) > 1000' 처럼 집계 함수를 이용한 조건을 걸 때 쓰는 절은?
- ① ORDER BY
- ② WHERE
- ③ HAVING
- ④ GROUP BY
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ HAVING
핵심: WHERE = 행 조건(집계 함수 불가), HAVING = 그룹 조건
WHERE 는 묶기 전에 행 하나하나를 걸러 내므로 집계 함수를 쓸 수 없습니다. 묶은 다음 그룹 단위로 조건을 거는 절이 HAVING 입니다.
예: `SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL) > 1000;`
틀린 선지
- ORDER BY: 정렬하는 절입니다.
- WHERE: GROUP BY 보다 먼저 처리되어 집계 함수 조건을 쓸 수 없습니다.
- GROUP BY: 묶을 기준 컬럼을 정하는 절이지, 조건을 거는 절이 아닙니다.
문제 3. EMP 테이블에서 COMM(상여) 값이 비어 있는(NULL) 사원을 찾는 조건으로 옳은 것은?
- ① WHERE COMM = NULL
- ② WHERE COMM = 0
- ③ WHERE COMM IN (NULL)
- ④ WHERE COMM IS NULL
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ WHERE COMM IS NULL
핵심: NULL 은 = 로 비교 불가, IS NULL / IS NOT NULL 사용
NULL 과 = 로 비교하면 결과가 '알 수 없음'이 되어 어떤 행도 나오지 않습니다. NULL 인 행은 반드시 IS NULL 로 찾고, NULL 이 아닌 행은 IS NOT NULL 로 찾습니다.
틀린 선지
- WHERE COMM = NULL: 오류는 나지 않지만 비교 결과가 '알 수 없음'이라 아무 행도 나오지 않습니다.
- WHERE COMM = 0: 0 은 NULL 이 아닌 실제 값입니다. 상여가 0 인 사원만 나옵니다.
- WHERE COMM IN (NULL): COMM = NULL 과 같은 뜻이라 아무 행도 나오지 않습니다.
문제 4. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 다음 SQL 의 결과는? SELECT COUNT(COMM) FROM EMP;
- ① 2
- ② 3
- ③ 4
- ④ 5
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 3
핵심: COUNT(컬럼)은 NULL 이 아닌 행만 셈. 0 은 NULL 이 아님
COUNT(컬럼)은 그 컬럼이 NULL 이 아닌 행만 셉니다.
- COMM 값: NULL, 50, 0, NULL, 100
- NULL 이 아닌 값: 50, 0, 100 → 3개
0 은 '없음'이 아니라 실제 값이므로 셉니다.
틀린 선지
- 2: 0 을 NULL 처럼 빼고 센 값입니다. 0 은 NULL 이 아니므로 셉니다.
- 4: 어떤 경우에도 나오지 않는 값입니다. NULL 이 2개이므로 5 − 2 = 3 입니다.
- 5: COUNT(*) 처럼 모든 행을 센 값입니다.
문제 5. 사원 김철수의 SAL 은 300, COMM 은 NULL 이다. Oracle 에서 SAL + NVL(COMM, 0) 의 결과는?
- ① NULL
- ② 300
- ③ 301
- ④ 0
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 300
핵심: NVL(값, 대체값): 값이 NULL 이면 대체값으로 바꿈
NVL(COMM, 0) 은 COMM 이 NULL 이면 0 으로 바꿉니다.
- NVL(NULL, 0) = 0
- 300 + 0 = 300
NVL 없이 SAL + COMM 이라면 NULL 이 됩니다.
틀린 선지
- NULL: NVL 을 쓰지 않고 SAL + COMM 을 했을 때의 결과입니다.
- 301: NULL 을 1 로 바꾼 것처럼 계산한 값입니다.
- 0: NVL 이 바꾼 COMM 값만 본 것입니다. SAL 300 을 더해야 합니다.
문제 6. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 [DEPT 테이블] DEPTNO | DNAME 10 | 총무 20 | 영업 30 | 개발 40 | 연구 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT E.ENAME, D.DNAME FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
- ① 3
- ② 4
- ③ 5
- ④ 6
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 4
핵심: INNER JOIN 은 양쪽에 짝이 있는 행만. NULL 은 짝이 없음
INNER JOIN 은 조건 E.DEPTNO = D.DEPTNO 가 참인 짝만 남깁니다.
- 김철수(10)·박민수(10) → 총무, 이영희(20) → 영업, 최지은(30) → 개발: 4행
- 정우성(NULL): NULL 은 어떤 값과도 같지 않아 빠짐
- DEPT 의 40(연구): 짝이 되는 사원이 없어 빠짐
결과 4행
틀린 선지
- 3: 부서 10 의 두 사원 중 한 명만 센 값입니다. 둘 다 총무와 짝이 됩니다.
- 5: 정우성까지 넣은 값으로, EMP 를 기준으로 한 LEFT OUTER JOIN 의 결과입니다.
- 6: 정우성과 연구 부서를 모두 넣은 FULL OUTER JOIN 의 결과입니다.
문제 7. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 [DEPT 테이블] DEPTNO | DNAME 10 | 총무 20 | 영업 30 | 개발 40 | 연구 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT E.ENAME, D.DNAME FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
- ① 4
- ② 5
- ③ 6
- ④ 20
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 5
핵심: LEFT OUTER JOIN = 왼쪽 표의 모든 행 + 짝 없으면 오른쪽은 NULL
LEFT OUTER JOIN 은 왼쪽 테이블(EMP)의 행을 모두 남깁니다.
- 짝이 있는 사원 4명(김철수·박민수·이영희·최지은) → 4행
- 짝이 없는 정우성(NULL) → DNAME 을 NULL 로 채워 1행
- DEPT 의 40(연구)은 오른쪽 테이블이라 짝이 없으면 나오지 않음
결과 4 + 1 = 5행
틀린 선지
- 4: INNER JOIN 의 결과입니다. LEFT OUTER JOIN 은 짝 없는 정우성도 남깁니다.
- 6: 연구 부서까지 넣은 FULL OUTER JOIN 의 결과입니다.
- 20: 모든 조합을 만드는 CROSS JOIN(5 × 4)의 결과입니다.
문제 8. 부서별 평균 급여가 300 이상인 부서의 번호와 평균 급여를 구하는 SQL 로 옳은 것은?
- ① SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) >= 300 GROUP BY DEPTNO;
- ② SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) >= 300 ORDER BY DEPTNO;
- ③ SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 300;
- ④ SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO WHERE AVG(SAL) >= 300;
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 300;
핵심: 그룹별 집계 조건은 GROUP BY 뒤 HAVING 에
부서별로 묶은 뒤(GROUP BY DEPTNO) 그룹의 평균에 조건을 걸어야 하므로 HAVING AVG(SAL) >= 300 을 씁니다. 집계 함수 조건은 WHERE 에 쓸 수 없습니다.
틀린 선지
- SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) >= 300 GROUP BY DEPTNO;: WHERE 절에는 집계 함수를 쓸 수 없어 오류가 납니다.
- SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) >= 300 ORDER BY DEPTNO;: 부서별로 묶지 않았는데 SELECT 에 DEPTNO 를 써서 오류가 납니다.
- SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO WHERE AVG(SAL) >= 300;: WHERE 는 GROUP BY 앞에 와야 하고, 집계 함수도 쓸 수 없어 오류가 납니다.
문제 9. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL) >= 300;
- ① 1
- ② 2
- ③ 3
- ④ 4
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 2
핵심: GROUP BY 에서 NULL 끼리도 하나의 그룹이 됨
- DEPTNO 별로 묶기: 10(300 + 400 = 700), 20(250), 30(200), NULL(350)
- GROUP BY 는 NULL 값도 하나의 그룹으로 묶습니다
- SUM(SAL) >= 300 인 그룹: 10(700), NULL(350) → 2행
틀린 선지
- 1: DEPTNO 가 NULL 인 그룹을 빼고 센 값입니다. NULL 도 한 그룹이 되어 350 으로 조건을 만족합니다.
- 3: 20(250)이나 30(200)을 포함한 값입니다. 둘 다 300 미만입니다.
- 4: HAVING 조건을 적용하지 않은 전체 그룹 수입니다.
문제 10. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 다음 SQL 의 결과는? SELECT COUNT(DISTINCT DEPTNO) FROM EMP;
- ① 2
- ② 3
- ③ 4
- ④ 5
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 3
핵심: COUNT(DISTINCT 컬럼)은 NULL 을 뺀 서로 다른 값의 개수
- DEPTNO 값: 10, 20, 10, 30, NULL
- 중복을 없애면: 10, 20, 30, NULL
- COUNT 는 NULL 을 세지 않으므로 10, 20, 30 → 3
틀린 선지
- 2: 서로 다른 값 10, 20, 30 세 개를 빠뜨린 값입니다.
- 4: NULL 까지 하나의 값으로 센 값입니다. COUNT 는 NULL 을 세지 않습니다.
- 5: 중복을 없애지 않고 모든 행을 센 값입니다.
직접 풀어서 확인해 보세요.
AI 작성 · 운영진 검수 전