Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диго С.М. Базы данных проектирование и использование.doc
Скачиваний:
723
Добавлен:
14.05.2016
Размер:
12.04 Mб
Скачать

7.9.1. Оператор select Общая характеристика оператора

Оператором SQL, осуществляющим отбор информации из базы данных, является SELECT или его разновидность - SELECT...INTO.

Синтаксис оператора SELECT в Access имеет следующий вид:

SELECT [предикат] {* | таблица.* | [таблица.]поле1

[AS псевдоним1] [, [таблица.]поле2 [AS псевдоним2] [,...]]}

FROM выражение [,...] [IN внешняя_база_данных]

[WHERE... ]

[GROUP BY...]

[HAVING...]

[ORDER BY...]

[WITH OWNERACCESS OPTION]

Как видим, синтаксис оператора SELECT в Access несколько от­личается от стандарта. Конструкции [IN внешняя_база_данных] и [WITH OWNERACCESS OPTION] отсутствуют в стандарте SQL.

Ниже перечислены аргументы оператора SELECT.

Аргумент

Описание

Предикат

Один из следующих предикатов отбора: ALL,DISTINCT, DISTINCTROW или ТОР. Предикаты используются для ограничения числа возвращаемых записей. Если они отсутствуют, по умолчанию используется предикат ALL

*

Указывает, что выбраны все поля заданной таблицы (таблиц)

Таблица

Имя таблицы, из которой должны быть отобраны записи

Поле1, поле2

Имена полей, из которых должны быть отобраны данные.

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

Псевдоним1 Псевдоним2

Имена, которые станут заголовками столбцов вместо исходных названий столбцов в таблице

Выражение

Имена одной или нескольких таблиц, которые содержат отбираемые данные

Внешняя_база_данных

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

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

Описание WITH OWNERACCESS OPTION используется при работе в сети в составе защищенной рабочей группы и здесь рассмат­риваться не будет.

Предложение select

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

Для отбора всех полей таблицы можно использовать звездочку (*). Следующий оператор отбирает все поля из таблицы «Сотрудник»:

SELECT * FROM Сотрудник;

Если в запросе используется несколько таблиц, то перед знаком (*) следует поместить имя таблицы, из которой будут выводиться все поля, отделенные от этого знака точкой:

SELECT ФИО, Семья.*

FROM Сотрудник INNER JOIN Семья

ON Сотрудник.Код_сотрудника = Семья.Код_сотрудника;

В данном примере из таблицы «Семья» в ответ выводятся все поля, а из таблицы «Сотрудник» - только поле ФИО.

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

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

Приведенные ниже операторы (1) и (2) SQL эквивалентны; они возвращают все записи из таблицы «Сотрудники»:

  1. SELECT ALL*

FROM Сотрудники;

  1. 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 сотрудник;