Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СР по ОБД.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Контрольные вопросы

  1. Какое поле таблицы Заказчики является первичным ключом?

  2. Как по-другому называется столбец таблицы? Строка?

  3. Почему нельзя запрашивать для просмотра первые пять строк таб­лицы?

  4. Какое наибольшее основное различие между типами данных в SQL?

  5. Распознает ли стандартный SQL тип данных DATA?

  6. Является ли SQL системой управления базами данных (СУБД)? Почему?

  7. Какие функции выполняет SQL? Какие из них наиболее важные? Обосновать свой ответ.

  8. Чем характерно манипулирование реляционными данными?

Самостоятельная работа №10 (12 часов)

ТЕМА: Реляционная алгебра. Операторы языка SQL

Выбор данных с помощью команды select.

Большинство запросов на извлечение данных (запросов-выборок) строится на основе команды SELECT. Синтаксис этой команды следующий:

  • SELECT <предложение> [INTO < предложение >] FROM < предложение > [WHERE < предложение >] [GROUP BY < предложение >] [ HAVING < предложение >] [UNION < предложение >] [ORDER BY < предложение >];

В общем случае результатом выполнения запроса на извлечение данных является некоторая новая результирующая таблица. Порядок следования строк которой не определен и среди строк которой могут нахо­диться дубликаты.

В качестве заголовков полей этой таблицы используются имена по­лей, из которых извлекались данные (эти поля перечисляются в SELECT-предложении). Если информация выбиралась из нескольких таблиц (име­на таблиц перечисляются в FROM-предложении через запятую), то перед именем поля в результирующей таблице ставится имя таблицы, из кото­рой выбирались данные.

Результирующая таблица получается последовательным применени­ем предложений FROM, WHERE, GROUP BY и HAVING к таблицам, за­данным в предложении FROM.

Чтобы вывести только уникальные строки таблицы, необходимо ис­пользовать ключевое слово DISTINCT.

Пример. Вывести список городов, в которых живут заказчики.

SELECT DISTINCT Город FROM Заказчики;

Если команда выбирает несколько полей, то DISTINCT опускает строки, где все выбранные поля идентичны. Строки, в которых некоторые значения одинаковы, а некоторые различны, будут сохранены.

Для отбора строк по заданному критерию используется предложение

WHERE.

В состав критерия отбора могут входить как элементарные логиче­ские условия, так и сложные, в которых условия объединяются логиче­скими связками (NOT, AND и OR). Сложные логические условия оцени­ваются по правилам булевой алгебры.

Объединение таблиц. Использование агрегатных функций

Результатом выполнения предложения FROM является расширенное декартово произведение таблиц из списка предложения.

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

SELECT Продавцы.Номер_продавца,

Заказчики.Номер_заказчика, Продавцы .Город FROM Продавцы, Заказчики WHERE Продавцы Город. = Заказчики.Город;

В этом случае выполняется операция объединения таблиц.

Можно выполнять объединение таблицы с самой собой. При объе­динении таблицы с собой каждая строка таблицы комбинируется с собой и с каждой другой строкой таблицы. Затем каждая комбинация оценива­ется в терминах предиката, также как в объединениях различных таблиц.

Объединение таблицы с собой можно изобразить как объединение двух копий одной и той же таблицы. Таблица на самом деле не копирует­ся, но SQL выполняет команду так, как если бы это было сделано. Други­ми словами, это объединение - такое же, как и любое другое объединение между двумя таблицами, за исключением того, что в данном случае обе таблицы идентичны.

Синтаксис команды для объединения таблицы с собой тот же, что и для объединения различных таблиц. Все повторяемые имена столбцов до­полняются префиксами имени таблицы. Но так как таблица одна, то необ­ходимо иметь два различных имени для такой таблицы. Это можно сде­лать заданием временных имен, называемых псевдонимами.

Псевдонимы определяются в предложении FROM следующим обра­зом: указывается имя таблицы и через пробел псевдоним для нее. Псев­донимы можно использовать уже в предложении SELECT, то есть еще до определения их в предложении FROM. Псевдоним существует только во время выполнения команды. Когда выполнение запроса заканчивается, псевдонимы, используемые в нем, становятся неопределенными.

Пример. Найти все возможные пары заказчиков с одинаковым рей­тингом: SELECT Первая.Фамилия_заказчика,

Вторая.Фамилия_заказчика, Первая.Рейтинг FROM Заказчики Первая, Заказчики Вторая WHERE Первая.Рейтинг = Вторая.Рейтинг;

Псевдонимы позволяют обработать таблицу Заказчики как две неза­висимые таблицы Первая и Вторая.

Результирующая таблица имеет два значения для каждой комбина­ции, причем второй раз в обратном порядке. Это потому, что каждое зна­чение представлено и в первом псевдониме, и во втором ( симметрично) псевдониме.

Следовательно, значение А в псевдониме! сначала выбирается в комбинации со значением В в псевдониме2, а затем значение В псевдони­ме! выбирается в комбинации со значением А в псевдониме2. Кроме того каждая строка была скомбинирована сама с собой, следовательно, будут получены строки типа А-А.

