Простая оптимизация запросов
Эй, ребята, простите, если это слишком простой вопрос. Я в основном хочу подсчитать количество мужчин и женщин в базе данных. Поэтому я знаю, что два простых запроса выполнят это, например:
select count(*) from table where gender='male'
select count(*) from table where gender='female'
Тем не менее, это кажется очень неэффективным, так как я знаю, что оба запроса являются одинаковыми:
select count(*) from table where gender='female'
select count(*) from table where gender<>'male'
Есть ли оптимальный способ получения этой информации, без необходимости проходить каждую строку в базе данных дважды?
7 ответов
Вы также можете использовать GROUP BY:
SELECT gender, Count(1) as genderCount
FROM table
GROUP BY gender
Это приведет к чему-то вроде этого:
gender genderCount
Male 10
Female 15
select sum(case when gender='male' then 1 end) as MaleCount,
sum(case when gender='female' then 1 end) as FemaleCount
from table
Вы можете использовать группу по предложению.
select gender, count(gender) from table group by gender;
Да, вместо этого используйте оператор case.
SELECT
COUNT(CASE gender WHEN 'male' then 1 END) AS Males
COUNT(CASE gender WHEN 'female' then 1 END) AS Females
FROM table
Что ж, RedFilter и erwin atuli, вероятно, дали ответ на ваш вопрос, но если вас просто беспокоит производительность, то вы должны поместить индекс в столбец гендерного равенства, и производительность этих запросов должна быть хорошей, чтобы вы могли выполнить их несколько раз. раз.
Если вы используете oracle, то для индексации таких данных следует использовать Bitmap Index.
Многие базы данных кэшируют такие результаты агрегирования в любом случае.
@redfilter: если таблица не содержит записей, ваш запрос будет просто возвращать NULL-значения, а не 0 (как целое число)
(select count(*) from table where gender='male')
UNION
(select count(*) from table where gender='female')
первый ряд - мужчины, второй ряд - женщины...