SQL - 보유와어디에
다음 두 개의 테이블이 있습니다.
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
나는 가장 전문화된 강사를 찾고 싶다.이것을 시도해도 동작하지 않습니다.
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);
하지만 이렇게 해보면 효과가 있습니다.
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);
이유가 뭐야?감사해요.
WHERE절은 개개의 행에 조건을 도입한다.HAVING절은 여러 행에서 하나의 결과(count, average, min, max 또는 sum)가 생성된 선택 결과 등 집계에 관한 조건을 도입합니다.쿼리에는 두 번째 종류의 조건(집약상의 조건)이 필요합니다.HAVING올바르게 동작합니다.
경험으로 볼 때WHERE전에GROUP BY그리고.HAVING끝나고GROUP BY이것은 다소 원시적인 규칙이지만 90% 이상의 경우에 유용합니다.
그 사이에 ANSI 버전의 Join을 사용하여 쿼리를 다시 쓸 수 있습니다.
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)
이렇게 하면WHERE세타 결합 조건으로 사용되었습니다.
먼저 FROM > WHERE > GROUP BY > HAVING > DISIGNT > SELECT > ORDER BY 등의 조항 실행 순서를 알아야 합니다.WHERE 절은 GROUP BY 절보다 먼저 실행되므로 적용된 GROUP BY 레코드에 WHERE를 적용하여 레코드를 필터링할 수 없습니다.
HAVING은 WHERE 절과 동일하지만 그룹화된 레코드에 적용됩니다.
먼저 WHERE 절이 조건에 따라 레코드를 가져온 후 GROUP BY 절이 레코드를 그룹화하고 다음으로 HAVING 절이 보유 조건에 따라 그룹 레코드를 가져옵니다.
HAVING는 Aggregate 상에서 동작합니다.부터COUNT집약함수이므로 에서는 사용할 수 없습니다.WHERE절을 클릭합니다.
WHERE절은 와 함께 사용할 수 있습니다.SELECT,INSERT,그리고.UPDATE단,HAVING에서만 사용할 수 있다SELECT진술.WHERE집약 전에 행을 필터링 합니다(GROUP BY)에 비해,HAVING그룹 필터링을 수행합니다.집계 함수를 에서 사용할 수 없습니다.
WHERE포함된 서브쿼리에 포함되지 않는 한 조항HAVINGclause, 단, 집약함수는 다음과 같이 사용할 수 있습니다.HAVING절을 클릭합니다.
하나의 쿼리에서 두 가지 예를 볼 수 없습니다.이 예가 도움이 될 수 있습니다.
/**
INTERNATIONAL_ORDERS - table of orders by company by location by day
companyId, country, city, total, date
**/
SELECT country, city, sum(total) totalCityOrders
FROM INTERNATIONAL_ORDERS with (nolock)
WHERE companyId = 884501253109
GROUP BY country, city
HAVING country = 'MX'
ORDER BY sum(total) DESC
그러면 먼저 companyId별로 테이블을 필터링한 후 (국가 및 도시별로) 그룹화하고 멕시코의 도시집약으로만 필터링합니다.집약에는 companyId가 필요 없었지만 GROUP BY를 사용하기 전에 WHERE를 사용하여 원하는 행만 필터링할 수 있었습니다.
where 구는 집약함수와 함께 사용할 수 없습니다.where 구에서는 조건에 따라 레코드를 취득한 후 지정된 조건에 따라 레코드를 취득하기 때문입니다.그래서 그때 우리는 어디 조항이 없다.have 구는 쿼리를 실행한 후 최종적으로 얻을 수 있는 resultSet에 대해 기능합니다.
쿼리 예시:
select empName, sum(Bonus)
from employees
order by empName
having sum(Bonus) > 5000;
그러면 resultSet이 임시 메모리에 저장되고 구가 해당 작업을 수행합니다.따라서 여기서는 집계 함수를 쉽게 사용할 수 있습니다.
1. WHERE 절이 아닌 HAVIN 절과 함께 집계 함수를 사용할 수 있습니다(예: min, max, avg).
2. WHERE 조항은 레코드 태플을 태플 HAVING 조항으로 제거하며 그룹 전체를 그룹 수집에서 제외한다.
대부분 HAVING은 데이터 그룹이 있을 때 사용되고 WHERE는 데이터가 행에 있을 때 사용됩니다.
WHERE할 때 합니다.HAVING절은 관계에서 그룹을 제거하기 위해 사용됩니다.
HAVING절은 다음과 같은 집계 함수에 사용됩니다.MIN ,MAX ,COUNT ,SUM. 단, ,, 상을 GROUP BYHAVING절을 사용하여 오류를 최소화합니다.
다.WHERE ★★★★★★★★★★★★★★★★★」HAVING이치노의 WHERE스테이트먼트, 데이터 필터링은, 조작을 위해서 데이터를 꺼내기 전에 행해집니다.
SELECT name, age
FROM employees
WHERE age > 30;
★★★★★★★★★★★★★★★★★★.WHERE " " " 을 필터링합니다.SELECT조작이 실행됩니다.
SELECT department, avg(age) avg_age
FROM employees
GROUP BY department
HAVING avg_age> 35;
HAVING는, 「」의 뒤에 있는 합니다.SELECT조작이 실행됩니다.서 연산 한 후되며, 그 에는 기서 here기 a 、 기 、 기 、 기 、 a 、 a 、 a 、 a 。HAVING절을 클릭합니다.
언급URL : https://stackoverflow.com/questions/9253244/sql-having-vs-where
'source' 카테고리의 다른 글
| 선택한 ListBox 항목의 배경색 변경 (0) | 2023.04.22 |
|---|---|
| ICommand MVVM 구현 (0) | 2023.04.22 |
| Swift에서 이미지(systemName:)에 사용할 수 있는 모든 이미지를 검색합니다.UI (0) | 2023.04.22 |
| Catching FULL 예외 메시지 (0) | 2023.04.22 |
| IIS의 느린 초기 로드 수정 (0) | 2023.04.22 |