문제
나는 잘못된 방식으로 인터넷 검색을 받아야하거나 어리석은 순간이 있습니다.
차이점은 무엇입니까? HAVING
그리고 WHERE
에서 SQL SELECT
성명?
편집 : 나는 링크의 주요 정보가 포함되어 있기 때문에 Steven의 답변을 올바른 것으로 표시했습니다.
언제
GROUP BY
사용되지 않고HAVING
a처럼 행동합니다WHERE
절
내가 본 상황 WHERE
에는 없었습니다 GROUP BY
그리고 내 혼란이 시작된 곳입니다. 물론, 당신이 이것을 알기 전까지는 질문에서 그것을 지정할 수 없습니다.
매우 깨달은 모든 답변에 감사드립니다.
해결책
그룹에 대한 검색 조건 또는 SELECT 문에 사용 된 집계 함수를 지정합니다.
다른 팁
가기 : 조건을 확인하는 데 사용됩니다 ~ 후에 집계가 발생합니다.
위치 : 조건을 확인하는 데 사용됩니다 ~ 전에 집계가 발생합니다.
이 코드 :
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의 도시 테이블을 제공합니다.
나에게 가장 큰 차이점 : if HAVING
SQL 언어에서 제거 되었으면 생명은 이전과 마찬가지로 다소 계속 될 것입니다. 확실히, 파생 테이블, CTE 등을 사용하여 소수의 쿼리를 다시 작성해야하지만 결과적으로 이해하고 유지하기가 더 쉽습니다. 이를 설명하기 위해 공급 업체의 최적화 코드를 다시 작성해야 할 수도 있습니다. 다시 업계 내에서 개선 할 수있는 기회입니다.
이제 잠시 제거하는 것을 고려하십시오 WHERE
언어에서. 이번에는 다수 명백한 대안 구성없이 존재하는 쿼리를 다시 작성해야합니다. 코더는 정확히 하나의 행을 포함하는 것으로 알려진 테이블에 창의력을 발휘해야합니다 (예 : DUAL
Oracle에서) 사용 ON
이전을 시뮬레이션하는 조항 WHERE
절. 그러한 구조는 고안 될 것이다. 언어에서 뭔가 빠진 것이 있었고 결과적으로 상황이 더 나빠질 것임이 분명 할 것입니다.
tl; 우리는 잃을 수 있습니다 HAVING
내일과 상황은 더 나쁘지 않을 것이지만, 아마도 더 나을 것입니다. 그러나 똑같이 말할 수는 없습니다 WHERE
.
여기의 답변에서 많은 사람들이 HAVING
조항은 a.없이 사용할 수 있습니다 GROUP BY
절. 이 경우 HAVING
절은 전체 테이블 표현식에 적용되며 상수만이 SELECT
절. 일반적으로 HAVING
조항에는 집계가 포함됩니다.
이것은 소리보다 더 유용합니다. 예를 들어,이 쿼리를 고려하여 name
열은 모든 값에 고유합니다 T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
가능한 두 가지 결과 만 있습니다 HAVING
조항은 사실입니다. 결과는 값을 포함하는 단일 행입니다. 1
, 그렇지 않으면 결과는 빈 세트가됩니다.
키워드를 집계 함수와 함께 사용할 수 없기 때문에 HADIN 절은 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;
둘 사이의 차이점은 절에 의한 그룹과의 관계에 있습니다.
그룹 앞에 오는 곳; SQL은 기록하기 전에 WHERE 절을 평가합니다.
그룹 후에 오는 것; SQL은 IT를 그룹화 한 후 평가를 평가합니다.
참조
HAVING
다음과 같은 집계를 사용할 때 사용됩니다. GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
SQL에 의해 반환 된 세트에 제한이 적용되는 경우; SQL의 내장 세트 Oeprations 및 Indexes를 사용하므로 결과 세트를 필터하는 가장 빠른 방법입니다. 가능할 때마다 항상 사용하십시오.
일부 집계 필터에는 필요한 것이 필요합니다. SQL이 검색, 조립 및 결과를 정렬 한 후 쿼리를 필터링합니다. 따라서 필요한 상황을 제외하고는 어디보다 훨씬 느리고 피해야합니다.
SQL Server를 사용하면 훨씬 더 빠른시기에도 사용을 도망 갈 수 있습니다. 하지 마십시오.
조항이 집계 함수에 대해 작동하지 않는 경우
수단 :이 보너스처럼 사용해서는 안됩니다 : 테이블 이름
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
여기서 절을 사용해야하는 위치를 사용하는 대신 ..
clause by clause를 사용하지 않고 절은 절만있는 곳으로 작동합니다.
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
차이 b/w WHERE
그리고 HAVING
절:
사이의 주요 차이점 WHERE
그리고 HAVING
절은 WHERE
행 작업에 사용됩니다 HAVING
열 작업에 사용됩니다.
우리가 필요한 이유 HAVING
절?
아시다시피, 집계 함수는 열에서만 수행 할 수 있으므로 집계 함수를 사용할 수 없습니다. WHERE
절. 따라서 우리는 골재 기능을 사용합니다 HAVING
절.
언제 GROUP BY
사용되지 않습니다 WHERE
그리고 HAVING
조항은 본질적으로 동일합니다.
그러나 언제 GROUP BY
사용:
- 그만큼
WHERE
절은 결과에서 레코드를 필터링하는 데 사용됩니다. 필터링은 그룹화되기 전에 발생합니다. - 그만큼
HAVING
절은 그룹으로부터 값을 필터링하는 데 사용됩니다 (즉, 그룹으로의 집계가 수행 된 후 조건을 확인하기 위해).
자원 여기
나는 문제가 있었고 WHERE
그리고 HAVING
. 인덱스 된 열에서 동일한 방식으로 작동하지 않습니다.
WHERE my_indexed_row = 123
행을 표시하고 다른 인덱스 행에서 "주문 ASC"를 자동으로 수행합니다.
HAVING my_indexed_row = 123
가장 오래된 "삽입 된"행에서 주문이없는 최신 행까지 모든 것을 보여줍니다.
그것을 생각하는 한 가지 방법은 adge clause가 WHERE 절에 대한 추가 필터라는 것입니다.
ㅏ 어디 절은 결과에서 필터 레코드를 사용합니다. 필터는 그룹화되기 전에 발생합니다. ㅏ was 절은 그룹의 값을 필터링하는 데 사용됩니다
집계 된 중간 결과 세트가 생성되기 전에 집계 쿼리 (집계 함수가 사용되는 쿼리)에서 (집계 함수가 사용되는 모든 쿼리)는 위치를 예정합니다.
haved 절의 예측은 생성 된 후 집계 결과 세트에 적용됩니다. 그렇기 때문에 집계 값에 대한 술어 조건은 WHERE 절이 아닌 조항에 있어야하며, where 절에서 선택 조항에 정의 된 별칭을 사용할 수있는 이유입니다.
기본 테이블의 값을 비교하는 데 절이 사용되는 경우, 쿼리 클릭의 결과 세트에서 집계 함수 결과를 필터링하는 데 사용되는 조항을 사용할 수 있습니다. 여기!
집계 함수의 결과를 기반으로 쿼리를 제한하는 데 사용합니다. 예를 들어 선택 *에서 Blahblahblah 그룹에서 Count (Something)> 0
프로젝트를 진행하는 동안 이것은 또한 제 질문이었습니다. 위에서 언급 한 바와 같이 was 이미 발견 된 쿼리 결과의 조건을 확인합니다. 하지만 어디 쿼리가 실행되는 동안 조건을 확인하는 것입니다.
이것을 설명 할 모범을 보여 드리겠습니다. 이와 같은 데이터베이스 테이블이 있다고 가정 해 봅시다.
usertable {int userid, date datefield, 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
우리가 쓰면 :
usertable where sum (daily ompecome)> 100 그룹 별 userId, sum (daily omcome)을 선택하십시오.
이것은 오류가 될 것입니다. 올바른 쿼리는 다음과 같습니다.
UserTable Group에서 userId, sum (Daily Encome)을 선택하여 userId whand sum (daily Encome)> 100을 선택하십시오.
"여기서"의 주제는 줄인 반면, "hading"의 주제는 그룹 일 수 있습니다. 내가 맞아?