[SQL] WHERE HAVING 대
SQLWHERE HAVING 대
WHERE MySQL은 당신이 장소 컬럼에 필요합니까 왜 직접 만든 한 후 (예를 들어, "번호"로 하나를 선택)하지?
그리고 대신 일을 거기에 어떤 단점은 WHERE 1 (열 이름 대신 전체 정의를 작성)?
해결법
-
==============================
1.GROUP BY 전에 적용되는 경우, 이후에 적용되는 HAVING (집계 필터링 할 수 있습니다).
GROUP BY 전에 적용되는 경우, 이후에 적용되는 HAVING (집계 필터링 할 수 있습니다).
일반적으로,이 조항의도에 별칭을 참조 할 수 있지만, MySQL은 GROUP BY, ORDER BY에 SELECT 수준의 별칭을 참조하고 HAVING 수 있습니다.
계산 된 표현 절은 대부분의 아마 더 효율적입니다 곳으로 퍼팅, 모든 집계를 포함하지 않는 경우.
-
==============================
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.주요 차이는 (예컨대) SUM (번호)를 갖는 반면, 캔 분류 항목에 사용할 수없는 경우.
주요 차이는 (예컨대) SUM (번호)를 갖는 반면, 캔 분류 항목에 사용할 수없는 경우.
그 이유는 그룹 전에 완료하고 그룹화가 완료 후에 완료됩니다 HAVING 곳입니다.
-
==============================
4.HAVING은 당신의 GROUP BY의 집계에 필터에 사용됩니다.
HAVING은 당신의 GROUP BY의 집계에 필터에 사용됩니다.
예를 들어, 중복 된 이름을 확인합니다 :
SELECT Name FROM Usernames GROUP BY Name HAVING COUNT(*) > 1
-
==============================
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.그리고, 계속
그리고, 계속
발췌에서 : Forta, 벤. "출판사 Sams (10 분에서 SQL 5 일 자신을 가르쳐 판) (Sams에가 ... 자신을 가르쳐). ".
-
==============================
7.유일한 비 집계 문으로 집계하지만 경우에 사용하는 데 당신이있는 경우 단어가 집계되기 전에 넣어 (그룹화)
유일한 비 집계 문으로 집계하지만 경우에 사용하는 데 당신이있는 경우 단어가 집계되기 전에 넣어 (그룹화)
from https://stackoverflow.com/questions/2905292/where-vs-having by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 코드에 비해 저장 프로세서 수에 SQL을 유지하는 장점과 단점은 무엇입니까 [마감] (0) | 2020.03.12 |
---|---|
[SQL] WHERE 절에 열 별칭을 참조 (0) | 2020.03.12 |
[SQL] 오라클 (? 테이블에 갱신 또는 삽입) 방법 UPSERT에 (0) | 2020.03.12 |
[SQL] 테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우 (0) | 2020.03.12 |
[SQL] 차이 사이의 가입 및 INNER는 가입 (0) | 2020.03.12 |