#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. Отличное объяснение