#mysql #sql
#mysql #sql
Вопрос:
Есть таблица ЗАРПЛАТ и таблица КОМПАНИИ.
Мне нужно вывести список названий компаний, средняя зарплата которых превышает 14000
Ожидайте результата. Список названий компаний
Baker Hughes Incorporated
...
Вот мой текущий запрос. Я хотел бы знать, есть ли более эффективный способ запросить это?
SELECT NAME FROM COMPANY WHERE ID in (
SELECT COMPANY_ID
FROM Salary S
GROUP BY COMPANY_ID Having AVG(Salary) >= 140000
)
Комментарии:
1. В
WHERE
предложении здесь есть хорошее обсуждение оптимизации такого рода подзапросов.
Ответ №1:
Я думаю, что самая простая форма запроса — это:
SELECT c.Name
FROM Company c JOIN
Salary s
ON s.COMPANY_ID = c.ID
GROUP BY c.Name, c.COMPANY_ID
HAVING AVG(s.Salary) >= 14000;
Я бы попробовал это, прежде чем пробовать другие формы. Я ожидал бы, что ответ Зайнула (используя EXISTS
) будет немного быстрее с правильными индексами, но иногда MySQL меня удивляет.
Ответ №2:
вы можете попробовать использовать коррелированный подзапрос и выполнить индексацию на ID
и COMPANY_ID
SELECT NAME FROM COMPANY c WHERE exists (
SELECT 1 COMPANY_ID
FROM Salary s where s.COMPANY_ID=c.ID
Having AVG(Salary) >= 140000
)
Комментарии:
1. Почему этот метод быстрее моего? Любой простой анализ или комментарий? большое спасибо
2. @newBike в случае возврата большого набора данных из подзапроса, выполняющего большое количество операций or из-за оператора IN, но индексация и exists улучшают план запроса по сравнению с in, поэтому я сказал вам попробовать этот