Инструкция SELECT может быть вложена в другую инструкцию (SELECT, DELETE или UPDATE). Такой запрос называется подчиненным. Подчиненные запросы можно использовать в режиме SQL окна запроса, в ячейках “Условие отбора” и “Поле” конструктора запросов и в инструкциях SQL в программах на языке Access Basic. Ниже рассматривается лишь вариант подчиненного запроса в режиме SQL. В этом случае он представляется в виде инструкции SQL, заключенной в круглые скобки. Если инструкция SQL выдает единственное значение, то ее можно использовать в условных выражениях предложений WHERE и HAVING.
Пример
SELECT Группа, Студент
FROM Успеваемость
WHERE [Средний балл]>(SELECT Avg([Средний балл])
FROM Успеваемость);
Групповая функция Avg выдает единственное число – средний балл по всем студентам. Если средний балл студента в главном запросе превосходит это число, то данные о студенте включаются в результирующее множество.
Пример
SELECT У.Группа,У.Студент
FROM Успеваемость AS У
WHERE Группа=1 And У.[Средний балл]>=
ALL (SELECT Avg([Средний балл])
FROM Успеваемость
WHERE Группа=2 )
ORDER BY Студент;
Подчиненный запрос выдает совокупность средних баллов студентов второй группы. Перед подчиненным запросом стоит предикат ALL, который влияет на результат сравнения. В нашем случае выражение, включающее операцию сравнения, имеет вид:
[Средний балл]>=ALL(Подчиненный запрос)
В общем случае слева от знака сравнения стоит выражение, а знак сравнения может быть любым из списка (=,<>,<,>,<=,>=). Подчиненный запрос выдает множество значений. Значение выражения слева сравнивается с каждым из значений, возвращаемых подчиненным запросом. Результат сравнения принимает значение TRUE, если все сравнения со значениями подчиненного запроса истинны. В нашем случае в результирующее множество попадают студенты, средние баллы которых не меньше среднего балла любого студента второй группы.
Наряду с ALL находит применение предикат ANY (синоним SOME). В этом случае предикат принимает значение TRUE, когда результат сравнения хотя бы с одним из возвращаемых подчиненным запросом значений принимает значение TRUE.
Если выражение или некоторое значение из возвращаемых подчиненным запросом равно NULL, результат не определен при любом изупомянутых предикатов. Если в результате выполнения подчиненного запроса не возвращается никаких значений, то предикат принимает значение FALSE.
В рассматриваемом примере выдается пустая таблица, так как в
Экзаменаторы
Таблица 3
Предмет
Название предмета
Преподаватель
Дата
Информатика
Математика
Кибернетика
5.01.99
8.01.99
12.01.99
первой группе (табл. 1) нет студентов, средний балл которых был бы не ниже среднего балла любого из студентов второй группы, например Белкина. Если заменить предикат ALL на ANY (или SOME), то все 4 студента первой группы попадут в результирующую таблицу, так как
Преподаватели
Таблица 4
Преподаватель
ФИО
Должность
Степень
Звание
Соловьев
Щеглов
Воробьев
Ассистент
Профессор
Доцент
Д.т.н
К.т.н
Профессор
Доцент
все они учатся лучше Лисицына.
Пример
SELECT [Название предмета], Дата
FROM Экзаменаторы AS Э
WHERE Э.Преподаватель IN (SELECT Преподаватель
FROM Преподаватели
WHERE Должность=”Профессор”);
В этом примере применен предикат IN, сравнивающий выражение слева от него (поле “Преподаватель” из таблицы “Экзаменаторы”) со списком значений, выдаваемых подчиненным запросом. В результате главный запрос выдает название предмета и дату экзаменов, которые проводят профессора ( математика, 8.01.99 ).
В главном запросе введен псевдоним Э для таблицы “Экзаменаторы”. Для каждой таблицы и каждого запроса можно при желании определить альтернативное имя. Это имя можно использовать как псевдоним вместо полного имени таблицы при задании имен столбцов в списке выбора, в предложении WHERE или в подчиненных предложениях. Если имя таблицы или имя запроса совпадает с зарезервированным словом языка SQL (например ORDER), такое имя нужно заключить в квадратные скобки.
Пример
SELECT [Название предмета], Дата
FROM Экзаменаторы AS Э
WHERE NOT EXISTS
(SELECT * FROM Экзаменаторы
INNER JOIN Экзамены
ON Экзаменаторы.Предмет=Экзамены.Предмет
WHERE Оценка=2
AND Экзамены.Предмет=Э.Предмет);
Предикат EXISTS проверяет не значения отдельных полей, а наличие или отсутствие в подчиненном запросе записей, удовлетворяющих условиям отбора в предложениях WHERE и HAVING. Поскольку отдельные поля не возвращаются, в подчиненном запросе список полей представлен звездочкой. В данном примере запрос выдает список предметов, по которым нет двоек, и даты экзаменов (математика 8.01.99, кибернетика 12.01.99).
Внутренний запрос содержит ссылку на поле внешней таблицы (псевдоним Э). В таких случаях подчиненный запрос выполняется для каждой записи внешнего запроса.
UPDATE
Инструкция UPDATE позволяет производить изменения сразу во всех полях таблицы. Синтаксис:
UPDATE таблицы SET присваивания WHERE условие
Таблицы - отдельная таблица или объединение таблиц, как в предложении FROM.
Присваивания - последовательность присваиваний, разделенных запятыми. Каждое присваивание имеет вид “поле=выражение”.
В указанной таблице для всех записей, удовлетворяющих условию, производятся присваивания.
Пример
UPDATE Экзаменаторы SET [Дата]=[Дата]+1
WHERE [Название предмета]=”Информатика”
Даты всех экзаменов по информатике сдвигаются на один день вперед.
Особенно удобно использовать инструкцию UPDATE, если требуется изменить сразу много записей или записи, подлежащие изменению, находятся в разных таблицах.
INSERT
Инструкция INSERT вставляет одну или несколько новых строк в таблицу или запрос. Вариант
INSERT INTO таблица SELECT …;
вставляет в таблицу строки, отобранные инструкцией SELECT. После имени таблицы можно указать в круглых скобках список столбцов, в которые помещаются новые значения. Запрос INSERT выполняется только в том случае, когда вставляемые данные удовлетворяют установленным ограничениям на значения столбцов, условию на значения для таблиц и на целостность данных.
В следующем примере используется таблица “Новые преподаватели”, в которой содержатся сведения о преподавателях, проходящих месячный испытательный срок.
INSERT INTO Преподаватели
SELECT Преподаватель, ФИО, Должность, Степень, Звание
FROM [Новые преподаватели]
WHERE Дата<Now()-30;
Если требуется добавить только одну запись, можно использовать другой вариант инструкции INSERT.
INSERT INTO таблица VALUES(список_значений)
или
INSERT INTO таблица (список_полей) VALUES (список_значений)
Если список полей опущен, предложение VALUES должно содержать значения для каждого поля таблицы.
Пример
INSERT INTO Преподаватели (Преподаватель, ФИО,Должность)
VALUES (7, ”Журавлев”, ”Ассистент”);
DELETE
DELETE таблица.* FROM таблицы WHERE условие;
Инструкция DELETE позволяет удалять записи из таблиц, перечисленных в предложении FROM. Удаляются записи, удовлетворяющие условию WHERE.
Если в предложении FROM указана одна таблица, то ее можно обозначить звездочкой. Таблицу можно удалить с помощью инструкции
DROP таблица;
Удаление данных из отдельных полей можно осуществить с помощью инструкции UPDATE, в которой следует указать SET поле=Null.
Пример
DELETE * FROM Преподаватели WHERE Преподаватель=3;