Конспект лекций по дисциплине «Сетевые базы данных», страница 11

SELECT *  FROM cust  ORDER BY cname;

SELECT *  FROM cust  ORDER BY city DESC;

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

SELECT cnum, cname, city, rating, snum FROM cust ORDER BY cname;

SELECT cnum, cname, city, rating, snum FROM cust ORDER BY 2;

Использование значений Null

В реляционных базах данных разрешается использовать пустые поля, т.е. поля, не содержащие никаких данных. Это означает, что необходимые данные неизвестны или их просто нет. Например, при вводе нового покупателя в таблицу CUST его рейтинг сначала может быть еще не сформирован, поэтому поле RATING для него будет какое-то время пустым. Пустые значения полей называются null-значениями, и для работы с ними требуются специальные действия.

Чтобы значения Null в результатах выборки или в выражениях обрабатывалось требуемым образом, необходимо использовать специальную скалярную функцию NVL. Эта функция имеет два аргумента: 1) поле (или переменная), которое может содержать null-значение, и 2) заменяющее значение (см. описание числовых и символьных функций в п.1.4). Функция возвращает значение, заданное пользователем, когда значение поля есть null. В качестве примера использования функции NVL рассмотрим команду SELECT, выбирающую данные о покупателях. При это для получения нулевого рейтинга вместо null-значения применяется функция NVL  в списке вывода.

SELECT cnum, cname, city, nvl(rating,0) as rating

  FROM cust

  ORDER BY cname;

Наш запрос выведет рейтинг, равный 0, для всех тех покупателей, у которых он равен null. Но рейтинги тех покупателей, у кого они имеют конкретные числовые значения (не null), будут выведены такими, какими они хранятся в таблице, т.е. функция NVL не окажет на них никакого воздействия. Следует отметить, что если применять функцию NVL к полю, содержащему символьные данные, то в качестве второго аргумента нужно задать строковое значение. Обратите внимание на фразу «as rating» – так задан алиас (псевдоним) для столбца, содержащего рейтинги. Если бы мы этого не сделали, столбец бы имел название «nvl(rating,0)» в результирующем наборе строк.

Объединение данных в связанных таблицах

В рассмотренных ране примерах использовались запросы, которые извлекают данные только из одной таблицы. SQL позволяет определять связи между таблицам и, используя эти связи, выводить данные из нескольких таблиц одной командой. Так как в разных таблицах могут быть столбцы с одинаковыми именами, имена полей в команде SELECT требуется указывать вместе с именем таблицы, используя точечную нотацию. Например, следующий запрос выдаст имена заказчиков и продавцов, размещенных в одних и тех же городах:

SELECT cname, sname, sal.city  FROM sal, cust

               WHERE sal.city = cust.city

Команда SELECT в приведенном примере выводит объединенные данные из связанных таблиц. Для выполнения объединения нам потребовалось 1) во фразе FROM перечислить таблицы (sal и cust), данные из которым нужно выбрать, и 2) во фразе WHERE указать имена полей, по которым производится связывание, приравняв их друг другу. Выполненное таким образом объединение называется внутренним. При внутреннем объединении в результирующий набор данных не будут включены строки какой-либо из таблиц, которые не имеют соответствия в другой таблице.

Если при объединении таблиц фразу WHERE опустить (или не указать в ней условие «sal.city = cust.city»), то мы получим так называемое декартово произведение. В этом случае в результирующий набор данных попадут данные из всех комбинаций строк обеих таблиц – каждая строка одной таблицы связывается с каждой строкой другой таблицы.

Язык SQL позволяет создавать объединения, которые включают и различные таблицы, и псевдонимы одной и той же таблицы. Следующий запрос, объединяет таблицу Заказчиков с собой, чтобы найти все пары заказчиков, обслуживаемых одним продавцом. Кроме того, этот запрос объединяет таблицу Заказчиков с таблицей Продавцов по номеру продавца для выбора имени продавца: