2.2.3. Выборка вычисляемых значений

Из синтаксиса фразы SELECT (п.2.1) видно, что в ней может содержаться не только перечень столбцов таблицы или символ *, но и выражения.

Например, если нужно получить значение калорийности всех продуктов, то можно учесть, что при окислении 1 г углеводов или белков в организме освобождается в среднем 4.1 ккал, а при окислении 1 г жиров - 9.3 ккал, и выдать запрос:

    SELECT	Продукт, ((Белки+Углев)*4.1+Жиры*9.3)
    FROM	Продукты;

результат которого приведен на рис. 2.2,а.

а) | б) | в)
Продукт |
--- | ---
Говядина | 1928.1
Судак | 1523.
Масло | 8287.5
Майонез | 6464.7
Яйца | 1618.9
Сметана | 3011.4
Молоко | 605.1
Творог | 1575.
Морковь | 349.6
Лук | 459.2
Помидоры | 196.8
Зелень | 118.9
Рис | 3512.1
Мука | 3556.7
Яблоки | 479.7
Сахар | 4091.8
Кофе | 892.4
Продукт |
--- | ---
Говядина | Калорий = | 1928.1
Судак | Калорий = | 1523.
Масло | Калорий = | 8287.5
Майонез | Калорий = | 6464.7
Яйца | Калорий = | 1618.9
Сметана | Калорий = | 3011.4
Молоко | Калорий = | 605.1
Творог | Калорий = | 1575.
Морковь | Калорий = | 349.6
Лук | Калорий = | 459.2
Помидоры | Калорий = | 196.8
Зелень | Калорий = | 118.9
Рис | Калорий = | 3512.1
Мука | Калорий = | 3556.7
Яблоки | Калорий = | 479.7
Сахар | Калорий = | 4091.8
Кофе | Калорий = | 892.4
Продукт |
--- | ---
Зелень | 118.9
Помидоры | 196.8
Морковь | 349.6
Лук | 459.2
Яблоки | 479.7
Молоко | 605.1
Кофе | 892.4
Судак | 1523.
Творог | 1575.
Яйца | 1618.9
Говядина | 1928.1
Сметана | 3011.4
Рис | 3512.1
Мука | 3556.7
Сахар | 4091.8
Майонез | 6464.7
Масло | 8287.5

Рис. 2.2. Примеры запросов с вычисляемыми полями

Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы ('). На рис. 2.2,б приведен результат запроса:

     SELECT	Продукт, 'Калорий =',
                ((Белки+Углев)*4.1+Жиры *9.3)
      FROM		Продукты;

А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение?

Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле NULL-значение. NULL-значение "придумано" для того, чтобы представить единым образом "неизвестные значения" для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное - в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием -0-.

С помощью специальной команды можно установить в СУБД один из режимов представления NULL-значений при выполнении числовых расчетов: запрет или разрешение замены NULL-значения нулем. В первом случае любое арифметическое выражение, содержащее неопределенный операнд, будет также иметь неопределенное значение. Во втором случае результат вычислений будет иметь численное значение (если это значение попадает в диапазон представления соответствующего типа данных).

Например, при выполнении запроса

    SELECT	ПР, Цена, К_во, (Цена * К_во)
    FROM	Поставки;

и разных "настройках" СУБД могут быть получены разные результаты:

ПР | Цена | К_во | (Цена*К_во)
--- | --- | --- | ---
9 | -0- | -0- | -0-
11 | 1.5 | 50 | 75.
12 | 3. | 10 | 30.
15 | 2. | 170 | 340.
ПР | Цена | К_во | (Цена*К_во)
--- | --- | --- | ---
9 | -0- | -0- | 0.
11 | 1.5 | 50 | 75.
12 | 3. | 10 | 30.
15 | 2. | 170 | 340.

2.2.2 | Содержание | 2.3.1