SQL (Structured Query Language – структурированный язык запросов) с 1986г. является стандартным языком реляционных баз данных. В частности, он используется в приложениях Access и Excel. Стандарт языка SQL изложен в [1].
Запросы в MS Access сохраняются и реализуются с помощью языка SQL. Хотя большинство запросов можно создать графическими средствами (запросы по образцу), однако хранятся они в виде инструкций SQL. В ряде случаев (например в подчиненных запросах) можно использовать только язык SQL. В MS Access использован и ниже излагается диалект этого языка. Многочисленные примеры запросов на языке SQL можно найти в базе данных (БД) Борей (файл I:\Access \Sampapps\Nwind.mdb).
SQL заметно отличается от других языков программирования высокого уровня.
1. SQL относится к непроцедурным языкам. Он просто декларирует, что нужно сделать, а исполнение возлагается на СУБД (система управления базами данных).
2. В SQL используется трехзначная логика. Наряду с традиционными логическими значениями TRUE и FALSE используется NULL (НЕИЗВЕСТНО или ОТСУТСТВИЕ ДАННЫХ).
3. Операции осуществляются над целыми наборами данных, а не над отдельными элементами, как в других языках программирования.
Запрос на языке SQL состоит из инструкций. Каждая инструкция может содержать несколько предложений.
FROM
Практически ни один запрос не обходится без предложения FROM, описывающего используемые таблицы или запросы, и имеющего синтаксис
FROM таблицы [IN внешняя_БД]
Таблицы - используемые таблицы/запросы и их взаимосвязи.
Если в предложении FROM присутствует конструкция IN(квадратные скобки указывают, что эта часть предложения не является обязательной), то после зарезервированного слова IN должно стоять имя базы данных, в которой находятся таблицы (предполагается, что используют таблицы не из текущей БД).
Пример
FROM Преподаватели
Если запрос строится на двух таблицах, то необходимо указать способ их объединения – один из следующих (предполагается , что читатель с ними знаком):
, декартово произведение;
INNER JOIN внутреннее объединение;
LEFT JOIN левое внешнее объединение;
RIGHT JOIN правое внешнее объединение.
Сразу после способа объединения необходимо поместить фразу
ON Таблица1.Ключ = Таблица2.ВнешнийКлюч
Ключ - имя ключевого поля со стороны 1.
Внешний Ключ - имя связующего поля со стороны N.
Схема данных
На рисунке представлена схема объединения таблиц (схема данных), которая будет использоваться для большинства приводимых ниже примеров. Из рисунка, например, видно, что у таблицы “Экзаменаторы” поле “Предмет” является ключевым (выделено жирным шрифтом), а поле “Преподаватель” – внешним ключом для таблицы “Преподаватели”. Объединение между указанными таблицами – внутреннее с обеспечением целостности данных. Об этом свидетельствуют знаки 1 и ¥ на концах связующей линии (“Преподаватели” – главная таблица, а “Экзаменаторы” – подчиненная). При внешнем объединении можно увидеть на линии объединения таблиц стрелку, направленную к подчиненной таблице. Это значит, что в главной таблице будут показаны все записи, даже если им нет соответствующих записей в подчиненной. Например, можно получить список преподавателей и названий предметов. Если некоторого преподавателя нет в таблице “Экзаменаторы”, то поле названия предмета этого преподавателя будет пусто, если используется объединение LEFT JOIN.
Пример
FROM Экзаменаторы INNER JOIN Экзамены
ON Экзаменаторы. Предмет = Экзамены. Предмет
В предложении FROM перед зарезервированными словами INNER JOIN указывается имя таблицы со стороны 1 (в нашем случае таблица “Экзаменаторы”). Если в предложении FROM больше двух таблиц, то объединение двух таблиц можно заключить в круглые скобки и рассматривать его как одну таблицу при объединении с другими таблицами или объединениями. Таким способом можно описать объединение любого числа таблиц.
Пример
FROM Преподаватели INNER JOIN (Экзаменаторы
INNER JOIN Экзамены
ON Экзаменаторы. Предмет = Экзамены. Предмет)
ON Преподаватели. Преподаватель = Экзаменаторы. Преподаватель
Описана вся схема данных (см. рисунок).
SELECT
Инструкция SELECT обеспечивает выборку необходимых полей из таблиц или запросов. Формат минимального варианта:
SELECT поля
FROM таблицы;
Поля -множество выражений и имен полей, разделенных запятыми.
Пример
SELECT Группа, Студент, Оценка
FROM Экзамены;
Если имя повторяется в нескольких таблицах, перечисленных в предложении FROM, то перед именем надо поместить имя таблицы и точку, например: [Экзаменаторы]. Преподаватель или [Экзамены]. [Предмет]
Если имя таблицы или поля содержит пробел или другой спецсимвол, то это имя нужно заключить в квадратные скобки. В других случаях скобки необязательны.
В приведенном примере в режиме таблицы запрос выдает таблицу с заголовками столбцов “Группа”, ”Студент”, ”Оценка” (именно в этом порядке). Иногда бывает желательно, чтобы заголовок отличался от имени поля. В этом случае после имени поля следует поместить зарезервированное слово AS и заголовок (псевдоним), например:
SELECT Группа, Студент AS ФИО, Оценка
В этом случае вместо заголовка “Студент” появится “ФИО”. Если в заголовке более одного слова, его необходимо заключить в квадратные скобки.
Если необходимо выдать все поля таблицы, то аргумент поля следует задать звездочкой или в виде “Таблица.*”.
Пример
SELECT Преподаватели.*
FROM Преподаватели;
Выдаются все 5 полей из таблицы “Преподаватели”.
Иногда требуется выдать не значение поля, а результат вычислений над значениями полей. В этом случае вместо имени поля надо задать выражение. Правила записи выражений не отличаются от правил, применяемых в конструкторе запросов.
Пример
SELECT Avg([Оценка]) As [Средний балл]
FROM Экзамены;
Запрос выдает одно число в столбце с заголовком “Средний балл” – среднее арифметическое всех оценок студентов.
Пример
SELECT Count ([Преподаватель]) As [Число преподавателей]
FROM Преподаватели;
Под заголовком“Число преподавателей” будет помещено число строк таблицы “Преподаватели”, в которых поле “Преподаватель” не пусто (а оно всегда не пусто, так как является ключевым). Это и есть число преподавателей, так как в каждой записи есть номер преподавателя, отличный от номеров других преподавателей.
В инструкции SELECT сразу после слова SELECT может быть записан предикат – одно из слов ALL, DISTINCT, DISTINCTROW, TOP N [PERCENT].
Предикат ALL предписывает выдавать все записи, даже если они содержат повторы.
DISTINCT запрещает выводить записи, содержащие повторы в отобранных полях. Использование предиката DISTINCT эквивалентно установке значения “Да” свойства “Уникальные значения” в бланке свойств конструктора запросов.
DISTINCTROW влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц. Предикат игнорируется, если запрос содержит только одну таблицу. Предикат DISTINCTROW исключает записи, повторяющиеся полностью. Использование предиката DISTINCTROW эквивалентно установке значения “Да” свойства “Уникальные записи” в бланке свойств конструктора запросов.
Предикат Top N используется для возврата N записей, находящихся в начале или конце набора, отсортированного по возрастанию или убыванию значений этого поля. Сортировка определяется с помощью предложения ORDER BY, размещаемого после предложения FROM инструкции SELECT.
После слов ORDER BY надо поместить имя поля и слово ASC (по возрастанию, не обязательно) или DESC (по убыванию). Следующая инструкция SQL позволяет получить список из 5 лучших студентов.
Успеваемость
Таблица 1
Предмет
Группа
Студент
Средний балл
Волков
Медведев
Белкин
Лисицын
Воробьев
Кротова
2,4
4,5
5,0
2,1
3,3
4,8
Пример
SELECT TOP 5 Студент, [Средний балл]
FROM Успеваемость
ORDER BY[Средний балл] DESC;
Пример
SELECT DISTINCT [Студент]
FROM Экзамены
ORDER BY [Студент];
Запрос выдает список студентов, отсортированный по возрастанию фамилий.
WHERE
После предложения FROM инструкции SELECT можно написать предложение WHERE в форме
WHERE условие
Условие - логическое выражение, которое вычисляется для каждой записи исходной таблицы.
Если условие истинно, то запись (совокупность полей в списке полей предложения SELECT) включается в результирующее множество, если ложно – не включается.
Пример
SELECT DISTINCT Группа, Студент
FROM Экзамены
WHERE Оценка = 2;
Создается список студентов – двоечников.
Пример
SELECT [ФИО]
FROM Преподаватели
WHERE [Должность]=”Доцент” OR [Степень]=”К.т.н.”
ORDER BY [ФИО];
Выдается список преподавателей, имеющих ученое звание доцента или ученую степень кандидата технических наук. В этом примере нет необходимости применять предикат, поскольку записи принадлежат разным преподавателям, и повторы невозможны.
При отборе строковых выражений можно использовать оператор Выражение Like шаблон, который проверяет соответствие результата вычисления выражения шаблону. В шаблоне могут использоваться некоторые символы, имеющие специальное назначение:
* любое количество любых символов;
# цифра;
? любой символ.
В квадратных скобках можно указать диапазон, в котором находится или не находится символ.
[A-F] символ в диапазоне от A до F включительно.
[!A-F] символ не входит в диапазон A-F.
Пример
SELECT [ФИО]
FROM Преподаватели
WHERE [ФИО] LIKE “B*” OR [ФИО] LIKE “Щ*”;
В результирующее множество войдут фамилии преподавателей, начинающиеся с букв Д или Щ.
Пример
Х LIKE “P[A-F]###”
Написанному условию удовлетворяют строки из 5 символов, начинающиеся с буквы Р. За ней должна следовать буква из диапазона A-F. Строку должны завершать 3 цифры.
PARAMETERS
Если перед каждым выполнением запроса необходимо изменять условия отбора, удобно использовать предложение вида:
PARAMETERS тексты;
Тексты - список текстов, разделенных запятыми.
После каждого текста через пробел указывается тип данных. При выполнении запроса с параметрами не требуется открывать окно конструктора запросов и вносить изменения в условия отбора. Вместо этого пользователю предлагается ввести нужное условие во время выполнения запроса. Для каждого текста из предложения PARAMETERS на экране появляется диалоговое окно, где каждый текст из описания играет роль подсказки – что именно нужно ввести. В диалоговое окно следует ввести данное указанного типа.
Текст, содержащий пробелы и знаки препинания, необходимо заключить в квадратные скобки. Тип данных TEXT указывать не обязательно.
Если используется предложение PARAMETERS, оно должно находиться перед всеми остальными инструкциями, в том числе и перед инструкцией SELECT, и заканчиваться точкой с запятой.
Пример
PARAMETERS [Укажите начальную дату] DATETIME,
[Укажите конечную дату] DATETIME;
В условиях отбора предложений WHERE и HAVING можно использовать текст без указания типов данных. При выполнении запроса текст заменяется на введенное значение.
Пример
PARAMETERS [Укажите группу] TEXT;
SELECT Студент, Оценка
FROM Экзамены
WHERE [Группа]=[Укажите группу] And [Предмет]=1;
Запрос выдает оценки студентов указанной группы по предмету с кодом 1.