- •Подстановки
- •Создание связей и объединений в запросах
- •Ограничения в многотабличных запросах
- •Редактирование полей справочников
- •Создание связей для запросов
- •Использование в запросе автоподстановки для автоматического ввода данных
- •Создание параметризованных запросов
- •Объединение только тех записей, в которых связанные поля обеих таблиц совпадают- внутреннее.
- •Объединение всех записей из «Имя таблицы («один»)» и только тех записей из «Имя таблицы «многие»», в которых связанные поля совпадают.
- •Объединение всех записей из «Имя таблицы («многие»)» и только тех записей из «Имя таблицы «один»», в которых связанные поля совпадают.
- •Объединение в запросе двух копий одной таблицы (самообъединение)
- •Запросы, вносящие изменения
- •Специфика:
- •Имя Покупателя : Customer Name Создание и использование подчиненных форм
- •Создание главной и подчиненной форм с помощью мастера
- •Вставка подчиненной формы в главную
- •Связывание главной и подчиненной форм
- •Создание итогов в подчиненных формах
- •Язык sql
- •Команда select
- •S elect name1, name2, … - список столбцов, представляемых в результате
- •Устранение избыточности данных
- •Определение выборки – предложение where
- •Булевы операторы: and, or, not
- •Оператор in
- •Оператор between … and
- •Оператор like
- •Оператор is null
- •Применение функций агрегирования
- •Предложение group by
- •Предложение having
- •Ограничение на агрегированные функции
- •Форматирование результатов запросов и выражения
- •Упорядочение выходных полей
- •Использование множества таблиц в одном запросе
- •Операция соединения таблиц посредством ссылочной целостности
- •Вложенные запросы (подзапросы)
- •Связанные подзапросы
- •Оператор exists
- •Объединение множества запросов в один Предложение union
- •Ввод, удаление и изменение значений полей
- •Вставка результатов запроса
- •Исключение (удаление) строк из таблицы
- •Обновление
Использование множества таблиц в одном запросе
До этого момента рассматривалась техника запросов SQL, базирующаяся на одной таблице, однако основные преимущества запросов заключаются в том, что они могут базироваться на нескольких связанных таблицах - объединениях.
При операции соединения (join) таблицы перечисляются в предложении запроса FROM через запятую. Предикат запроса может ссылаться на любой столбец из соединяемых таблиц (обычно WHERE). Имена таблиц предшествуют через точку именам полей.
SELECT Customers.cname, Salespeople.sname, Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople. city = Customers.city;
Это типичный пример, когда префиксы действительно необходимы (и в одной и в другой таблице поле- city). В дальнейшем префиксы используем по необходимости.
В запросе для каждого продавца из Sales people проводится проверка предиката.
Операция соединения таблиц посредством ссылочной целостности
Допустим, что между таблицами существует связь по полю snum- номер продавца (за каждым покупателем закреплен продавец).
Здесь операция соединения может извлечь данные в терминах связи: показать соответствие имен покупателей именами продавцов, их обслуживающих:
SELECT Customers cname, Salespeople.sname
FROM Customers, Salespeople
WHERE Salespeople.snum = Customers.snum;
Поля snum не представлены в выходных данных, поскольку они не существенны как результаты. Подобным образом могут быть построены объединения нескольких таблиц (>2).
Иногда требуется построить запрос по двум копиям одной таблицы.
Здесь возникает проблема с именами. У копии должны быть другие имена. Проблема решается определением временных имен- алиасов в предложении FROM. Рассмотрим пример поиска пар продавцов, имеющих одинаковый рейтинг:
SELECT first.sname, second.sname, first.rating
FROM Salespeople first, Salespeople second
WHERE first.rating = second.rating;
SQL не делает копии реально, но внешне это выглядит так, что Salespeople распадается на две копии с именами first и second.
После выполнения запроса алиасы утрачивают силу.
Выходные данные примера будут включать каждую комбинацию значений дважды из-за симметрии предиката (подставьте реальные имена и увидите). Кроме того, каждая запись присоединяется к себе самой.
Есть простой способ исключить трехкратные повторения- сделать предикат асимметричным.
SELECT first.sname, first.rating
FROM Salespeople first, Salespeople second
WHERE first.rating = second.rating;
AND first.sname < second.sname;
Это уже полезный прием для работы.
Алиасы используют не только для копий запросов, но и просто при замене длинных имен короткими.
Вложенные запросы (подзапросы)
SQL позволяет вкладывать запросы друг в друга. Обычно внутренний запрос (подзапрос) генерирует множество значений, которые тестируются на предмет истинности предиката.
Допустим, нам нужны все заказы продавца с именем Hoffman. Его номера мы не знаем.
SELECT *
FROM Orders
WHERE Snum = (SELECT Snum FROM Sales people
WHERE sname = ‘Hoffman’);
Если бы мы знали номер (допустим 1004), то мы бы прямо написали:
WHERE snum = 1004;
но 1004- это результат подзапроса.
Здесь есть тонкость. Вы должны быть уверены, что это значение единственное (результат подзапроса), иначе будет ошибка.
Если получится NULL, то ошибки не будет. Предикат сработает по UN Known так же как по FALSE и не выдаст ни одной строки в результате.
Для гарантии единственности результата в подзапросе после слова SELECT нужно поставить DISTINCT.
Еще одно ограничение стандарта ANSI- нельзя подзапрос поставить слева (перед запросом).
