SQL 기본 개념과 실행 순서

SELECT 문 실행 순서

SQL에서 SELECT 문의 일반적인 실행 순서는 다음과 같습니다:

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

이 순서는 데이터베이스 관리 시스템(DBMS)마다 약간의 차이가 있을 수 있습니다.

예를 들어, 성적 테이블에서 WHERE 절이 먼저 실행되어 특정 조건에 맞지 않는 데이터가 필터링된 후, GROUP BY 절이 실행됩니다. 이로 인해 그룹화된 결과에 포함되지 않는 데이터가 발생할 수 있습니다.

GROUP BY 사용법과 제약 조건

SELECT 절에서의 열 제한

GROUP BY를 사용하는 경우, SELECT 절의 열은 다음 세 가지 경우에만 해당될 수 있습니다:

  • 상수 값
  • 집계 함수 (SUM(), COUNT(*), MAX() 등)
  • GROUP BY 절에 명시된 열과 일치하는 열
  • GROUP BY 절에 명시되지 않았지만 단일 값을 반환하는 열 (MySQL에서 허용)

만약 과목별로 그룹화할 때 각 그룹에 여러 학생 이름이 존재한다면, SELECT 절에서 학생 이름을 포함시키는 것은 오류를 발생시킵니다. 이는 그룹 내에서 여러 값이 존재하기 때문입니다.

GROUP BY에서 별칭 사용 불가

SELECT 절에서 열에 별칭을 지정한 후, GROUP BY 절에서 그 별칭을 사용하는 것은 불가능합니다. 이는 실행 순서상 GROUP BY가 SELECT보다 먼저 실행되기 때문입니다.

집계 함수에서 그룹화 필드 사용

GROUP BY로 지정된 필드를 COUNT()와 같은 집계 함수 내에서 사용하는 것은 가능합니다. 예를 들어, COUNT(성별)은 성별로 그룹화된 각 그룹의 행 수를 세는 것으로, COUNT(*)와 동일한 결과를 제공합니다.

COUNT() 함수의 종류와 차이점

COUNT() 함수는 주로 행 수를 세는 데 사용됩니다:

  • COUNT(*): 모든 열을 대상으로 행 수를 세며, NULL 값을 포함합니다.
  • COUNT(1): COUNT(*)과 기능적으로 동일합니다.
  • COUNT(열명): 특정 열을 대상으로 행 수를 세며, NULL 값은 제외합니다.

WHERE 절에서의 집계 함수 사용 제한

WHERE 절에는 집계 함수를 직접 사용할 수 없습니다. 예를 들어, 학생 성적 테이블에서 평균 점수보다 낮은 학생을 조회하려면 다음과 같이 서브 쿼리를 사용해야 합니다:


SELECT * FROM students
WHERE score < (SELECT AVG(score) FROM students)

DISTINCT의 사용 범위

DISTINCT는 중복된 값을 제거하는 데 사용됩니다:

  • 단일 열 앞에 사용: 해당 열의 중복 값 제거
  • 집계 함수 내에 사용: 해당 함수 내에서 중복 값 제거
  • 여러 열 앞에 사용: 여러 열의 조합 기준으로 중복 값 제거

주의할 점은, 집계 함수 내에 사용되지 않는 경우 DISTINCT는 첫 번째 열 앞에만 위치할 수 있습니다.

다중 테이블 조인

SQL에서 여러 테이블을 연결하는 방법은 다음과 같습니다:

  • 내부 조인(INNER JOIN): 조건을 만족하는 두 테이블의 교집합을 반환
  • 왼쪽 외부 조인(LEFT OUTER JOIN): 왼쪽 테이블을 기준으로 오른쪽 테이블의 일치하는 데이터를 연결, 일치하지 않으면 NULL
  • 오른쪽 외부 조인(RIGHT OUTER JOIN): 오른쪽 테이블을 기준으로 왼쪽 테이블의 일치하는 데이터를 연결, 일치하지 않으면 NULL

세 개 이상의 테이블을 조인할 때는 여러 JOIN 절을 연결하여 사용할 수 있습니다:


FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.id = t2.id
INNER JOIN table3 AS t3 ON t1.id = t3.id

태그: SQL 데이터베이스 쿼리 집계함수 조인

7월 3일 03:51에 게시됨