>데이터 베이스 >MySQL 튜토리얼 >SQL의 WHERE와 HAVING: 언제 각 절을 사용해야 합니까?

SQL의 WHERE와 HAVING: 언제 각 절을 사용해야 합니까?

DDD
DDD원래의
2025-01-21 09:36:39260검색

WHERE vs. HAVING in SQL: When Should I Use Each Clause?

SQL 쿼리의 WHERE 및 HAVING 절 이해

SQL 개발자는 WHERE 절과 HAVING 절을 구별하는 데 어려움을 겪는 경우가 많습니다. 이 문서에서는 SQL 쿼리에서의 다양한 사용법을 명확히 하는 것을 목표로 합니다.

WHERE를 사용하는 경우

  • 개별 행 필터링: WHERE 절은 테이블 또는 조인 결과 집합의 개별 행에 조건을 적용하는 데 사용됩니다. 각 행을 평가하고 지정된 기준을 충족하는 행만 선택합니다.

HAVING을 사용하는 경우

  • 집계 결과 필터링: HAVING 절은 집계 함수(예: COUNT(), SUM(), AVG())로 표시되는 행 그룹에 조건을 적용합니다. 집계 작업 후 요약된 데이터에 대한 조건을 설정해야 할 때 사용합니다.

예: 전공 최다 강사

이 차이점을 설명하려면 다음 표를 참조하세요.

<code>1. Lecturers (LectID, Fname, Lname, degree)
2. Lecturers_Specialization (LectID, Expertise)</code>

전공이 가장 많은 강사를 찾는 것이 목표입니다.

WHERE 쿼리(오류)

<code class="language-sql">SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);</code>

이 WHERE 쿼리는 WHERE를 사용하여 집계 함수(COUNT(S.Expertise))를 기반으로 필터링하려고 시도하므로 작동하지 않습니다. WHERE 절은 결과를 집계하는 것이 아니라 개별 행을 필터링하는 데 사용됩니다.

HAVING 쿼리(정확함)

<code class="language-sql">SELECT
  L.LectID,
  Fname,
  Lname 
FROM Lecturers L,
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
         Fname,
         Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);</code>

이 HAVING 쿼리는 GROUP BY 연산 후 집계된 데이터(COUNT(S.Expertise))에 조건을 설정하므로 올바른 결과를 성공적으로 검색합니다.

ANSI 연결 버전(권장)

ANSI 조인 구문을 사용하면 쿼리를 다음과 같이 다시 작성할 수 있습니다.

<code class="language-sql">SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>

이 버전에서는 세타 조인 조건에 대한 WHERE 절이 제거되어 더 효율적이고 표준을 준수하는 쿼리가 가능해졌습니다.

위 내용은 SQL의 WHERE와 HAVING: 언제 각 절을 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.