source

SQL - 보유와어디에

itover 2023. 4. 22. 09:21
반응형

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절을 클릭합니다.

집약 함수에 대한 MSDN의 내용을 소개합니다.

  1. WHERE절은 와 함께 사용할 수 있습니다.SELECT,INSERT,그리고.UPDATE단,HAVING에서만 사용할 수 있다SELECT진술.

  2. WHERE집약 전에 행을 필터링 합니다(GROUP BY)에 비해,HAVING그룹 필터링을 수행합니다.

  3. 집계 함수를 에서 사용할 수 없습니다.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

반응형