Диго С.М. Базы данных проектирование и использование (1084447), страница 50
Текст из файла (страница 50)
Предикат ALL является значением по умолчанию. Если оператор SQL не содержит ни одного предиката, то считается, что используется предикат ALL. При этом в ответ выдаются все строки результатной таблицы, даже если они совпадают.
Приведенные ниже операторы (1) и (2) SQL эквивалентны; они возвращают все записи из таблицы «Сотрудники»:
-
SELECT ALL*
FROM Сотрудники;
-
SELECT *
FROM Сотрудники;
Предикат DISTINCT исключает из результатной таблицы повторяющиеся строки. Предикат DISTINCTROW опускает данные, основанные на целиком повторяющихся записях. Предикат DISTINCTROW влияет на результат только в случае, если в запрос включены не все поля анализируемых таблиц. Предикат DISTINCTROW игнорируется, если запрос содержит только одну таблицу или все поля всех таблиц.
Поясним разницу между DISTINCTROW и DISTINCT на следующих примерах. Пусть имеется таблица «Расписание»:
Расписание | ||
Код_сотрудника | Код_предмета | Дата |
2 | 1 | 01.01.2002 |
3 | 1 | 01.01.2002 |
2 | 1 | 02.01.2002 |
3 | 1 | 02.01.2002 |
2 | 2 | 01.01.2002 |
3 | 5 | 02.01.2002 |
Использование оператора SELECT с DISTINCTROW
SELECT DISTINCTROW сотрудник.фио, расписание.код_предмета
FROM сотрудник INNER JOIN расписание
ON сотрудник.код_сотрудника = расписание.код_сотрудника;
даст следующий результат:
Distinctrow | |
ФИО | Кодпредмета |
Жуков О. А. | 1 |
Жуков О.А. | 2 |
Жуков О.А. | 1 |
Бурлак Г.Н. | 1 |
Бурлак Г.Н. | 5 |
Бурлак Г.Н. | 1 |
Использование оператора SELECT с DISTINCT
SELECT DISTINCT СОТРУДНИК.ФИО, расписание.код_предмета
FROM СОТРУДНИК INNER JOIN расписание
ON СОТРУДНИК.Код_сотрудника = расписание. код_сотрудника;
даст привычный результат, когда в ответ включаются только неповторяющиеся строки результатной таблицы:
Distinct | |
ФИО | Код__предмета |
Бурлак Г.Н. | 1 |
Бурлак Г.Н. | 5 |
Жуков О.А. | 1 |
Жуков О.А. | 2 |
Если пользоваться QBE как построителем запросов на SQL, то для включения в запрос DISTINCT следует для свойства запроса «уникальные значения» выбрать значение «Да», а для включения в запрос DISTINCTROW необходимо выбрать значение «Да» для свойства запроса «Уникальные записи».
Предикат ТОР позволяет возвращать определенное число записей из общего числа записей, получающегося в результате отбора по заданному условию.
Предикат ТОР часто используется совместно с предложением ORDER BY для обеспечения возможности вывода в ответ записей, находящихся в начале или в конце некоего диапазона. При этом в зависимости от запроса выбирается нужный вид упорядочения (ASC или DESC).
Следующая инструкция SQL позволяет получить список пяти лучших студентов выпуска 2002 г.:
SELECT TOP 5 Имя, Фамилия
FROM Студенты
WHERE ГодВыпуска =2002
ORDER BY СреднийБалл DESC;
Предикат ТОР не осуществляет выбор между равными значениями. Если в предыдущем примере средние баллы пятого и шестого студента будут равны, то запрос возвратит шесть записей.
Кроме того, можно использовать зарезервированное слово PERCENT для возврата определенного процента записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY Предположим, что вместо пяти лучших студентов следует отобрать 10% студентов с наиболее низкой успеваемостью:
SELECT TOP 10 PERCENT Фамилия, Имя
FROM Студенты
WHERE ГодВыпуска = 1994
ORDER BY СреднийБалл ASC;
Предикат ASC обеспечивает упорядочение по возрастанию. В принципе его можно было не указывать, так как ASC является значением по умолчанию.
Значение, следующее после предиката ТОР, должно быть числовым значением без знака типа Integer.
Следует обратить внимание на то, что аргументы DISTINCTROW и ТОР, используемые в Access, отсутствуют в стандарте SQL.
Если запрос затрагивает несколько таблиц и в них имеются одноименные поля, перед именами таких полей необходимо ввести имя таблицы и знак « . » (точка).
Предположим, что есть две таблицы: «Продукция» (с полями «Код_продукции», «Наименование_продукции») и «Поставка» (с полями «Код_продукции», «Дата», «Количество»). Поле «Код_продукции» содержится в обеих таблицах. Следующий оператор SQL отберет поле «Наименование_продукции» и «Код_продукции» из таблицы «Продукция» и поля «Дата» и «Количество» из таблицы «Поставка»:
SELECT Продукция.Код_продукции, Наименование_продукции,
Дата, Количество
FROM Поставка, Продукция
WHERE Продукция.Код_продукции = Поставка.Код_продукции
AND Наименование_продукции = "кефир";
Если не указать имя таблицы при перечислении полей, присутствующих в нескольких таблицах, то будет выдано сообщение об ошибке.
Если создавать запрос SQL, пользуясь QBE как построителем, то имя таблицы будет как префикс указываться перед именем поля всегда, а не только тогда, когда это действительно необходимо. Кроме того, для объединения таблиц всегда используется операция JOIN в предложении FROM. Тот же по смыслу запрос, полученный путем создания запроса на QBE с последующим переходом из режима Конструктор в режим SQL, будет выглядеть следующим образом:
SELECT продукция.Код_продукции,
продукция.Наименование_продукции, Поставка.дата, Поставка.
количество
FROM продукция INNER JOIN Поставка
ON продукция.Код_продукции = Поставка.Код_продукции
WHERE (((продукция.Наименование_продукции)="кефир"))5;
При выводе результатов ответа в режиме таблицы имена полей используются в качестве заголовков столбцов. Для изменения заголовка столбца следует использовать зарезервированное слово AS. Использование предложения AS эквивалентно определению свойства «Псевдоним» (Alias) в бланке свойств списка полей в режиме Конструктор запросов.
Использование псевдонимов особенно важно, когда в БД используются короткие английские названия полей или в ответ выводятся вычисляемые поля. Нижеследующий пример демонстрирует использование псевдонима для вычисляемого поля:
SELECT сотрудник.ФИО, [оклад]*0.5 AS Премия
FROM сотрудник;
Предложение FROM
Общая характеристика. В предложении FROM задаются таблицы, участвующие в запросе. Поскольку в Access не поддерживается механизм создания представлений (VIEW)6, то это могут быть либо реальные таблицы БД (причем таблицы и активной БД, и внешней БД), либо ранее запомненные запросы.
Синтаксис предложения FROM:
FROM выражение [IN внешняяБазаДанных].
Имена таблиц, участвующих в запросе, могут быть перечислены через запятую. Тогда условие соединения таблиц будет задано в предложении WHERE либо в самом предложении FROM. В последнем случае в качестве выражения используются операции INNER JOIN, LEFT JOIN или RIGHT JOIN.
Предложение FROM должно присутствовать в каждой инструкции SELECT.
Внешняя база данных - это база данных, поддерживающая протокол ODBC, такая, как база данных Microsoft® SQL Server™, обычно расположенная на удаленном сервере. Для повышения быстродействия и облегчения применения рекомендуется использовать присоединение таблиц вместо предложения IN при загрузке данных из внешней базы данных.
Соединение таблиц с использованием операции JOIN. Выше, говоря об определении полей, выводимых в ответ, нам уже пришлось коснуться проблемы соединения таблиц. Рассмотрим этот вопрос более детально. Классическая операция соединения (JOIN) предполагает, что каждая строка первой таблицы по заданному условию сравнивается с каждой строкой второй таблицы, и если условие выполняется, то соответствующие строки сцепляются, образуя очередную строку в результирующем отношении. В принципе условие сравнения может быть любым, но чаще всего используется условие соединения по равенству значений соответствующих полей. Такое соединение называется естественным соединением. В SQL Access данная операция называется INNER JOIN.
Нельзя в качестве полей, по которым проводится соединение таблиц, использовать поля, имеющие тип MEMO или OLE.
Пусть в БД имеются таблицы «Кафедры» и «Сотрудники». В таблице «Кафедры» присутствуют поля «Код_кафедры», «Наименование_ кафедры_полное» и «Наименование_кафедры_краткое». В таблице «Сотрудники» есть поле Код_кафедры, но отсутствуют наименования кафедр. В предметной области возможны ситуации, что некоторые сотрудники не приписаны ни к одной кафедре, и могут быть кафедры, к которым не приписано ни одного сотрудника.
Тогда, если требуется получить список сотрудников кафедр(ы) и в запросе используется наименование кафедры, следует использовать операцию INNER JOIN.
Кроме операции INNER JOIN в SQL Access имеются операции LEFT JOIN и RIGHT JOIN. Операции LEFT JOIN и RIGHT JOIN называются в документации по Access внешним объединением7.
Так, для отбора всех кафедр (в том числе тех, в которых нет ни одного сотрудника) или всех сотрудников (в том числе тех, которые не приписаны ни к какой кафедре) следует использовать операцию LEFT JOIN или RIGHT JOIN соответственно.
Поле, используемое для объединения таблиц, может как включаться, так и не включаться в результат выполнения запроса.
Операция JOIN выглядит следующим образом:
FROM таблица1 INNER|LEFT|RIGHT JOIN таблица2 ON таблица! поле1 = таблица2.поле2.
Поля связи должны иметь соответствующие друг другу тип данных и длину. Имена полей связи могут различаться, однако при проектировании БД желательно давать одинаковые имена полям, которые имеют одинаковое смысловое значение, и, напротив, поля, различающиеся по смыслу, следует называть разными именами.
Операции JOIN могут быть вложенными. В этом случае используется следующий синтаксис:
SELECT список полей
FROM таблица1 INNER JOIN
(таблица2 INNER JOIN [(]таблицаЗ
[INNER JOIN [(]таблицаХ [INNER JOIN ...)] ON таблицаЗ.полеЗ =
таблицаХ.полеХ)]
ON таблица2.поле2 = таблицаЗ.полеЗ)
ON таблица1 .поле1 = таблица2.поле2;
На рис. 7.6 приведен пример запроса, использующего три таблицы. Для его изображения на SQL будет использована вложенная операция JOIN.
Запрос на SQL, соответствующий запросу, изображенному на рис. 7.6, будет выглядеть следующим образом: