[DB] 06. SQL 기본 구조와 SELECT 실행 순서

[DB] 06. SQL 기본 구조와 SELECT 실행 순서

1. SQL이란 무엇인가

SQL(Structured Query Language)은 데이터베이스에 저장된 데이터를 조회하거나 조작하기 위해 사용하는 언어다.

SQL은 “프로그래밍 언어”라기보다는, DBMS에게 무엇을 원하는지 전달하는 질의 언어에 가깝다.

개발자는 SQL을 작성하고, 실제 데이터의 저장·조회·수정·삭제는 DBMS가 처리한다.

2. SQL의 분류

SQL은 역할에 따라 다음과 같이 나뉜다.

분류 의미 예시
DDL 데이터 정의 언어 CREATE, ALTER, DROP
DML 데이터 조작 언어 SELECT, INSERT, UPDATE, DELETE
DCL 권한 제어 언어 GRANT, REVOKE
TCL 트랜잭션 제어 언어 COMMIT, ROLLBACK

이 중에서 가장 자주 사용하게 되는 것은 DML, 특히 SELECT 문이다.

3. SELECT 문의 기본 구조

SELECT 문은 데이터를 “어떻게 가져올지”를 정의한다. 기본적인 형태는 다음과 같다.

SELECT 컬럼
FROM 테이블
WHERE 조건;

이 구조를 이해하는 것이 SQL의 출발점이다.

4. SELECT 실행 순서

중요한 점은, SELECT 문은 작성 순서대로 실행되지 않는다는 것이다.

DBMS 내부에서는 다음 순서로 처리된다.

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

이 순서를 모르면, GROUP BY나 HAVING에서 헷갈리는 경우가 많다.

5. 실행 순서를 예제로 이해하기

SELECT user_id, COUNT(*)
FROM orders
WHERE price >= 10000
GROUP BY user_id
HAVING COUNT(*) >= 2
ORDER BY user_id;

위 쿼리는 다음 순서로 처리된다.

  1. orders 테이블에서 데이터를 가져온다 (FROM)
  2. price가 10000 이상인 행만 남긴다 (WHERE)
  3. user_id 기준으로 묶는다 (GROUP BY)
  4. 그룹 중 개수가 2개 이상인 것만 남긴다 (HAVING)
  5. user_id와 COUNT 결과를 선택한다 (SELECT)
  6. user_id 기준으로 정렬한다 (ORDER BY)

그래서 WHERE에서는 집계 함수(COUNT 등)를 사용할 수 없고, HAVING에서만 사용할 수 있다.

6. WHERE와 HAVING의 차이

WHERE와 HAVING은 모두 조건을 거는 역할을 한다. 하지만 적용 시점이 다르다.

구분 적용 시점 대상
WHERE GROUP BY 이전 개별 행(Row)
HAVING GROUP BY 이후 그룹(Group)

이 차이 때문에, 집계 결과에 조건을 걸고 싶을 때는 HAVING을 사용한다.

7. SELECT * 을 조심해야 하는 이유

SELECT * 은 모든 컬럼을 가져온다. 편해 보이지만 단점이 있다.

  • 필요 없는 데이터까지 전부 가져온다
  • 컬럼 추가/변경 시 의도치 않은 영향이 생길 수 있다
  • 네트워크 및 성능 측면에서 불리하다

그래서 실제로는 필요한 컬럼만 명시하는 편이 안전하다.

8. 정리

  • SQL은 DBMS에 요청을 전달하는 질의 언어다
  • SELECT는 가장 많이 사용되는 SQL 문이다
  • SELECT는 작성 순서가 아닌 내부 실행 순서가 중요하다
  • WHERE는 행, HAVING은 그룹에 조건을 건다