Выражения
В соответствии со стандартом ANSI/ISO (SQL1) в выражениях можно использовать четыре арифметические операции: сложение (X+Y), вычитание (X-Y), умножение (X*Y) и деление (X/Y). Для формирования сложных выражений можно использовать круглые скобки.
Преобразование целых чисел в масштабируемые десятичные числа и десятичных чисел в числа с плавающей запятой согласно стандарту должно происходить автоматически. Таким образом, в одном числовом выражении можно использовать числовые данные разных типов.
Отсутствующие, неподходящие или неизвестные данные
Поскольку БД является моделью реального мира, то отдельные элементы данных в ней в какой-то конкретный момент времени будут либо отсутствовать, либо не подходить для характеристики объекта, либо иметь неизвестные значения. Такое значение в SQL обозначается величиной NULL. Например, в столбце SUMD таблицы PERSON содержатся величины общих доходов для каждого жителя. Для нового жителя, который только что зарегистрирован, общий доход неизвестен, поэтому для него в качестве значения в столбце SUMD следует поставить значение NULL.
Правила записи оператора select
Язык SQL предназначен в первую очередь для выполнения запросов. Для построения SQL - запросов, задающих выборку данных, используется оператор SELECT, который является наиболее функциональным, мощным из всех операторов SQL.
Оператор SELECT читает данные из БД и возвращает их в виде таблицы результатов запроса (рис. 3).
Рис. 3. Выполнение SQL - запроса на чтение
Оператор SELECT состоит из шести предложений, или фраз (рис. 4). Предложения SELECT и FROM являются обязательными. Четыре остальные включаются в оператор по мере необходимости. Функции каждого из предложений следующие:
1) в предложении SELECT указывается список возвращаемых столбцов, которые должны быть включены в таблицу результатов запроса. Возвращаемые столбцы могут содержать значения, считываемые из столбов таблиц базы данных, или значения, вычисляемые во время выполнения запроса;
2) в предложении FROM указывается список таблиц, которые содержат элементы данных, считываемые запросом;
3) предложение WHERE показывает, что в таблицу результатов запроса следует включать только строки, удовлетворяющие условию поиска;
4) предложение GROUP BY позволяет задавать итоговый запрос. Обычный запрос включает в таблицу результатов по одной строке для каждой строки из БД. Итоговый запрос вначале группирует строки БД по определенному признаку, а затем включает в таблицу результатов одну итоговую строку для каждой группы;
5) предложение HAVING показывает, что в таблицу результатов запроса следует включать только некоторые из групп, созданных с помощью предложения GROUP BY. Для отбора включаемых групп используется условие поиска;
6) предложение ORDER BY сортирует таблицу результатов запроса на основании данных, содержащихся в одном или нескольких столбцах.
В предложении SELECT, с которого начинаются все операторы SELECT, в списке возвращаемых столбцов следует указать такие элементы, как имя столбца, константу или выражение, которые будут возвращены в результате выполнения запроса. Для каждого элемента из этого списка в таблице результатов запроса будет создан один столбец.
Имя столбца идентифицирует один из столбцов, содержащихся в таблицах, которые перечислены в предложении FROM. Когда в качестве возвращаемого столбца указывается имя столбца из таблицы БД, то СУБД просто берет значение этого столбца для каждой из строк таблицы БД и помещает его в соответствующую строку таблицы результатов запроса.
Рис. 4. Синтаксическая диаграмма оператора SELECT
Константа, записанная в списке возвращаемых столбцов, показывает, что в каждой строке таблицы результатов запроса должно содержаться одно и то же значение.
Выражение показывает, что СУБД должна вычислять значение, помещаемое в таблицу результатов запроса, по формуле, заданной выражением.
Например, для учебной БД в результате выполнения оператора
SELECT ’ГРАЖДАНИН’, FIO, ‘ПОЛУЧАЕТ’, SUMD, ‘ПЛАТИТ’, SUMD*0.13
FROM PERSON
будет создана таблица, показанная в табл. 2.
Таблица 2
Денежные доходы граждан
ГРАЖДАНИН |
FIO |
ПОЛУЧАЕТ |
SUMD |
ПЛАТИТ |
SUMD*0.13 |
ГРАЖДАНИН ГРАЖДАНИН … ГРАЖДАНИН … |
ИВАНОВ ПЕТРОВ … САХАРОВ … |
ПОЛУЧАЕТ ПОЛУЧАЕТ … ПОЛУЧАЕТ … |
1000.00р. 700.00р. … NULL … |
ПЛАТИТ ПЛАТИТ … ПЛАТИТ … |
130.00р. 91.00р. … NULL … |
Количество строк в таблице результатов запроса может быть любым, в частности, равным нулю. Например, выполнение оператора
SELECT FIO FROM PERSON WHERE NOM<0 приведет к созданию таблицы, в которой будет один столбец (FIO) и ни одной строки, поскольку жители не имеют отрицательных номеров.
В некоторых случаях результатом запроса может быть единственное значение, например:
SELECT AVG (SUMD) FROM PERSON
Этот оператор вычисляет среднее значение дохода, получаемого жителями, и такой результат также считается таблицей, которая состоит из одного столбца и одной строки.
То, что SQL - запрос всегда возвращает таблицу данных, очень важно с практической точки зрения. Во-первых, результаты запроса можно записать обратно в БД в виде таблицы. Во-вторых, таблицы результатов двух запросов, имеющие похожую структуру, можно объединить в одну таблицу. И, в-третьих, таблица результатов запроса сама может стать объектом дальнейших запросов. Таким образом, табличная структура реляционной БД тесно связана с реляционными запросами: к таблицам можно посылать запросы, а запросы возвращают таблицы.
Нередко требуется получить содержимое всех столбцов таблицы, чтобы ознакомиться с ее структурой и хранимыми в ней данными. С учетом этого в операторе SELECT разрешается использовать символ звездочки, который означает, что требуется прочитать все столбцы из таблиц, перечисленных в предложении FROM. Например, содержимое таблицы PERSON можно получить с помощью оператора
SELECT * FROM PERSON
В этом случае таблица результатов запроса будет содержать все 6 столбцов таблицы PERSON, которые расположены в том же порядке, что и в исходной таблице, хранящейся в БД.
По умолчанию в таблицу результатов запроса включаются все строки, в том числе и повторяющиеся (см. ключевое слово ALL на синтаксической диаграмме рис. 3.4). Например, оператор
SELECT ADR FROM PERSON
возвращает адреса всех жителей, и среди этих адресов будут повторяющиеся, если в одной квартире проживают несколько человек.
Чтобы в таблице результатов запроса содержались только неповторяющиеся строки, в операторе SELECT перед списком возвращаемых столбцов записывается ключевое слово DISTINCT. Например, чтобы получить список разных адресов квартир, предыдущий оператор нужно дополнить этим ключевым словом:
SELECT DISTINCT ADR FROM PERSON