복붙노트

[SQL] SQL은 - VS 어디를 가진

SQL

SQL은 - 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. ==============================

    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. ==============================

    2.HAVING은 집계에서 작동합니다. COUNT는 집계 함수이기 때문에, 당신은 WHERE 절에 사용할 수 없습니다.

    HAVING은 집계에서 작동합니다. COUNT는 집계 함수이기 때문에, 당신은 WHERE 절에 사용할 수 없습니다.

    여기에 집계 함수에 대한 MSDN에서 일부 독서입니다.

  3. ==============================

    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. ==============================

    4.출처

    출처

  5. ==============================

    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. ==============================

    6.조건에 근거하여 기록을 가져 오는 경우 때문에 집계 함수와 where 절을 사용할 수 없습니다, 그것은 기록에서 테이블 레코드로 전환 한 후 우리가주고있는 조건에 근거하여 기록을 가져옵니다. 그 때 우리는 절하지 곳에 있습니다. 우리가 마지막으로 쿼리를 실행 한 후 얻을 결과 집합에 절 일을하면서.

    조건에 근거하여 기록을 가져 오는 경우 때문에 집계 함수와 where 절을 사용할 수 없습니다, 그것은 기록에서 테이블 레코드로 전환 한 후 우리가주고있는 조건에 근거하여 기록을 가져옵니다. 그 때 우리는 절하지 곳에 있습니다. 우리가 마지막으로 쿼리를 실행 한 후 얻을 결과 집합에 절 일을하면서.

    예 쿼리 :

    select empName, sum(Bonus) 
    from employees 
    order by empName 
    having sum(Bonus) > 5000;
    

    이것은 다음 절은 작업을 수행 할 필요, 임시 메모리에 결과 집합을 저장합니다. 그래서 우리는 쉽게 여기에 집계 함수를 사용할 수 있습니다.

  7. ==============================

    7.1. 우리는하지 않음으로써 HAVING 절에 집계 함수를 사용할 수 있습니다 WHERE 절 예를 들어, 최소, 최대, 평균.

    1. 우리는하지 않음으로써 HAVING 절에 집계 함수를 사용할 수 있습니다 WHERE 절 예를 들어, 최소, 최대, 평균.

    2. 절은 튜플에 의해 기록 튜플을 제거 WHERE HAVING 절은 그룹의 컬렉션에서 전체 그룹을 제거

    대부분은 데이터의 그룹이 때 사용되는 경우는 행의 데이터가있을 때 사용된다 HAVING.

  8. from https://stackoverflow.com/questions/9253244/sql-having-vs-where by cc-by-sa and MIT license