복붙노트

[SQL] WHERE HAVING 대

SQL

WHERE HAVING 대

WHERE MySQL은 당신이 장소 컬럼에 필요합니까 왜 직접 만든 한 후 (예를 들어, "번호"로 하나를 선택)하지?

그리고 대신 일을 거기에 어떤 단점은 WHERE 1 (열 이름 대신 전체 정의를 작성)?

해결법

  1. ==============================

    1.GROUP BY 전에 적용되는 경우, 이후에 적용되는 HAVING (집계 필터링 할 수 있습니다).

    GROUP BY 전에 적용되는 경우, 이후에 적용되는 HAVING (집계 필터링 할 수 있습니다).

    일반적으로,이 조항의도에 별칭을 참조 할 수 있지만, MySQL은 GROUP BY, ORDER BY에 SELECT 수준의 별칭을 참조하고 HAVING 수 있습니다.

    계산 된 표현 절은 대부분의 아마 더 효율적입니다 곳으로 퍼팅, 모든 집계를 포함하지 않는 경우.

  2. ==============================

    2.이 질문에 다른 모든 답변은 키 점에 명중하지 않았다.

    이 질문에 다른 모든 답변은 키 점에 명중하지 않았다.

    우리는 테이블이 있다고 가정 :

    CREATE TABLE `table` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `value` int(10) unsigned NOT NULL,
     PRIMARY KEY (`id`),
     KEY `value` (`value`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    

    그리고 1 ~ 10에서 모두 ID와 값을 10 개 행이 :

    INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);
    

    다음이 쿼리를보십시오 :

    SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
    SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
    

    당신은 정확히 같은 결과를 얻을 것이다, 당신은 HAVING 절은 GROUP BY 절없이 작업 할 수 있습니다 볼 수 있습니다.

    여기의 차이는 다음과 같습니다

    SELECT `value` v FROM `table` WHERE `v`>5;
    

    오류 # 1054 - 알 수없는 열에서 'V' 'where 절'

    SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
    

    절은 허용 WHERE 조건은 테이블 열을 사용하지만, 별칭 또는 집계 함수를 사용할 수 없습니다. HAVING 절은 상태가 선택 (!) 열, 별칭 또는 집계 함수를 사용할 수 있습니다.

    절은 필터 WHERE 데이터 이전을 선택하기 때문이다, 그러나 HAVING 절 필터를 선택 후 데이터를 결과.

    그래서 테이블의 많은 많은 행이있을 경우 절 더 효율적입니다 WHERE의 조건을 넣어.

    키 차이를 볼 수에게 설명하십시오 :

    EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
    +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
    | id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra                    |
    +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
    |  1 | SIMPLE      | table | range | value         | value | 4       | NULL |    5 | Using where; Using index |
    +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
    
    EXPLAIN SELECT `value` v FROM `table` having `value`>5;
    +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
    | id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra       |
    +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
    |  1 | SIMPLE      | table | index | NULL          | value | 4       | NULL |   10 | Using index |
    +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
    

    당신도 WHERE 또는 HAVING 사용하는 인덱스를 볼 수 있지만 행이 다릅니다.

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

    3.주요 차이는 (예컨대) SUM (번호)를 갖는 반면, 캔 분류 항목에 사용할 수없는 경우.

    주요 차이는 (예컨대) SUM (번호)를 갖는 반면, 캔 분류 항목에 사용할 수없는 경우.

    그 이유는 그룹 전에 완료하고 그룹화가 완료 후에 완료됩니다 HAVING 곳입니다.

  4. ==============================

    4.HAVING은 당신의 GROUP BY의 집계에 필터에 사용됩니다.

    HAVING은 당신의 GROUP BY의 집계에 필터에 사용됩니다.

    예를 들어, 중복 된 이름을 확인합니다 :

    SELECT Name FROM Usernames
    GROUP BY Name
    HAVING COUNT(*) > 1
    
  5. ==============================

    5.모두 같은 제 필터가 데이터 상태에 대해 말을 사용하는 이들 2 같은 느낌한다. 우리가 사용할 수 있지만 우리는 대신 '필요'의 '어디'를 사용 할 수 없을 때 '어디'어떤 경우에도 인스턴스가있는 대신에 '필요'. '선택'후 필터 데이터를 '데'동안 전에 데이터를 필터링 '을 선택 쿼리에서'선택 '때문이다. 그래서, 우리는 그들을 식별 할 수 있지만 '필요' ''데이터베이스, 실제로하지 않은 별명을 사용하는 경우.

    모두 같은 제 필터가 데이터 상태에 대해 말을 사용하는 이들 2 같은 느낌한다. 우리가 사용할 수 있지만 우리는 대신 '필요'의 '어디'를 사용 할 수 없을 때 '어디'어떤 경우에도 인스턴스가있는 대신에 '필요'. '선택'후 필터 데이터를 '데'동안 전에 데이터를 필터링 '을 선택 쿼리에서'선택 '때문이다. 그래서, 우리는 그들을 식별 할 수 있지만 '필요' ''데이터베이스, 실제로하지 않은 별명을 사용하는 경우.

    예는 학생이 student_id, 이름, 생일이 포함 된 테이블을하자, address.Assume 생일 타입 일이다.

    SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/
    
    SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20; 
    /*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/
    
  6. ==============================

    6.그리고, 계속

    그리고, 계속

    발췌에서 :  Forta, 벤. "출판사 Sams (10 분에서 SQL 5 일 자신을 가르쳐  판) (Sams에가 ... 자신을 가르쳐). ".

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

    7.유일한 비 집계 문으로 집계하지만 경우에 사용하는 데 당신이있는 경우 단어가 집계되기 전에 넣어 (그룹화)

    유일한 비 집계 문으로 집계하지만 경우에 사용하는 데 당신이있는 경우 단어가 집계되기 전에 넣어 (그룹화)

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