Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2575.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
1.86 Mб
Скачать

9. СОЗДАНИЕ ЗАПРОСОВ НА ВЫБОРКУ С ПОМОЩЬЮ ЯЗЫКА SQL

9.1. Структура запроса. Условия поиска

Рассмотрим формирование запросов на языке SQL в русской версии Access. Поиск осуществляется с помощью

инструкции SELECT. По этой инструкции ядро СУБД возвращает данные из базы данных в виде набора записей. Инструкция SELECT имеет следующий формат:

SELECT [ALL | DISTINCT | DISTINCTROW | TOP]

{*|<таблица>.*|[<таблица>.]<значение1> [А6<псевдоним1> ][, [<таблица>.]<значение2>[А6

<псевдоним2>][,...]]}

FROM {<таблица> <псевдоним таблицы>[,

...]}

[IN <ВнешняяБазаДанных>] [WHERE <условия поиска>] [GROUP BY <столбец>] [HAVING <условия поиска>] [ORDER BY <список столбцов>];

При описании синтаксиса приняты следующие обозначения. Вместо слов в угловых скобках необходимо указать имена реальных таблиц, столбцов и т. п. Аргументы, указанные в прямых скобках, не являются обязательными. Если указано несколько аргументов, разделенных символом '|', то можно использовать только один аргумент. Фигурные скобки обозначают список элементов, записанных через запятую.

46

Рассмотрим кратко аргументы инструкции SELECT. После ключевого слова SELECT приводится список значений, каждое из которых определяет столбец результирующего набора данных. Как правило, это имена столбцов таблиц, перечисленных после слова FROM, причем столбцы выводятся в указанном порядке. Иногда — это значения, вычисленные некоторыми функциями, например, среднее значение. Символ '*' указывает на включение в результирующий набор всех столбцов всех таблиц, перечисленных после слова FROM. Если в результирующий набор выводятся значения столбцов, имеющих одинаковые имена в используемых в запросе таблицах, то следует применять составное имя

<таблица>.<значение>. Конструкция

<таблица>.* означает включение в результат всех столбцов одной из таблиц. Конструкция AS

<псевдоним> означает, что <псевдоним> станет заголовком столбца в результирующем наборе данных.

Предикат (условие) DISTINCT исключает записи, которые содержат повторяющиеся значения в выбранных полях. Предикат DISTINCTROW исключает повторяющиеся записи, полученные в результате соединения таблиц. Предикат DISTINCTROW влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц. Предикат DISTINCTROW игнорируется, если запрос содержит только одну таблицу или все поля всех таблиц. Предикат ALL разрешает включение в результат одинаковых строк. По умолчанию (если нет ни одного предиката) действует ALL . Предикат TOP П возвращает п первых записей результирующего набора (с учетом сортировки результата при наличии предложения ORDER BY). Предикат TOP П PERCENT возвращает определенный процент записей.

47

Впредложении FROM перечисляются имена таблиц, в которых производится поиск. Для таблиц можно назначать новые имена — псевдонимы, действующие в пределах запроса. Можно также указывать таблицы из внешней базы данных.

Впредложении WHERE указываются условия (предикаты) поиска. Условия могут использовать булевы

операторы AND (логическое И), OR (логическое ИЛИ), XOR (исключающее ИЛИ), EQV (логическая эквивалентность), IMP (импликация), NOT (отрицание) и скобки.

Предложения GROUP и HAVING задают группировку и условия группировки результатов поиска. Предложение ORDER BY задает сортировку результатов.

При выполнении инструкции S E L E C T СУБД находит указанные таблицы, возможно, соединяет таблицы, извлекает заданные столбцы, выделяет строки, соответствующие условию отбора, сортирует или группирует результирующие строки в указанном порядке.

Рассмотрим задание условий поиска на примерах запросов к одной таблице. Чаще всего в условиях поиска применяются предикаты сравнения =, <> (не равняется), >, >=, <, <=. Например, чтобы узнать дату рождения студента Рассказова, необходимо задать запрос

SELECT [Дата рождения]

FROM Студент

WHERE Фамилия^'Рассказов';

В запросах часто используются булевы операторы. Например, чтобы получить информацию о всех девушках группы РС-061, сформируем запрос

SELECT *

FROM Студент

WHERE Группа='РС-061' AND Пол='Ж';

48

Оператор NOT должен предшествовать булевскому выражению, значение которого он должен изменить, но не может располагаться непосредственно перед оператором сравнения. Например, получить данные о студентах всех групп, кроме РС-061, можно с помощью запроса

SELECT * FROM Студент WHERE NOT Группа=' РС-061';

Если в условиях поиска используются даты, то используется американский формат даты: первым записывается номер месяца. Например, найти студентов, родившихся ранее 1 октября 1984 г. можно с помощью следующего запроса:

SELECT Фамилия FROM Студент

WHERE [Дата рождения]< #10/01/84#;

При просмотре этого запроса в Конструкторе дата в условиях поиска показывается в русском формате

01.10.84

В условиях поиска можно использовать предикаты IN,

BETWEEN...AND, LIKE и IS NULL. Предикат IN

проверяет, совпадает ли значение выражения с одним из элементов указанного списка. Например, для получения сведений о студентах двух групп можно использовать запрос

SELECT *

 

FROM Студент

 

WHERE Группа IN

('РС-061', 'РС-

071');

 

В последнем примере можно применить условие поиска

WHERE Группа=РС-061 OR группа=РС-071.

При сложных условиях применение предиката IN оказывается более простым и наглядным.

Предикат BETWEEN...AND определяет принадлежность значения выражения указанному диапазону. Предикат

49

является включающим, т. е. проверяет указанные граничные значения. Предикат часто используют для проверки, попадает ли значение поля в указанный диапазон чисел. Но можно применять этот предикат и для работы со строковыми данными. Например, выдать все сведения о студентах, фамилии которых начинаются с 'А' по 'К' включительно можно оператором

SELECT * FROM Студент

WHERE

Фамилия BETWEEN 'А'AND 'Л';

В последнем примере сведения о студентах, фамилии которых начинаются на букву Л не будут выданы, так как строки, представляющие фамилии, будут длиннее строки 'Л', которая для сравнения будет дополнена пробелами. Так как пробел предшествует в кодовой таблице любой букве, то строка 'Л' предшествует любой фамилии, начинающейся на букву Л.

Предикат LIKE проверяет, входит ли указанный образец в строковое значение. В образце может быть задано полное значение (например, Like "Иванов") или использованы подстановоч-ные знаки для поиска диапазона значений. Подстановочные знаки — специальные символы, на месте которых в образце могут стоять определенные символы. Знак звездочки (*) соответствует произвольному числу любых символов. Например, всех студентов, фамилии которых начинаются на букву К, можно найти инструкцией

SELECT * FROM Студент

WHERE Фамилия LIKE 'К*';

Вопросительный знак соответствует любому одиночному символу. Знак номера (#) соответствует одной произвольной цифре. Последовательность символов, заключенных в квадратные скобки ([ ]), заменяет любой символ, заключенный в скобки. Восклицательный знак перед списком символов

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]