#mysql #sql #sql-update #case #heidisql
#mysql #sql #sql-обновление #случай #heidisql
Вопрос:
Я новичок в MySQL, и в настоящее время я пытаюсь научиться работать с ним более эффективно. В этом случае у меня есть база данных, в которой указаны доходы людей, и я хочу создать новый столбец income_level
с указанием низкого, среднего или высокого дохода в зависимости от дохода. Я сделал это в четырех запросах, но я уверен, что это можно было бы сделать более эффективно? Может кто-нибудь дать мне советы по этому поводу? Спасибо!
Вот мои запросы до сих пор:
ALTER TABLE Chile
ADD COLUMN `income_level` VARCHAR(50) NULL DEFAULT NULL AFTER `income`;
UPDATE Chile SET income_level = "Low income"
WHERE income < 10000;
UPDATE Chile SET income_level = "Middle income"
WHERE income > 10000;
UPDATE Chile SET income_level = "High income"
WHERE income > 100000;
Комментарии:
1. Обычно вы не храните производные данные
2. Просто из любопытства: есть ли у вас одна таблица для каждой страны, как
Chile
предлагается?3. @Filburt, да, это правильно. Но наборы данных, которые я использую, предназначены исключительно для практики и не содержат точных и / или реальных данных.
4. @coderfrombiz Если вы знаете о последствиях, это, конечно, хорошо — однако это может помочь добавить этот контекст (подготовка неструктурированных данных для анализа) к вашему вопросу, поскольку вы можете видеть, что ответы и комментарии имеют тенденцию «Но вы делаете это неправильно!» , что вызвано некоторымиказалось бы, плохие проектные решения для СУБД.
Ответ №1:
Решение GMB на 100% правильное, но я бы все равно так не поступил. Вам не нужен дополнительный столбец income_level, потому что вы можете динамически выбирать его. Таким образом, вы также избежите необходимости обновления избыточного столбца, когда определение уровней дохода изменяется, например, из-за инфляции или других причин.
Итак, в этом году ваш запрос может быть таким:
SELECT CASE WHEN income > 100000 THEN 'High income'
WHEN income > 10000 THEN 'Middle income'
ELSE 'Low income'
END AS income_level
FROM chile
Через пять лет это может выглядеть так:
SELECT CASE WHEN income > 150000 THEN 'High income'
WHEN income > 15000 THEN 'Middle income'
ELSE 'Low income'
END AS income_level
FROM chile
ОБНОВЛЕНИЕ: если доход может быть нулевым, и вы не хотите считать это «низким доходом», вы можете сделать это:
SELECT CASE WHEN income IS NULL THEN 'Unknown income level'
WHEN income > 100000 THEN 'High income'
WHEN income > 10000 THEN 'Middle income'
ELSE 'Low income'
END AS income_level
FROM chile
Ответ №2:
Используйте case
выражение:
update chile
set income_level = case
when income > 100000 then 'High income'
when income > 10000 then 'Middle income'
else 'Low income'
end
Если income
это возможно null
, и вы не хотите обновлять соответствующие строки, вы можете добавить where
предложение к запросу.
Ответ №3:
На самом деле, хотя ответ GMB правильный, я довольно сильно не согласен с rf1234. Вы не хотите реализовывать эту логику в SELECT
запросах, потому что логика распространяется на слишком большой объем кода. Вы могли бы использовать представление, но есть лучшее решение.
На мой взгляд, лучшим подходом для вычисления income_level
является использование сгенерированного столбца:
alter table chile
add income_level varchar(255) generated always as
(case when income > 100000 then 'High income'
when income > 10000 then 'Middle income'
else 'Low income'
end);
Почему это улучшение? Столбцы income_level
и income
всегда синхронизированы, потому income_level
что вычисляется при его извлечении. Итак, если вы добавляете новые строки или обновляете существующие строки, значение автоматически изменяется.