Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Фраза SELECT может содержать не только перечень столбцов таблицы или символ *, но и выражения, общая структура которых была приведена на рис. 2.1,а.

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

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

FROM Продукты;

 

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

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

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

FROM Продукты;

+-------------------------------------------------------------------+

¦а) б) в) ¦

¦ Продукт Продукт Продукт ¦

¦ -------- ------ -------- --------- ------ -------- ------ ¦

¦ Говядина 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.5. Примеры запросов с вычисляемыми полями

 

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

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

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

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

SEL ПР, Цена, К_во, (Цена * К_во) 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.

10. запросы с использованием нескольких таблиц.

О средствах одновременной работы с множеством таблиц

 

Затрагивая вопросы проектирования баз данных [2], мы выяснили, что базы данных - это множество взаимосвязанных сущностей или отношений (таблиц) в терминологии реляционных СУБД. При проектировании стремятся создавать таблицы, в каждой из которых содержалась бы информация об одном и только об одном типе сущностей. Это облегчает модификацию базы данных и поддержание ее целостности. Но такой подход тяжело усваивается начинающими проектантами, которые пытаются привязать проект к будущим приложениям и так организовать таблицы, чтобы в каждой из них хранилось все необходимое для реализации возможных запросов. Типичен вопрос: как же получить сведения о том, где купить продукты для приготовления того или иного блюда и определить его калорийность и стоимость, если нужные данные "рассыпаны" по семи различным таблицам? Не лучше ли иметь одну большую таблицу, содержащую все сведения базы данных ПАНСИОН?

 

Даже при отсутствии средств одновременного доступа ко многим таблицам нежелателен проект, в котором информация о многих типах сущностей перемешана в одной таблице. SQL же обладает великолепным механизмом для одновременной или последовательной обработки данных из нескольких взаимосвязанных таблиц. В нем реализованы возможности "соединять" или "объединять" несколько таблиц и так называемые "вложенные подзапросы". Например, чтобы получить перечень поставщиков продуктов, необходимых для приготовления Сырников, возможен запрос

SELECT Продукт, Цена, Название, Статус

FROM Продукты, Состав, Блюда, Поставки, Поставщики

WHERE Продукты.ПР = Состав.ПР

AND Состав.БЛ = Блюда.БЛ

AND Поставки.ПР = Состав.ПР

AND Поставки.ПС = Поставщики.ПС

AND Блюдо = 'Сырники'

AND Цена IS NOT NULL;Продукт Цена Название Статус

Яйца 1.8 ПОРТОС кооператив

Яйца 2. КОРЮШКА кооператив

Сметана 3.6 ПОРТОС кооператив

Сметана 2.2 ОГУРЕЧИК ферма

Творог 1. ОГУРЕЧИК ферма

Мука 0.5 УРОЖАЙ коопторг

Сахар 0.94 ТУЛЬСКИЙ универсам

Сахар 1. УРОЖАЙ коопторг

 

 

Он получен следующим образом: СУБД последовательно формирует строки декартова произведения таблиц, перечисленных во фразе FROM, проверяет, удовлетворяют ли данные сформированной строки условиям фразы WHERE, и если удовлетворяют, то включает в ответ на запрос те ее поля, которые перечислены во фразе SELECT.

 

Следует подчеркнуть, что в SELECT и WHERE (во избежание двусмысленности) ссылки на все (*) или отдельные столбцы могут (а иногда и должны) уточняться именем соответствующей таблицы, например, Поставки.ПС, Поставщики.ПС, Меню.*, Состав.БЛ, Блюда.* и т.п.

 

Очевидно, что с помощью соединения несложно сформировать запрос на обработку данных из нескольких таблиц. Кроме того, в такой запрос можно включить любые части предложения SELECT, рассмотренные в главе 2 (выражения с использованием функций, группирование с отбором указанных групп и упорядочением полученного результата). Следовательно, соединения позволяют обрабатывать множество взаимосвязанных таблиц как единую таблицу, в которой перемешана информация о многих типах сущностей. Поэтому начинающий проектант базы данных может спокойно создавать маленькие нормализованные таблицы, так как он всегда может получить из них любую "большую" таблицу.

 

Кроме механизма соединений в SQL есть механизм вложенных подзапросов, позволяющий объединить несколько простых запросов в едином предложении SELECT. Иными словами, вложенный подзапрос - это уже знакомый нам подзапрос (с небольшими огра-ничениями), который вложен в WHERE фразу другого вложенного подзапроса или WHERE фразу основного запроса.

 

Для иллюстрации вложенного подзапроса вернемся к предыдущему примеру и попробуем получить перечень тех поставщиков продуктов для Сырников, которые поставляют нужные продукты за минимальную цену.

SELECT Продукт, Цена, Название, Статус

FROM Продукты, Состав, Блюда, Поставки, Поставщики

WHERE Продукты.ПР = Состав.ПР

AND Состав.БЛ = Блюда.БЛ

AND Поставки.ПР = Состав.ПР

AND Поставки.ПС = Поставщики.ПС

AND Блюдо = 'Сырники'

AND Цена = (SELECT MIN(Цена)

FROM Поставки X

WHERE X.ПР = Поставки.ПР);

 

Результат запроса имеет видПродукт Цена Название Статус

Яйца 1.8 ПОРТОС кооператив

Сахар 0.94 ТУЛЬСКИЙ универсам

Мука 0.5 УРОЖАЙ коопторг

Сметана 2.2 ОГУРЕЧИК ферма

Творог 1. ОГУРЕЧИК ферма

 

 

Здесь с помощью подзапроса, размещенного в трех последних строках запроса, описывается процесс определения минимальной цены каждого продукта для Сырников и поиск поставщика, предлагающего этот продукт за такую цену. Механизм реализации подзапросов будет подробно описан в п.3.3. Там же будет рассмотрено, как и для чего вводится псевдоним X для имени таблицы Поставки.

11. SQL-функции. Фраза GROUP-BY.




Поделиться с друзьями:


Дата добавления: 2015-05-10; Просмотров: 1662; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.