[SQL] SQL은 - VS 어디를 가진
SQLSQL은 - VS 어디를 가진
나는 다음과 같은 두 개의 테이블이 있습니다
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);
그 이유는 무엇입니까? 감사.
해결법
-
==============================
1.WHERE 절은 개별 행에 조건을 소개합니다; 절 컨덕터를 집계의 조건을 갖는, 그러한 카운트의 평균, 최소, 최대, 또는 합으로서 하나의 결과는, 복수의 열로부터 생성 한 선택 결과 즉. 조건의 두 번째 종류의 쿼리 호출 (집계에, 즉 조건) 따라서 제대로 작동 HAVING.
WHERE 절은 개별 행에 조건을 소개합니다; 절 컨덕터를 집계의 조건을 갖는, 그러한 카운트의 평균, 최소, 최대, 또는 합으로서 하나의 결과는, 복수의 열로부터 생성 한 선택 결과 즉. 조건의 두 번째 종류의 쿼리 호출 (집계에, 즉 조건) 따라서 제대로 작동 HAVING.
엄지 손가락의 규칙으로, GROUP BY 전에 WHERE 사용하여 GROUP BY 후 HAVING. 그것은 오히려 기본 규칙이지만, 90 % 이상의 경우에 유용합니다.
당신이 그것에 인 동안, 당신은 가입의 ANSI 버전을 사용하여 쿼리를 다시 작성 할 수 있습니다 :
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)
세타 조인 조건으로 그 사용 된 곳은 제거 할 것입니다.
-
==============================
2.HAVING은 집계에서 작동합니다. COUNT는 집계 함수이기 때문에, 당신은 WHERE 절에 사용할 수 없습니다.
HAVING은 집계에서 작동합니다. COUNT는 집계 함수이기 때문에, 당신은 WHERE 절에 사용할 수 없습니다.
여기에 집계 함수에 대한 MSDN에서 일부 독서입니다.
-
==============================
3.먼저 우리는 조항 즉 실행의 순서를 알고 있어야합니다 > FROM WHERE> GROUP BY> HAVING> DISTINCT> SELECT> ORDER BY. 절은 GROUP BY 절 전에 실행됩니다 WHERE 때문에 기록은 GROUP BY 레코드를 적용 WHERE에 적용하여 필터링 할 수 없습니다.
먼저 우리는 조항 즉 실행의 순서를 알고 있어야합니다 > FROM WHERE> GROUP BY> HAVING> DISTINCT> SELECT> ORDER BY. 절은 GROUP BY 절 전에 실행됩니다 WHERE 때문에 기록은 GROUP BY 레코드를 적용 WHERE에 적용하여 필터링 할 수 없습니다.
"HAVING은 WHERE 절과 동일하지만, 그룹화 기록에 적용됩니다."
먼저 WHERE 절 조건에 기초하여 레코드를 인출 한 후이를 따라 다음 HAVING 절가 가지는 조건에 따라 상기 그룹 레코드 페치 절 단체 그룹입니다.
-
==============================
4.출처
출처
-
==============================
5.한 쿼리에서 두의 예를 보지 못했다. 이 예는 도움이 될 수 있도록.
한 쿼리에서 두의 예를 보지 못했다. 이 예는 도움이 될 수 있도록.
/** 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
이것은 다음의 회사 ID에 의해 첫 번째 (국가 및 도시 별) 그룹을 테이블을 필터링하고 추가로 멕시코의 단지 도시의 집계에 내려 필터링합니다. 회사 ID는 집계에 필요하지만 우리는 우리가 GROUP BY를 사용하기 전에 원하던 행을 필터링하는 WHERE를 사용 할 수 있었다되지 않았습니다.
-
==============================
6.조건에 근거하여 기록을 가져 오는 경우 때문에 집계 함수와 where 절을 사용할 수 없습니다, 그것은 기록에서 테이블 레코드로 전환 한 후 우리가주고있는 조건에 근거하여 기록을 가져옵니다. 그 때 우리는 절하지 곳에 있습니다. 우리가 마지막으로 쿼리를 실행 한 후 얻을 결과 집합에 절 일을하면서.
조건에 근거하여 기록을 가져 오는 경우 때문에 집계 함수와 where 절을 사용할 수 없습니다, 그것은 기록에서 테이블 레코드로 전환 한 후 우리가주고있는 조건에 근거하여 기록을 가져옵니다. 그 때 우리는 절하지 곳에 있습니다. 우리가 마지막으로 쿼리를 실행 한 후 얻을 결과 집합에 절 일을하면서.
예 쿼리 :
select empName, sum(Bonus) from employees order by empName having sum(Bonus) > 5000;
이것은 다음 절은 작업을 수행 할 필요, 임시 메모리에 결과 집합을 저장합니다. 그래서 우리는 쉽게 여기에 집계 함수를 사용할 수 있습니다.
-
==============================
7.1. 우리는하지 않음으로써 HAVING 절에 집계 함수를 사용할 수 있습니다 WHERE 절 예를 들어, 최소, 최대, 평균.
1. 우리는하지 않음으로써 HAVING 절에 집계 함수를 사용할 수 있습니다 WHERE 절 예를 들어, 최소, 최대, 평균.
2. 절은 튜플에 의해 기록 튜플을 제거 WHERE HAVING 절은 그룹의 컬렉션에서 전체 그룹을 제거
대부분은 데이터의 그룹이 때 사용되는 경우는 행의 데이터가있을 때 사용된다 HAVING.
from https://stackoverflow.com/questions/9253244/sql-having-vs-where by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 당신은 MySQL의에서 WHERE 절에 별칭을 사용할 수 있습니까? (0) | 2020.03.10 |
---|---|
[SQL] PostgreSQL을 GROUP_CONCAT 동등한? (0) | 2020.03.10 |
[SQL] 절 단락 평가 된 SQL인가? (0) | 2020.03.10 |
[SQL] ()는 SQL IN의 값의 순서에 의해 절을 주문 (0) | 2020.03.10 |
[SQL] IN 성능 대 MYSQL OR (0) | 2020.03.10 |