Агрегатные функции предназначены для того, чтобы вычислять не­которое значение для заданного множества строк. Таким множеством строк может быть группа строк, если агрегатная функция применяется к сгруппированной таблице или вся таблица.

В SQL определены пять стандартных агрегатных функций: COUNT -число строк или значений, МАХ - максимальное значение, MIN - мини­мальное значение, SUM - суммарное значение и AVG - среднее значение.

Для всех агрегатных функций, кроме COUNT(*), фактический (т.е. требуемый семантикой) порядок вычислений следующий: на основании параметров агрегатной функции из заданного множества строк произво­дится список значений. Затем по этому списку значений производится вы­числение функции. Если список оказался пустым, то значение функции COUNT для него есть 0, а значение всех остальных функций NULL (не определено).

С агрегатными функциями SUM и AVG могут использоваться толь­ко числовые поля. С COUNT, MAX и MIN - числовые и символьные поля. Когда эти функции используются с символьными полями, МАХ и MIN будут транслировать эти поля в эквивалент ASCII.

Если агрегатная функция определена с ключевым словом DISTINCT, то список значений строится из значений столбца, указанного после этого слова (в этом случае не допускается вычисление арифметических выраже­ний!). Далее из этого списка удаляются неопределенные значения, и в нем устраняются значения-дубликаты. Затем вычисляется указанная функция.

Если агрегатная функция специфицирована без ключевого слова DISTINCT (или с ключевым словом ALL), то список значений формиру­ется из значений арифметического выражения, указанного в качестве па­раметра агрегатной функции и вычисляемого для каждой строки заданно­го множества. Далее из списка удаляются неопределенные значения, и производится вычисление агрегатной функции.

Пример. Определить среднюю сумму, заработанную сотрудниками фирмы

SELECT AVG (Оклад + Премия ) FROM Сотрудник;

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

Для подсчета общего числа строк в таблице используется функция COUNT со звездочкой вместо имени поля, как в следующем примере

SELECT COUNT (*) FROM Заказчики;

Сортировка и группировка строк таблицы

Предложение ORDER BY позволяет установить желаемый порядок просмотра результирующей таблицы (отсортировать таблицу).

Фактически задается список столбцов результирующей таблицы, и для каждого столбца указывается порядок просмотра строк результата в зависимости от значений этого столбца (ASC - по возрастанию (умолча­ние), DESC - по убыванию). Столбцы можно задавать их именами тогда и только тогда, когда в списке выборки в предложении SELECT этому столбцу соответствует арифметическое выражение, состоящее только из имени столбца. Во всех остальных случаях в разделе ORDER BY должен указываться порядковый номер столбца в таблице-результате.

  • SELECT <список выборки> FROM <таблицы>

ORDER BY <столбец / целое число> [ASC / ESC] [ ,<столбец/ целое число>[ASC/ESC]...];

Пример. Вывести список заказчиков в алфавитном порядке фами­лий: SELECT Номер_заказчика, Фамилия_заказчика FROM Заказчики ORDER BY 2;

Предложение GROUP BY позволяет объединить строки результи­рующей таблицы в группы с одинаковыми значениями столбцов.

Если R - это таблица, являющаяся результатом предыдущего разде­ла (FROM или WHERE), то результатом раздела GROUP BY является раз­биение R на множество групп строк. Это множество состоит из мини­мального числа таких групп, в которых для каждого столбца из списка столбцов раздела GROUP BY во всех строках каждой группы, включаю­щей более одной строки, значения этого столбца совпадают.

Пример. Вывести номера, описание и количество товара, объеди­ненные в группы с совпадающими описаниями товара.

SELECT Номер, Описание, Количество FROM Товар

GROUP BY Описание;

Условие поиска предложения HAVING задает условие на группу строк сгруппированной таблицы. Условие поиска предложения HAVING строится по тем же синтаксическим правилам, что и условие поиска пред­ложения WHERE, и может включать те же самые предикаты.! (см. п. 2.3.). Однако в арифметических выражениях предикатов, входящих в условие выборки предложения HAVING, прямо можно использовать только столбцы, указанные в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно использовать только внутри специфика­ций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляю­щих в данном случае некоторое агрегатное значение для всей группы строк.

Например, нельзя писать

SELECT Номер_Продавца, МАХ(Сумма) FROM Заказы

GROUP BY Номер_Продавца

HAVING Дата_3аказа='10.03.98';

для вывода наибольшей суммы, полученной каждым Продавцом 10 марта.

Поле Дата Заказа нельзя использовать в предложении HAVING, т.к. оно может иметь больше чем одно значение на группу вывода. Правильно записывается SELECT Номер_Продавца, МАХ(Сумма) FROM Заказы WHERE Дата_3аказа=' 10.03.98' GROUP BY Номер Продавца;

Результатом выполнения предложения HAVING является сгруппи­рованная таблица, содержащая только те группы строк, дли которых вы­полняется условие поиска.