내가 잘못된 방식으로 인터넷 검색을하거나 바보 같은 순간을 보내고 있습니다.
차이 무엇 HAVING
과 WHERE
의 SQL 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에서)을 창의적으로 가져야합니다 . 그러한 구조는 고안 될 것이다. 언어에서 빠진 것이 있다는 것은 명백 할 것이며 결과적으로 상황은 더 나빠질 것입니다.ON
WHERE
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을 사용할 수 있습니다. 하지마
