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
|