programing

장소와 보유 장소

randomtip 2022. 10. 12. 21:30
반응형

장소와 보유 장소

입니까(예: " " " 등).select 1 as "number")의 설명HAVING andWHEREMySQL 서 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

수 있을 예요. .HAVINGGROUP 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

반응형