Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

Запрос на sql с exist и not exist (реализация реляционной операции Деления)

Это вариант примера из книги Кренке (стр. 322). Задача - требуется узнать имена студентов, которые записаны на ВСЕ предметы (т.е. это вариант реализации в SQL реляционной операции ДЕЛЕНИЯ). По-другому это можно выразить так (от противного): нам нужны имена таких студентов, для которых не существует предметов, на которые они не были бы записаны. В книге Кренке были использованы 2 ключевых слова NOT EXISTS.

SELECT Студент.Имя

FROM Студент

WHERE NOT Exists

(SELECT *

FROM Занятия

WHERE NOT EXISTS

(SELECT *

FROM Запись

WHERE Занятия.НазваниеПредмета=Запись.НазваниеПредмета

AND Запись.НомерСтудента=Студент.ЛичныйНомер));

Я их ввел как в книге (при этом пришлось исправить ошибку – поменять местами таблицы ЗАПИСЬ и ЗАНЯТИЯ во втором и третьем операторах FROM), но ACCESS сам сделал другой вариант (после того, как я просмотрел этот запрос в режиме конструктора, выйдя из режима SQL), который дает тот же результат, но использует одно (второе) ключевое слово NOT EXISTS и одно слово EXISTS, результату действия которого присваивается значение FALSE. Оба запроса дают одинаковый результат. Вот запрос, переделанный ACCESS'ом.

SELECT Студент.Имя

FROM Студент

WHERE (((Exists (SELECT *

FROM Занятия

WHERE NOT EXISTS

(SELECT *

FROM Запись

WHERE Занятия.НазваниеПредмета=Запись.НазваниеПредмета

AND Запись.НомерСтудента=Студент.ЛичныйНомер)))=False));

Известно, что Access дает лишнюю пару круглых скобок (которую можно убрать) и обычно пишет названия полей вместе с названиями таблиц, что не всегда обязательно.

В конце запросов в Access обязательно должна стоять точка с запятой!!!

Операция внешнего соединения таблиц в access (Мои замечания)

Хочу обратить внимание на неточности терминологии в ряде баз данных. Например, в ACCESS операцию Соединения часто называют Объединением (например, в ACCESS термин Параметры объединения таблиц при создании запроса следует понимать как Параметры соединения таблиц). Пользуясь случаем, дам следующую информацию о том, как выполнять операцию Внешнего соединения таблиц в ACCESS. Например, когда вы делаете запрос на выборку из 2 или более таблиц, то в режиме Конструктора необходимо щелкнуть правой кнопкой мыши по связи между таблицами и выбрать из появившегося меню пункт Параметры объединения. Появится окошко, в котором перечислены три возможных типа соединения : внутреннее соединение (используемое в ACCESS по умолчанию при создании запросов), левое внешнее соединения и правое внешнее соединение. В ряде случаев внешние соединения очень полезны. Также отмечу, что при выборе внешнего соединения поменяется внешний вид линии связи между таблицами (в частности, появится стрелка на одном конце связи). Следует заметить, что операцию внешнего соединения можно выполнять и при создании или редактировании схемы данных (там в окошке, где вы ставите галки о целостности и каскадных операциях, есть кнопка Объединение), что в некоторых случаях необходимо при создании структуры БД.

Псевдонимы столбцов и таблиц

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

as заголовок_столбца.

Например:

SELECT ClientName AS Клиент, Address AS Адрес FROM Клиенты;

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

SELECT Т1.Имя, Т2.Адрес FROM Клиенты Т1, Контакты Т2;

Ключевое слово as (как) означает, что в результатной таблице соответствующий столбец должен иметь заголовок, указанный после as.

Как говорилось выше, назначаемый заголовок еще называют псевдонимом.

В следующем примере (рис. 4.2) задаются псевдонимы для всех вычисляемых столбцов:

SELECT Регион,

SUM(Сумма_заказа) AS [Общая сумма заказа],

AVG(Сумма_заказа) AS [Средняя сумма заказа],

МАХ(Сумма_заказа) AS Максимум,

MIN(Сумма_заказа) AS Минимум FROM Клиенты GROUP BY Регион;

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

Итоговые функции можно использовать в выражениях select и having, но их нельзя применять в выражении where.

Оператор having аналогичен оператору where, но в отличие от where он отбирает записи в группах.

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

SELECT Регион, Count(*)

FROM Клиенты

GROUP BY Регион HAVING COUNT(*) > 1;