어디에 vs HAVING
당신이 장소 컬럼에 필요합니까 왜 당신은 자신 (예를 들어 작성 select 1 as "number"
) 후 HAVING
가 아니라 WHERE
MySQL은을?
그리고 WHERE 1
대신 열 이름 대신 전체 정의를 작성하는 대신 단점이 있습니까?
MySQL에서 WHERE가 아닌 HAVING 후에 직접 생성 한 열 (예 : "1을 숫자로 선택")을 배치해야하는 이유는 무엇입니까?
WHERE
이전 GROUP BY
에 HAVING
적용되고 이후에 적용되며 집계를 필터링 할 수 있습니다.
일반적으로,이 조항의도에 별칭을 참조 할 수 있지만, MySQL
참조 허용 SELECT
에 수준의 별칭을 GROUP BY
, ORDER BY
그리고 HAVING
.
"WHERE 1"(열 이름 대신 전체 정의 작성)을 수행하는 대신 단점이 있습니까?
계산 된 식에 집계가 포함되어 있지 않으면 WHERE
절에 넣는 것이 가장 효율적일 것입니다.
에 대한 모든 답변이 핵심 사항에 부딪치지 않았습니다.
테이블이 있다고 가정하십시오.
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- 'where 절'의 알 수없는 열 'v'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
WHERE 절은 조건이 테이블 컬럼을 사용하도록 허용하지만 별명 또는 집계 함수를 사용할 수 없습니다. HAVING 절을 사용하면 조건이 선택된 (!) 열, 별명 또는 집계 함수를 사용할 수 있습니다.
WHERE 절은 select 전에 데이터를 필터링하지만 HAVING 절은 select 후 결과 데이터를 필터링하기 때문입니다.
따라서 테이블에 많은 행이있는 경우 WHERE 절에 조건을 배치하는 것이 더 효율적입니다.
주요 차이점을 보려면 EXPLAIN을 시도하십시오.
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에서 index를 사용하지만 행이 다릅니다.
주요 차이점은이 WHERE
(예를 들면 분류 품목에 사용될 수 SUM(number)
있는 반면) HAVING
캔.
그 이유는 그룹화 전에WHERE
수행 되고 그룹화 가 완료된 후에 수행 되기 때문입니다 .HAVING
HAVING
에서 집계를 필터링하는 데 사용됩니다 GROUP BY
.
예를 들어, 중복 이름을 확인하려면 다음을 수행하십시오.
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
이 2는 데이터를 필터링하는 조건에 대해 말하는 데 처음 사용되는 것과 동일하게 느껴집니다. 어쨌든 'where'대신 'having'을 사용할 수 있지만 'having'대신 'where'를 사용할 수없는 경우가 있습니다. 선택 쿼리에서 'where'는 'select'이전에 데이터를 필터링하고 'select'이후에 필터링 데이터를 '사용'하기 때문입니다. 따라서 실제로 데이터베이스에없는 별칭 이름을 사용할 때 'where'는 별칭을 식별 할 수 없지만 'having'은 식별 할 수 있습니다.
예 : Student 테이블에 student_id, name, birthday, address를 포함 시키십시오. birthday가 날짜 유형이라고 가정하십시오.
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.*/
WHERE 는 데이터를 그룹화하기 전에 필터링하고 HAVING 은 데이터를 그룹화 한 후 필터링합니다. 이것은 중요한 차이점입니다. WHERE 절로 제거 된 행 은 그룹에 포함되지 않습니다. 이는 계산 된 값을 변경하여 HAVING 절 에서 해당 값의 사용에 따라 필터링되는 그룹에 영향을 줄 수 있습니다.
발췌 : Forta, Ben. “샘은 10 분 (4 판)에 SQL을 가르친다 (Sams Teach Yourself ...).”.
갖는 것은 집계에만 사용되지만 집계가 아닌 문장과 함께 사용됩니다.
참고 URL : https://stackoverflow.com/questions/2905292/where-vs-having
'Programing' 카테고리의 다른 글
CSS에서 첫 번째 문자를 대문자로 만듭니다. (0) | 2020.04.11 |
---|---|
base64로 인코딩 된 문자열을 어떻게 디코딩합니까? (0) | 2020.04.11 |
이미지 아래의 공백 제거 (0) | 2020.04.11 |
여러 단계 항목에 대한 자식에서 치명적인 오류가 발생합니다. (0) | 2020.04.11 |
matplotlib 플롯에서 xticks를 제거 하시겠습니까? (0) | 2020.04.11 |