SELECT 기본 정리
SELECT 문은 테이블에서 필요한 열을 고르고, WHERE로 행을 걸러내고, ORDER BY로 결과 순서를 정하는 가장 기본적인 조회 문법입니다.
정보처리기사 실기 문제에서는 결과가 어떻게 출력되는지 묻거나 빈칸에 적절한 절을 채우는 형태로 자주 연습하게 됩니다.
SELECT name, score
FROM student
WHERE score >= 80
ORDER BY score DESC;
자주 틀리는 포인트
- 문자열 조건은 작은따옴표로 감싸는 경우가 많습니다.
- ORDER BY는 조회 결과를 정렬하는 절이며, DESC는 내림차순입니다.
- WHERE는 집계 결과가 아니라 원본 행 조건을 처리합니다.
연습 문제: 점수가 90점 이상인 학생을 이름 오름차순으로 출력하려면 WHERE와 ORDER BY를 어떻게 작성할까요?
정답/해설: WHERE score >= 90 ORDER BY name ASC를 사용할 수 있습니다. ASC는 기본값이라 생략할 수도 있습니다.
WHERE와 HAVING 차이 쉽게 이해하기
WHERE와 HAVING은 모두 조건을 작성하는 절이지만 적용 시점이 다릅니다.
WHERE는 GROUP BY 이전에 개별 행을 필터링하고, HAVING은 GROUP BY 이후 집계된 그룹 결과를 필터링합니다.
SELECT dept, COUNT(*) AS employee_count
FROM employee
WHERE status = '재직'
GROUP BY dept
HAVING COUNT(*) >= 3;
예제로 구분하기
재직 중인 사원만 대상으로 부서별 인원 수를 세려면 status 조건은 WHERE에 둡니다.
그 결과 중 인원 수가 3명 이상인 부서만 보고 싶다면 COUNT(*) 조건은 HAVING에 둡니다.
연습 문제
부서별 평균 급여가 300만 원 이상인 부서만 조회하려면 AVG(salary) 조건은 어디에 작성해야 할까요?
정답/해설: 평균 급여는 GROUP BY 이후 계산되는 집계 값이므로 HAVING AVG(salary) >= 3000000처럼 작성합니다.
INNER JOIN과 LEFT JOIN 차이
JOIN은 여러 테이블에 흩어진 데이터를 연결해서 조회할 때 사용합니다.
INNER JOIN은 양쪽 테이블 모두에 일치하는 데이터가 있을 때만 결과에 포함하고, LEFT JOIN은 왼쪽 테이블의 행을 우선 유지합니다.
SELECT e.name, d.dept_name
FROM employee e
INNER JOIN department d ON e.dept_id = d.id;
SELECT e.name, d.dept_name
FROM employee e
LEFT JOIN department d ON e.dept_id = d.id;
자주 틀리는 포인트
- 문제에서 "부서가 없는 사원도 출력"이라고 하면 LEFT JOIN을 떠올릴 수 있습니다.
- INNER JOIN은 조인 조건이 맞지 않는 행을 제외합니다.
- LEFT JOIN 결과에서 오른쪽 테이블 값이 없으면 NULL이 표시될 수 있습니다.
연습 문제 정답/해설: 모든 사원을 출력하면서 부서명이 있으면 함께 보여주는 문제라면 employee를 왼쪽에 두고 department를 LEFT JOIN합니다.
GROUP BY를 사용할 때 주의할 점
GROUP BY는 같은 값을 가진 행을 묶어 집계할 때 사용합니다. SELECT 절에는 GROUP BY에 포함된 컬럼이나 COUNT, SUM, AVG 같은 집계 함수 결과가 와야 합니다.
SELECT dept, COUNT(*) AS total_count, AVG(salary) AS avg_salary
FROM employee
GROUP BY dept;
틀리기 쉬운 예
SELECT name, dept, COUNT(*)
FROM employee
GROUP BY dept;
위 예시는 dept별로 묶었는데 name은 그룹 안에서 하나로 결정되지 않습니다. 이런 경우 name을 제거하거나, 필요한 기준에 맞게 GROUP BY에 포함할 컬럼을 다시 설계해야 합니다.
연습 문제
부서별 사원 수를 구하고 사원 수가 많은 순으로 정렬하려면 어떤 절이 필요할까요?
정답/해설: GROUP BY dept로 묶고 COUNT(*)를 구한 뒤 ORDER BY COUNT(*) DESC로 정렬합니다.
SQL 문제 풀기