У меня есть таблица emp
со следующей структурой и данными:
name dept salary
----- ----- -----
Jack a 2
Jill a 1
Tom b 2
Fred b 1
Когда я выполняю следующий SQL:
SELECT * FROM emp GROUP BY dept
Получаю следующий результат:
name dept salary
----- ----- -----
Jill a 1
Fred b 1
На каком основании сервер решил вернуть Джилл и Фреда и исключить Джека и Тома?
Я запускаю этот запрос в MySQL.
Примечание 1: Я знаю, что запрос не имеет смысла сам по себе. Я пытаюсь отладить проблему с сценарием "GROUP BY". Я пытаюсь понять поведение по умолчанию для этой цели.
Примечание 2: Я использую для написания предложения SELECT так же, как предложение GROUP BY (минус агрегированные поля). Когда я столкнулся с описанным выше поведением, я начал задаваться вопросом, могу ли я полагаться на это для сценариев, таких как: выберите строки из таблицы emp, где зарплата самая низкая/самая высокая в отделе. Например: SQL-запросы, подобные этому, работают на MySQL:
SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept
Я не нашел никакого материала, описывающего, почему такой SQL работает, что более важно, если я могу последовательно полагаться на такое поведение. Если это надежное поведение, я могу избежать таких запросов, как:
SELECT A.* FROM emp AS A WHERE A.salary = (
SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept)