SELECT Продукт, ((Белки+Углев)*4.1+Жиры*9.3) FROM Продукты; результат которого приведен на рис. 2.3,а. |а) | |Б) | | |в) | |Продукт | |Продукт | | |Продукт | | |Говядина|1928.1 |Говядина|Калорий |1928.1 |Зелень |118.9 | | | | |= | | | | |Судак |1523. |Судак |Калорий |1523. |Помидоры|196.8 | | | | |= | | | | |Масло |8287.5 |Масло |Калорий |8287.5 |Морковь |349.6 | | | | |= | | | | |Майонез |6464.7 |Майонез |Калорий |6464.7 |Лук |459.2 | | | | |= | | | | |Яйца |1618.9 |Яйца |Калорий |1618.9 |Яблоки |479.7 | | | | |= | | | | |Сметана |3011.4 |Сметана |Калорий |3011.4 |Молоко |605.1 | | | | |= | | | | |Молоко |605.1 |Молоко |Калорий |605.1 |Кофе |892.4 | | | | |= | | | | |Творог |1575. |Творог |Калорий |1575. |Судак |1523. | | | | |= | | | | |Морковь |349.6 |Морковь |Калорий |349.6 |Творог |1575. | | | | |= | | | | |Лук |459.2 |Лук |Калорий |459.2 |Яйца |1618.9 | | | | |= | | | | |Помидоры|196.8 |Помидоры|Калорий |196.8 |Говядина|1928.1 | | | | |= | | | | |Зелень |118.9 |Зелень |Калорий |118.9 |Сметана |3011.4 | | | | |= | | | | |Рис |3512.1 |Рис |Калорий |3512.1 |Рис |3512.1 | | | | |= | | | | |Мука |3556.7 |Мука |Калорий |3556.7 |Мука |3556.7 | | | | |= | | | | |Яблоки |479.7 |Яблоки |Калорий |479.7 |Сахар |4091.8 | | | | |= | | | | |Сахар |4091.8 |Сахар |Калорий |4091.8 |Майонез |6464.7 | | | | |= | | | | |Кофе |892.4 |Кофе |Калорий |892.4 |Масло |8287.5 | | | | |= | | | |
Рисунок 2.3
Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы ('). На рис. 2.3,б приведен результат запроса:
SELECT Продукт, 'Калорий =', ((Белки+Углев)*4.1+Жиры *9.3) FROM Продукты;
А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение?
Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле NULL-значение. NULL-значение «придумано» для того, чтобы представить единым образом «неизвестные значения» для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное – в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием –0-.
С помощью специальной команды можно установить в СУБД один из режимов представления NULL-значений при выполнении числовых расчетов: запрет или разрешение замены NULL-значения нулем. В первом случае любое арифметическое выражение, содержащее неопределенный операнд, будет также иметь неопределенное значение. Во втором случае результат вычислений будет иметь численное значение (если это значение попадает в диапазон представления соответствующего типа данных). Например, при выполнении запроса
SELECT ПР, Цена, К_во, (Цена * К_во) FROM Поставки; и разных «настройках» СУБД могут быть получены разные результаты: |ПР|Цена |К_во |(Цена*К_во) |ПР|Цена |К_во |(Цена*К_во) | |9 |-0- |-0- |-0- |9 |-0- |-0- |0. | |11|1.5 |50 |75. |11|1.5 |50 |75. | |12|3. |10 |30. |12|3. |10 |30. | |15|2. |170 |340. |15|2. |170 |340. |
Использование BETWEEN
С помощью BETWEEN … AND … (находится в интервале от … до …) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.
Например, выдать перечень продуктов, в которых значение содержания белка находится в диапазоне от 10 до 50: | |Результат: | | | | | | |SELECT Продукт, | | | |Белки | | | |FROM Продукты | | | |WHERE Белки | | | |BETWEEN 10 AND | | | |50; | | | | |Продукт |Белки | | |Майонез |31. | | |Сметана |26. | | |Молоко |28. | | |Морковь |13. | | |Лук |17. |
Можно задать и NOT BETWEEN (не принадлежит диапазону между), например: | |Результа| | | |т: | | | | | | |SELECT Продукт, | | | |Белки, Жиры | | | |FROM Продукты | | | |WHERE Белки NOT | | | |BETWEEN 10 AND 50| | | | | | | |AND Жиры 100; | | | | |Продукт |Белки |Жиры | | |Говядина|189. |124. | | |Масло |60. |825. | |Яйца |127. |115. | |
BETWEEN особенно удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.
Для примера воспользуемся таблицей «минимальных окладов» (табл. 2.4), величина которых непосредственно связана со студенческой стипендией. В этой таблице для текущего значения минимального оклада установлена запредельная дата окончания 9 сентября 9999 года.
|Миноклад |Начало |Конец | |2250 |01-01-1993 |31-03-1993 | |4275 |01-04-1993 |30-06-1993 | |7740 |01-07-1993 |30-11-1993 | |14620 |01-12-1993 |30-06-1994 | |20500 |01-07-1994 |09-09-9999 |
Рисунок 2.4
Если, например, потребовалось узнать, какие изменения минимальных окладов производились в 1993/94 учебном году, то можно выдать запрос
SELECT Начало, Миноклад FROM Миноклады WHERE Начало BETWEEN '1-9-1993' AND '31-8-1994' и получить результат: |Начало |Миноклад | |01-12-1993 |14620 | |01-07-1994 |20500 |
Отметим, что при формировании запросов значения дат следует заключать в апострофы, чтобы СУБД не путала их с выражениями и не пыталась вычитать из 31 значение 8, а затем 1994.
Для выявления всех значений минимальных окладов, которые существовали в 1993/94 учебном году, можно сформировать запрос
SELECT * FROM Миноклады WHERE Начало BETWEEN '1-9-1993' AND '31-8-1994' OR Конец BETWEEN '1-9-1993' AND '31-8-1994' |Миноклад |Начало |Конец | |7740 |01/07/1993|30/11/1993 | |14620 |01/12/1993|30/06/1994 | |20500 |01/07/1994|09/09/9999 |
Наконец, для получения минимального оклада на 15-5-1994: | |Результат: | | | |Миноклад | |SELECT Миноклад | | |FROM Миноклады | | |WHERE '15-05-1994' | | |BETWEEN Начало AND | | |Конец | | | |14620 |
Использование IN
Выдать сведения о блюдах на основе яиц, крупы и овощей
SELECT * FROM Блюда WHERE Основа IN (Яйца Крупа Овощи); Результат: |БЛ|Блюдо |В|Основа |Выход |Труд | |1 |Салат летний |З|Овощи |200. |3 | |3 |Салат витаминный |З|Овощи |200. |4 | |16|Драчена |Г|Яйца |180. |4 | |17|Морковь с рисом |Г|Овощи |260. |3 | |19|Омлет с луком |Г|Яйца |200. |5 | |20|Каша рисовая |Г|Крупа |210. |4 | |21|Пудинг рисовый |Г|Крупа |160. |6 | |23|Помидоры с луком |Г|Овощи |260. |4 |
Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR. Предыдущее предложение эквивалентно такому:
SELECT * FROM Блюда WHERE Основа=Яйца OR Основа=Крупа OR Основа=Овощи;
Использование LIKE Выдать перечень салатов | |Результат: | | | |Блюдо | |SELECT Блюдо | | |FROM Блюда | | |WHERE Блюдо LIKE | | |'Салат%'; | | | |Салат летний | | |Салат мясной | | |Салат витаминный | | |Салат рыбный |
Обычная форма «имя_столбца LIKE текстовая_константа» для столбца текстового типа позволяет отыскать все значения указанного столбца, соответствующие образцу, заданному «текстовой_константой». Символы этой константы интерпретируются следующим образом: символ _ (подчеркивание) – заменяет любой одиночный символ, символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем), все другие символы означают просто сами себя.
Следовательно, в приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием 'Салат' и содержит любую последовательность из нуля или более символов, следующих за сочетанием 'Салат'. Если бы среди блюд были «Луковый салат», «Фруктовый салат» и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:
WHERE Блюдо LIKE '%салат%' или при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД):
WHERE Блюдо LIKE '%Салат%' Это позволит отыскать все салаты.
Вовлечение неопределенного значения (NULL-значения)
Если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Так, при отсутствии сведений о наличии у поставщиков судака и моркови в столбцы Цена и К_во соответствующих строк таблицы Поставки вводится NULL и там будет храниться код NULL-значения, а не 0, 0. Или пробел. (Отметим, что в распечатке таблицы Поставки в этих местах расположен пробел, установленный в СУБД для представления NULL-значения при выводе на печать). В этом случае для выявления названий продуктов, отсутствующих в кладовой, шеф-повар может дать запрос |Результат: |ПР | |S| |2 | |E| |9 | |L| | | |E| | | |C| | | |T| | | |D| | | |I| | | |S| | | |T| | | |I| | | |N| | | |C| | | |T| | | |П| | | |Р| | | | | | | |F| | | |R| | | |O| | | |M| | | |Н| | | |а| | | |л| | | |и| | | |ч| | | |и| | | |е| | | | | | | |W| | | |H| | | |E| | | |R| | | |E| | | |К| | | |_| | | |в| | | |о| | | |I| | | |S| | | |N| | | |U| | | |L| | | |L| | | |;| | |
Естественно, что для выявления продуктов, существующих в кладовой, следует дать запрос
SELECT DISTINCT ПР FROM Наличие WHERE К_во IS NOT NULL; Использование условий
столбец IS NULL и столбец IS NOT NULL вместо, например,
столбец = NULL и столбец < NULL связано с тем, что ничто – и даже само NULL-значение – не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного NULL-значения.)
Страницы: 1, 2, 3, 4, 5, 6, 7