MySQL, запутался во вложенном количестве

#mysql #sql

#mysql #sql

Вопрос:

Вот таблица:

  ------ -------- ------ -------- 
| sID  | sName  | GPA  | sizeHS |
 ------ -------- ------ -------- 
|  123 | Amy    |  3.9 |   1000 |
|  234 | Bob    |  3.6 |   1500 |
|  345 | Craig  |  3.5 |    500 |
|  456 | Doris  |  3.9 |   1000 |
|  567 | Edward |  2.9 |   2000 |
|  678 | Fay    |  3.8 |    200 |
|  789 | Gary   |  3.4 |    800 |
|  987 | Helen  |  3.7 |    800 |
|  876 | Irene  |  3.9 |    400 |
|  765 | Jay    |  2.9 |   1500 |
|  654 | Amy    |  3.9 |   1000 |
|  543 | Craig  |  3.4 |   2000 |
 ------ -------- ------ -------- 
 

Я не могу понять, какая логика стоит за этим запросом

 select *
from Student S1
where (select count(*) from Student S2
   where S2.sID <> S1.sID and S2.GPA = S1.GPA) =
  (select count(*) from Student S2
   where S2.sID <> S1.sID and S2.sizeHS = S1.sizeHS);
 

Это то, что возвращается:

  ------ -------- ------ -------- 
| sID  | sName  | GPA  | sizeHS |
 ------ -------- ------ -------- 
|  345 | Craig  |  3.5 |    500 |
|  567 | Edward |  2.9 |   2000 |
|  678 | Fay    |  3.8 |    200 |
|  789 | Gary   |  3.4 |    800 |
|  765 | Jay    |  2.9 |   1500 |
|  543 | Craig  |  3.4 |   2000 |
 ------ -------- ------ -------- 
 

Как count, команда агрегации, может равняться другой агрегации и возвращать таблицу, если она соответствует критериям where?

Ответ №1:

count(*) Запросы выполняются как взаимосвязанные подзапросы, и оба они возвращают одно скалярное значение (an integer ). Ваш основной запрос не имеет собственной агрегации.

Два count(*) запроса возвращают два числа, которые сравниваются друг с другом в where совершенно законном состоянии.

Запрос будет оцениваться примерно так:

 select *
from Student S1
where (<count of students with the same GPA as this student>) 
        =
      (<count of students with the same sizeHS as this student>);
 

И затем, например, если подсчеты для учащегося (одна запись в таблице) возвращаются как 5 и 6 , тогда where условие для этой записи будет оцениваться как:

 select *
from Student S1
where 5 
        =
      6;
 

Комментарии:

1. Отличное объяснение