SQL에서 HAVING과 WHERE의 차이점은 무엇입니까?
사이의 차이점은 무엇입니까?HAVING
그리고.WHERE
순식간에SQL SELECT
진술서?
편집: 링크에 핵심 정보가 포함되어 있으므로 Steven의 답변을 올바른 답변으로 표시했습니다.
때
GROUP BY
사용되지 않습니다.HAVING
이이상다니처럼 행동합니다.WHERE
.
내가 본 상황은WHERE
에는 가지못이 .GROUP BY
그리고 거기서 나의 혼란이 시작되었습니다.물론, 이것을 알기 전까지는 질문에 명시할 수 없습니다.
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
MA에 주소가 5개 이상 있는 도시의 표와 각 도시의 주소 수를 제공합니다.
HAVING은 SELECT 문에 사용되는 그룹 또는 집계 함수에 대한 검색 조건을 지정합니다.
: 나에가장큰차점이게만약: 만약▁number:.HAVING
SQL 언어에서 제거되면 이전과 같이 수명이 다소 연장됩니다.물론 소수 쿼리는 파생 테이블, CTE 등을 사용하여 다시 작성해야 하지만 결과적으로 이해하고 유지하기가 더 쉬울 것입니다.공급업체의 옵티마이저 코드를 다시 작성하여 이를 설명해야 할 수도 있습니다. 다시 한번 업계 내에서 개선의 기회가 될 수도 있습니다.
이제 탈거를 잠시 고려해 보십시오.WHERE
언어로부터.이번에는 존재하는 대부분의 쿼리를 명확한 대체 구조 없이 다시 작성해야 합니다.코더는 창의적이어야 합니다. 예를 들어, 정확히 하나의 행을 포함하는 것으로 알려진 테이블에 내부 결합을 해야 합니다(예:DUAL
사용ON
의 이을시션는절을 하는 절WHERE
◦ 입니다. 된 것이 은 더 그러한 구조는 고안될 것입니다. 언어에서 무언가가 누락된 것이 분명할 것이고 결과적으로 상황은 더 악화될 것입니다.
는 잃을 도 있습니다. TL;DRHAVING
내일 그리고 상황은 더 나쁘지 않을 것이다, 아마도 더 좋을 것이다, 그러나 같은 것은 말할 수 없습니다.WHERE
.
여기 답변을 보면, 많은 사람들이 그것을 깨닫지 못하는 것 같습니다.HAVING
은 은다음같사수있습다니용될이과절 없이 수.GROUP BY
◦ 이 이경우는,HAVING
표 .SELECT
으로 으로적일HAVING
절에는 집계가 포함됩니다.
이것은 듣기보다 더 유용합니다.예를 들어, 이 쿼리를 고려하여 다음을 테스트합니다.name
은 열의 모든 대고니다의 합니다.T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
는 두 입니다: 에 만약에 이 경우입니다. 다음과 같습니다.HAVING
이면 값이 " " " " " " " " " " " " " " " " " 을 하는 단일 행이 .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 절과의 관계에 있습니다.
WHERE는 GROUP BY 앞에 옵니다. SQL은 레코드를 그룹화하기 전에 WHERE 절을 평가합니다.
HAVING은 GROUP BY 다음에 오고 SQL은 레코드를 그룹화한 후 HAVING을 평가합니다.
레퍼런스
HAVING
는 Aggregate와 할 때 됩니다.GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
WHERE는 SQL에서 반환하는 집합에 대한 제한으로 적용되며 SQL의 기본 제공 집합 및 인덱스를 사용하므로 결과 집합을 필터링하는 가장 빠른 방법입니다.가능하면 항상 WHERE를 사용합니다.
HAVING은 일부 집계 필터에 필요합니다.SQL이 결과를 검색, 조립 및 정렬한 후 쿼리를 필터링합니다.따라서 WHERE보다 속도가 훨씬 느리며 필요한 경우를 제외하고는 피해야 합니다.
SQL Server를 사용하면 WHERE가 훨씬 더 빠를 때에도 HAVING을 사용할 수 있습니다.하지 마세요.
WHERE 절은 집계 함수에 대해 작동하지 않습니다.
의미: 이 보너스처럼 사용하면 안 됩니다: 테이블 이름
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
여기서는 WHERE 절을 사용하는 대신 HAVING을 사용해야 합니다.
GROUP BY 절을 사용하지 않고 HAVING 절은 WHERE 절로 작동합니다.
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
b 이차 b/wWHERE
그리고.HAVING
절:
의 주요 WHERE
그리고.HAVING
절은,WHERE
과 행 연산에 됩니다.HAVING
는 열 작업에 사용됩니다.
에게 필요한 ㅠㅠㅠㅠHAVING
조항?
알고 있는 할 수 있기 할 수 .WHERE
절따라서 다음에서 집계 함수를 사용합니다.HAVING
절
한 가지 생각할 수 있는 방법은 haveing 절이 where 절에 대한 추가 필터입니다.
WHERE 절은 결과의 레코드를 필터링하는 데 사용됩니다.필터는 그룹화하기 전에 발생합니다.HAVING 절은 그룹의 값을 필터링하는 데 사용됩니다.
Aggregate 쿼리에서 (Aggregate 함수가 사용되는 임의의 쿼리) 집계된 중간 결과 집합이 생성되기 전에 절이 평가되는 위치의 술어,
Having 절의 술어는 생성된 집계 결과 집합에 적용됩니다.그렇기 때문에 집계 값에 대한 술어 조건은 Where 절이 아닌 Having 절에 배치해야 하며 Having 절의 Select 절에 정의된 별칭을 사용할 수 있지만 Where 절에는 사용할 수 없습니다.
저는 문제가 있었고 다른 차이점을 발견했습니다.WHERE
그리고.HAVING
인덱스된 열에서는 동일한 방식으로 작동하지 않습니다.
WHERE my_indexed_row = 123
그러면 행이 표시되고 인덱싱된 다른 행에 대해 "ORDER ASC"가 자동으로 수행됩니다.
HAVING my_indexed_row = 123
에는 가장 오래된 "가장 오래된" 행부터 최신 행까지 모든 항목이 표시됩니다(주문 없음).
때GROUP BY
사되지않음용,WHERE
그리고.HAVING
절들은 본질적으로 동등합니다.
, 지만하 때, 제언.GROUP BY
사용:
- 그
WHERE
절은 결과에서 레코드를 필터링하는 데 사용됩니다.필터링은 그룹화를 만들기 전에 수행됩니다. - 그
HAVING
절은 그룹의 값을 필터링하는 데 사용됩니다(즉, 그룹으로 집계된 후 조건을 확인하는 데 사용됩니다).
여기서 리소스
여기서.
SQL 표준은 HAVING이 GROUP BY 절의 열 또는 집계 함수에 사용된 열만 참조하도록 요구합니다.
데이터베이스 행에 적용되는 WHERE 절과 반대로
프로젝트를 진행하는 동안, 이것 또한 저의 질문이었습니다.위에서 언급한 바와 같이 HAVING은 이미 발견된 쿼리 결과의 조건을 참조하십시오.그러나 WHERE는 쿼리가 실행되는 동안 상태를 확인하기 위한 것입니다.
예를 들어 설명하겠습니다.다음과 같은 데이터베이스 테이블이 있다고 가정합니다.
사용자 테이블 {int userid, date 필드, int daily income }
다음 행이 표에 있다고 가정합니다.
1, 2011-05-20, 100
1, 2011-05-21, 50
1, 2011-05-30, 10
2, 2011-05-30, 10
2, 2011-05-20, 20
이제, 우리는 그것을 얻고 싶습니다.userid
모래땅sum(dailyincome)
의 집입니까?sum(dailyincome)>100
다음과 같이 적을 경우:
사용자 ID, 사용자 테이블에서 합계(일상소득) > 사용자 ID별 100개 그룹 선택
이것은 오류가 될 것입니다.올바른 쿼리는 다음과 같습니다.
사용자 테이블 그룹에서 합계(일상소득)가 있는 사용자 ID를 기준으로 사용자 ID, 합계(일상소득) > 100 선택
WHERE 절은 기본 테이블의 값을 비교하는 데 사용되는 반면 HAVING 절은 쿼리의 결과 집합에서 집계 함수의 결과를 필터링하는 데 사용될 수 있습니다. 여기를 클릭하십시오!
GROUP BY를 사용하지 않는 경우 WHERE 절과 HAVING 절은 기본적으로 동일합니다.
그러나 GROUP BY를 사용하는 경우:
- WHERE 절은 결과에서 레코드를 필터링하는 데 사용됩니다.필터링은 그룹화를 만들기 전에 수행됩니다.
- HAVING 절은 그룹의 값을 필터링하는 데 사용됩니다(즉, 그룹으로 집계된 후 조건을 확인하는 데 사용됩니다).
집계 함수의 결과를 기반으로 쿼리를 제한하기 위해 HAVING을 사용합니다.예: blahblah blah blah blah 그룹에서 카운트(SOMETHING)>0을 선택합니다.
언급URL : https://stackoverflow.com/questions/287474/what-is-the-difference-between-having-and-where-in-sql
'IT' 카테고리의 다른 글
Django-DB-Migrations: 보류 중인 트리거 이벤트가 있기 때문에 TABLE을 변경할 수 없습니다. (0) | 2023.05.18 |
---|---|
mongo 콘솔에서 날짜 필드를 업데이트하는 방법은 무엇입니까? (0) | 2023.05.18 |
Postgres for Insert 문에서 UUID를 생성하시겠습니까? (0) | 2023.05.18 |
추적 출력을 콘솔로 리디렉션 (0) | 2023.05.18 |
파일 인쇄, 첫 번째 X줄 건너뛰기, Bash로 (0) | 2023.05.18 |