[sql] HAVING과 WHERE의 차이점은 무엇입니까?

내가 잘못된 방식으로 인터넷 검색을하거나 바보 같은 순간을 보내고 있습니다.

차이 무엇 HAVINGWHERESQL SELECT문은?

편집 : 링크의 주요 정보가 포함되어 있기 때문에 Steven의 답변을 올바른 답변으로 표시했습니다.

GROUP BY사용하지 않으면 절 HAVING처럼 동작WHERE

내가 본 상황 은 내 혼란이 시작된 곳 WHERE이 아니고 GROUP BY그곳입니다. 물론 이것을 알기 전까지는 질문에 지정할 수 없습니다.



답변

HAVING은 SELECT 문에 사용 된 그룹 또는 집계 함수에 대한 검색 조건을 지정합니다.

출처


답변

HAVING : 집계가 수행 된 조건을 확인하는 데 사용됩니다 .
WHERE : 집계가 발생 하기 전에 조건을 확인하는 데 사용됩니다 .

이 코드는 :

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

MA의 모든 도시 및 각 도시의 주소 수에 대한 테이블을 제공합니다.

이 코드는 :

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

5 개 이상의 주소와 각 도시의 주소 수가있는 MA의 도시 테이블을 제공합니다.


답변

나에게 가장 큰 차이점 HAVING은 SQL 언어에서 제거되면 인생은 이전과 거의 비슷할 것입니다. 확실히, 소수 쿼리는 파생 테이블, CTE 등을 사용하여 다시 작성해야하지만 결과적으로 이해하고 유지하기가 더 쉬울 것입니다. 아마도이를 해결하기 위해 공급 업체의 최적화 코드를 다시 작성해야 할 수도 있습니다.

이제 WHERE언어에서 잠시 제거 하십시오. 이번에 는 존재 하는 대부분 의 쿼리를 명백한 대체 구문없이 다시 작성해야합니다. 코더는 이전 절 을 시뮬레이트하기 위해 절을 DUAL사용하여 정확히 하나의 행을 포함하는 것으로 알려진 테이블에 대한 내부 조인 (예 : Oracle에서)을 창의적으로 가져야합니다 . 그러한 구조는 고안 될 것이다. 언어에서 빠진 것이 있다는 것은 명백 할 것이며 결과적으로 상황은 더 나빠질 것입니다.ONWHERE

TL; DR 우리는 HAVING내일 잃을 수 있고 상황은 더 나쁘지 않을 것입니다 WHERE.


여기의 답변에서 많은 사람들은 HAVING절이 절없이 사용될 수 있음을 깨닫지 못하는 것 같습니다 GROUP BY. 이 경우, HAVING절은 전체 테이블 표현식에 적용되며 절에 상수 만 나타나도록 요구합니다 SELECT. 일반적으로이 HAVING절에는 집계가 포함됩니다.

이것은 소리보다 더 유용합니다. 예를 들어,이 쿼리를 사용 name하여 T다음의 모든 값에 대해 열이 고유한지 테스트하십시오 .

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

가능한 결과는 두 가지뿐입니다. HAVING절이 true이면 결과가 value를 포함하는 단일 행이 1되며 결과가 없으면 빈 세트가됩니다.


답변

WHERE 키워드를 집계 함수와 함께 사용할 수 없으므로 HAVING 절이 SQL에 추가되었습니다.

자세한 내용은 이 w3schools 링크 를 확인하십시오

통사론:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

다음과 같은 쿼리 :

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP
    BY column_name
HAVING COUNT( column_name ) >= 3;

… 다음과 같이 파생 테이블을 사용하여 다시 작성할 수 있습니다 (및 생략 HAVING).

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;


답변

이 둘의 차이점은 GROUP BY 절과 관련이 있습니다.

  • GROUP BY보다 먼저 오는 곳; SQL은 레코드를 그룹화하기 전에 WHERE 절을 평가합니다.

  • HAVING은 GROUP BY 이후에옵니다. SQL은 레코드를 그룹화 한 후 HAVING을 평가합니다.

문장 설명을 선택하십시오

참고 문헌


답변

HAVING과 같은 집계를 사용할 때 사용됩니다 GROUP BY.

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;


답변

WHERE는 SQL이 리턴 한 세트의 제한 사항으로 적용됩니다. SQL의 내장 세트 oeprations 및 인덱스를 사용하므로 결과 세트를 필터링하는 가장 빠른 방법입니다. 가능하면 항상 WHERE를 사용하십시오.

일부 집계 필터에는 HAVING이 필요합니다. sql이 결과를 검색, 어셈블 및 정렬 한 후에 쿼리를 필터링합니다. 따라서 WHERE보다 훨씬 느리므로 필요한 상황을 제외하고는 피해야합니다.

SQL Server를 사용하면 WHERE가 훨씬 빠를 때에도 HAVING을 사용할 수 있습니다. 하지마