SQL 개발자 (SQLD) SQL 기본 개념 정리
중요도 ★★★★★ · 40% (추정)
개요
이 단원은 SQL 로 데이터를 꺼내 보는 기본기를 배웁니다. 관계형 데이터베이스의 구조를 먼저 익히고, SELECT 문의 각 절(FROM·WHERE·GROUP BY·HAVING·ORDER BY)과 여러 함수, 두 테이블을 잇는 조인을 차례로 공부합니다.
SELECT 문은 적힌 순서와 달리 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 순서로 처리됩니다. WHERE 는 묶기 전에 행을 거르므로 집계 함수를 쓸 수 없고, 묶은 결과에 조건을 걸 때는 HAVING 을 씁니다. GROUP BY 를 쓰면 SELECT 절에는 GROUP BY 에 적은 컬럼과 집계 함수만 올 수 있습니다.
NULL 은 = 로 비교할 수 없어 IS NULL 로 찾고, NOT IN 목록에 NULL 이 있으면 결과가 하나도 나오지 않습니다. COUNT(*) 는 모든 행을, COUNT(컬럼) 은 NULL 이 아닌 행만 셉니다. NVL·COALESCE·NULLIF·CASE·DECODE 같은 함수는 결과를 손으로 따라갈 수 있어야 하며, Oracle 은 빈 문자열을 NULL 로 다루고 정렬할 때 NULL 을 가장 큰 값으로 본다는 점도 자주 나옵니다.
조인은 두 테이블의 행을 짝지어 하나로 보여 줍니다. INNER JOIN 은 짝이 있는 행만, LEFT OUTER JOIN 은 왼쪽 테이블의 행을 모두 남기고, FULL OUTER JOIN 은 양쪽 행을 모두 남깁니다. CROSS JOIN 은 모든 조합을 만들어 행 수가 두 테이블 행 수의 곱이 되고, NATURAL JOIN 과 USING 은 이름이 같은 컬럼으로 조인합니다.
핵심 개념
SELECT 문 처리 순서
FROM(테이블 정하기) → WHERE(행 거르기) → GROUP BY(묶기) → HAVING(그룹 거르기) → SELECT(컬럼 고르기) → ORDER BY(정렬) 순서로 처리됩니다.
외우는 요령SELECT 절에서 만든 별칭은 ORDER BY 에서만 쓸 수 있는 이유가 이 순서 때문입니다.
WHERE 와 HAVING
WHERE 는 묶기 전에 행 하나하나에 조건을 걸고, HAVING 은 GROUP BY 로 묶은 그룹에 조건을 겁니다. 집계 함수(SUM·AVG·COUNT 등) 조건은 HAVING 에만 쓸 수 있습니다.
외우는 요령'행은 WHERE, 그룹은 HAVING'.
COUNT 와 NULL
COUNT(*) 는 NULL 이 있는 행까지 모든 행을 세고, COUNT(컬럼) 은 그 컬럼이 NULL 이 아닌 행만 셉니다. COUNT(DISTINCT 컬럼) 은 NULL 을 뺀 서로 다른 값의 개수입니다. 0 은 NULL 이 아니므로 셉니다.
외우는 요령셀 행이 하나도 없어도 COUNT 는 NULL 이 아니라 0 을 돌려줍니다.
NULL 관련 함수
NVL(a, b) 는 a 가 NULL 이면 b, COALESCE(a, b, …) 는 처음으로 NULL 이 아닌 값, NULLIF(a, b) 는 a 와 b 가 같으면 NULL 이고 다르면 a 를 돌려줍니다. CASE 에서 ELSE 를 생략하면 맞는 조건이 없을 때 NULL 이 됩니다.
외우는 요령NULLIF 는 '같으면 NULL'로 외우세요.
Oracle 의 NULL 특성
Oracle 은 빈 문자열 '' 을 NULL 로 다루고, 문자 연결 || 에서는 NULL 을 빈 문자열처럼 무시합니다. 정렬할 때는 NULL 을 가장 큰 값으로 보아 오름차순에서 맨 뒤에 둡니다.
외우는 요령SQL Server 는 오름차순에서 NULL 이 맨 앞이라는 차이를 함께 기억하세요.
OUTER JOIN
LEFT OUTER JOIN 은 왼쪽 테이블의 행을 모두 남기고 짝이 없으면 오른쪽 컬럼을 NULL 로 채웁니다. RIGHT 는 그 반대, FULL OUTER JOIN 은 양쪽의 짝 없는 행을 모두 남깁니다.
외우는 요령FULL 결과 행 수 = INNER 결과 + 왼쪽 짝 없는 행 + 오른쪽 짝 없는 행.
CROSS·NATURAL·USING
CROSS JOIN 은 조건 없이 모든 조합(행 수의 곱)을 만듭니다. NATURAL JOIN 은 이름이 같은 모든 컬럼으로, USING (컬럼) 은 지정한 같은 이름 컬럼으로 조인하며, Oracle 에서는 이 조인 컬럼 앞에 테이블 별칭을 붙이면 오류가 납니다.
외우는 요령NATURAL·USING 조인 컬럼에는 별칭을 붙이지 않습니다.
자주 나오는 포인트
- 표를 주고 GROUP BY·HAVING·COUNT 결과 행 수나 값을 묻는 문제가 가장 많습니다.
- GROUP BY 에서는 NULL 끼리도 하나의 그룹이 된다는 점을 놓치기 쉽습니다.
- NOT IN 목록에 NULL 이 있으면 결과가 0행이 됩니다.
- AND 가 OR 보다 먼저 계산되는 연산자 우선순위 문제가 나옵니다.
- INNER·LEFT·FULL OUTER·CROSS JOIN 의 결과 행 수를 세는 연습을 하세요.
- SUBSTR·ROUND·CEIL·FLOOR·LTRIM 같은 함수 결과를 손으로 계산할 수 있어야 합니다.
헷갈리는 것 비교: 조인 종류별 결과
| 조인 | 남는 행 | 행 수 계산 |
|---|---|---|
| INNER JOIN | 양쪽에 짝이 있는 행만 | 짝이 맞는 수 |
| LEFT OUTER JOIN | 왼쪽 행 모두 + 짝 | INNER + 왼쪽 짝 없는 행 |
| FULL OUTER JOIN | 양쪽 행 모두 | INNER + 양쪽 짝 없는 행 |
| CROSS JOIN | 모든 조합 | 두 테이블 행 수의 곱 |
대표 문제 3개
검수를 마친 예상문제 가운데 이 단원의 대표 문제입니다.
문제 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 과 같은 뜻이라 아무 행도 나오지 않습니다.
AI 작성 · 검수 완료 · AI가 새로 쓴 글 가운데, 작성과 분리된 AI 검증(다시 읽고 사실·수치 확인)을 통과한 단원만 싣습니다. 틀린 곳을 발견하면 알려 주세요.