Глава 2. Запросы с использованием единственной таблицы
2.1 О предложении SELECT
2.2 Выборка без использования фразы WHERE
2.3 Выборка c использованием фразы WHERE
2.4 Выборка с упорядочением
2.5 Агрегирование данных
Запрос выдать название, статус и адрес поставщиков
SELECT Название, Статус, Адрес
FROM Поставщики;
|
дает результат, приведенный на рис. 2.1,а.
При необходимости получения полной информации о поставщиках, можно было бы дать запрос
SELECT ПС, Название, Статус, Город, Адрес, Телефон
FROM Поставщики;
|
или использовать его более короткую нотацию:
SELECT *
FROM Поставщики;
|
Здесь "звездочка" (*) служит кратким обозначением всех имен полей в таблице, указанной во фразе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании таблицы.
Еще один пример. Выдать основу всех блюд:
SELECT Основа
FROM Блюда;
|
дает результат, показанный на рис. 2.1,б.
а) |
Название |
Статус |
Адрес |
СЫТНЫЙ |
рынок |
Сытнинская, 3 |
ПОРТОС |
кооператив |
Садовая, 27 |
ШУШАРЫ |
совхоз |
Новая, 17 |
ТУЛЬСКИЙ |
универсам |
Тульская, 3 |
УРОЖАЙ |
коопторг |
Песчаная, 19 |
ЛЕТО |
агрофирма |
Пулковское ш.,8 |
ОГУРЕЧИК |
ферма |
Укмерге, 15 |
КОРЮШКА |
кооператив |
Нарвское ш., 64 |
|
б) |
Основа |
Овощи |
Мясо |
Овощи |
Рыба |
Рыба |
Мясо |
Молоко |
Молоко |
... |
Кофе |
|
в) |
Основа |
Кофе |
Крупа |
Молоко |
Мясо |
Овощи |
Рыба |
Фрукты |
Яйца |
|
Рис. 2.1. Примеры простой выборки
В предыдущем примере был выдан правильный, но не совсем удачный перечень основных продуктов: из него не были исключены дубликаты. Для исключения дубликатов и одновременного упорядочения перечня необходимо дополнить запрос ключевым словом DISTINCT (различный, различные), как показано в следующем примере:
SELECT DISTINCT Основа
FROM Блюда;
|
Результат приведен на рис. 2.1,в.
Из синтаксиса фразы 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. |
|
|