장소와 보유 장소
입니까(예: " " " 등).select 1 as "number"
)의 설명HAVING
andWHERE
MySQL 서 my?
이 방법 요?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
id와 값이 모두 1~10인 행이 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
선택하기 를 필터링하지만, "선택하기 전에 ."HAVING
절은 선택 후 결과 데이터를 필터링합니다.
조건을 .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
을 사용하다
가장 큰 차이점은 이다.WHERE
된 항목: 그룹화된 항목)에서는 할 수 .SUM(number)
)의 개요HAVING
수 있어요.
는 ★★★★★★★★★★★★★★★★★★★.WHERE
그룹화 전에 이루어집니다.HAVING
그룹화가 완료된 후에 수행됩니다.
HAVING
는, 「어그리게이션」의 하기 합니다.GROUP BY
.
예를 들어 중복된 이름을 확인하려면:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
이 두 가지는 데이터를 필터링하는 조건을 나타내기 위해 모두 사용되므로 처음과 같은 느낌입니다.어떤 경우에도 where 대신 have를 사용할 수 있지만 have 대신 where를 사용할 수 없는 경우가 있습니다.그 이유는 선택 쿼리에서 'where'는 'select' 전에 데이터를 필터링하고 'select' 후에 데이터를 'have'하기 때문입니다.따라서 실제로 데이터베이스에 없는 별칭 이름을 사용할 경우 'where'는 식별할 수 없지만 'have'는 식별할 수 있습니다.
예: Student 테이블에 student_id, name, birthday, address를 입력합니다.생일이 날짜 유형이라고 가정합니다.
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 절의 값을 사용하여 필터링되는 그룹에 영향을 미칠 수 있습니다.
그리고 계속한다.
GROUP BY가 지정되지 않은 경우 대부분의 DBMS는 이들을 동일하게 취급할 수 있을 정도로 HIVING은 WHERE와 매우 유사합니다.그렇지만, 그 구별은 당신 자신이 해야 합니다.HAVING은 GROUP BY 절과 함께만 사용하십시오.표준 행 수준 필터링에는 WHERE를 사용합니다.
발췌: Forta, Ben. "Sams Teach Yourself SQL in 10 Minutes (5th Edition)" (Sams Teach Yourself...)" (Sams Teach Yourself...)
는 애그리게이션에만 사용되지만 비애그리게이션 스테이트먼트와 함께 사용됨 애그리게이션 전에 단어를 삽입할 수 있는 경우(그룹화 기준)
언급URL : https://stackoverflow.com/questions/2905292/where-vs-having
'programing' 카테고리의 다른 글
PHP 변수 보간 vs 연결 (0) | 2022.10.22 |
---|---|
MySQL 개선 문제(innodb_log_file_size) (0) | 2022.10.12 |
배열에서 가장 높은 값의 반환 색인 (0) | 2022.10.12 |
boto3에서 오류를 처리하는 방법 (0) | 2022.10.12 |
MySQL에서 생성된 컬럼 정의를 찾는 방법 (0) | 2022.10.12 |