Диго С.М. Базы данных проектирование и использование (1084447), страница 51
Текст из файла (страница 51)
SELECT сотрудник.ФИО, предмет.название_предмета_краткое
FROM сотрудник
INNER JOIN (предмет
INNER JOIN вл_предмет ON предмет.Код_предмета = вл_предмет.-
код_предмета)
ON сотрудник.Код_сотрудника = вл_предмет.код_сотрудника;
Если не использовать предложение JOIN для выполнения операций объединения нескольких таблиц, результирующий объект Recordset нельзя будет изменять.
Вместо вложенной операции JOIN можно использовать подчиненный запрос.
Предложение WHERE
В предложении WHERE указывается условие отбора. При задании условий отбора используются определенные ограничители, зависящие от типа поля, для которого задается условие отбора. Если при задании запроса на QBE ограничители можно не задавать при вводе запроса (система их введет автоматически), то при задании запроса на SQL необходимо самим правильно определить требуемый ограничитель.
Предложение WHERE может содержать до 40 выражений, связанных логическими операторами.
Имеются некоторые особенности задания запросов в MS Jet SQL. Так, например, при указании аргумента «Условие Отбора» даты должны вводиться в американском формате8, даже если используется неамериканская версия ядра базы данных Jet. Например, дата 23 февраля 1946 г. записывается в России как 23.02.46, а в США как 2/23/46. Даты заключаются в символы «решетки» (#).
В QBE допускается ввод дат в европейском формате. Если запрос на QBE преобразовать в запрос на SQL, то изменение формата даты будет проведено автоматически. Так будет выглядеть запрос, изображенный на рис. 7.7, в формате SQL:
SELECT сотрудник.ФИО, сотрудник.Дата_рождения
FROM сотрудник
WHERE (((сотрудник.Дата_рождения)<#2/23/1946#));
В Microsoft Access SQL конструкции BETWEEN...AND имеет такой же синтаксис, как и в ANSI SQL:
выражение1 [NOT] BETWEEN выражение2 AND выражение3
Но правила, применимые к ним, различаются: в Microsoft Access SQL «выражение2» может быть больше, чем «выражение3», а в ANSI SQL - нет.
В приведенном ниже примере выдаются сведения о зарплате сотрудников, чей оклад находится в диапазоне от 1000 до 2000.
SELECT ФИО, оклад
FROM сотрудник
WHERE оклад Between 1000 And 2000;
Для отбора записей по части значения какого-либо поля используется предикат LIKE. В Microsoft Access SQL в предикате LIKE используются иные символы шаблона, чем в стандарте:
Символ шаблона | Microsoft Access SQL | ANSI SQL |
Любой один символ | ? | _ (подчеркивание) |
Любая группа любых символов | * | % |
Ниже приведен запрос, в котором используется предикат LIKE. Он выводит фамилии и автобиографии тех сотрудников, у которых в поле «Автобиография» встречается упоминание о Москве:
SELECT ФИО, автобиография
FROM сотрудник
WHERE автобиография LIKE "*Москв*";
Следует обратить внимание на то, подобный поиск может дать некоторый «шум».
При использовании режима ANSI SQL-92 обеспечивается поддержка подстановочных знаков ANSI, т.е. знак процента (%) и символ подчеркивания (_) также являются частью режима ANSI SQL-92. В одном запросе смешивать знаки нельзя.
Предложение GROUP BY
Предложение GROUP BY позволяет группировать записи по одному полю или совокупности полей, указанных в этой фразе. Порядок следования полей в списке имеет значение, поскольку именно он будет определять старшинство признаков группировки. Допускается до десяти уровней группировки. Нельзя осуществлять группировку по полям, имеющим тип MEMO или объект OLE.
Обычно GROUP BY используется вместе со статистическими функциями, позволяющими проводить вычисления для сформированных групп.
Оператор SELECT, содержащий предложение GROUP BY, обычно в качестве полей, выводимых в ответ, включает поля, по которым проводится группировка, и одну (или несколько) статистическую функцию SQL. В Access используются следующие статистические функции: Avg, Count, First, Last, Min, Max, StDev, StDevP, Sum, Var, VarP. Статистические функции First, Last, StDev, StDevP, Var, VarP в стандарте SQL отсутствуют.
Значения Null, которые находятся в полях, заданных в предложении GROUP BY, группируются и не опускаются. Однако статистические функции SQL значения Null не обрабатывают.
Ниже приведен пример запроса для определения числа сотрудников на каждой кафедре:
SELECT [код кафедры], Count (ФИО) AS [число_сотрудников]
FROM сотрудник
GROUP BY [код кафедры];
Предложение HAVING
В оператор SELECT, содержащий предложение GROUP BY, могут быть включены как предложение WHERE, так и HAVING. Предложение WHERE используется для исключения записей из группировки, a HAVING - для применения фильтра к записям после группировки.
Предложение HAVING имеет следующий синтаксис:
[HAVING условиеГруппировки]
Ниже приведен пример запроса, показывающего число сотрудников на кафедрах с численностью более пяти человек:
SELECT [код кафедры], Count(ФИО) AS [число_сотрудников]
FROM сотрудник
GROUP BY [код кафедры]
HAVING Count(ФИО)>5;
Предложение HAVING может содержать до 40 выражений, связанных логическими операторами AND и OR.
Предложение ORDER BY
Предложение ORDER BY используется для сортировки записей, полученных в результате запроса, в порядке возрастания или убывания на основе значений указанного поля (или полей).
Предложение ORDER BY выглядит следующим образом:
[ORDER BY попе J [ASC | DESC ][, поле_2 [ASC | DESC ]][, ...]]],
где поле_1, поле_2 - имена полей, по которым сортируются записи, ASC - упорядочение по возрастанию, DESC - упорядочение по убыванию. По умолчанию используется порядок сортировки по возрастанию (от А до Я и от 0 до 9).
Для сортировки по убыванию (от Я до А и от 9 до 0) следует добавить зарезервированное слово DESC после имени каждого поля, которое нужно отсортировать в убывающем порядке.
Предложение ORDER BY может содержать несколько полей. Сначала записи сортируются по первому полю в списке ORDER BY.
Затем записи, имеющие совпадающие значения в первом поле, сортируются по второму полю и т.д.
В приведенном ниже операторе SQL записи сортируются по убыванию окладов, а внутри группы одинаковых окладов - по возрастанию ФИО:
SELECT Фамилия, Оклад
FROM Сотрудники
ORDER BY Оклад DESC, Фамилия;
Нельзя осуществлять сортировку по полям типа MEMO или объекта OLE.
Предложение ORDER BY обычно является последним элементом инструкции SQL.
7.9.2. Подчиненные запросы SQL
Подчиненный запрос - это оператор SELECT, вложенный в операторы SELECT, SELECT..INTO, INSERT...INTO, DELETE или UPDATE либо в другой подчиненный запрос.
Вложенный запрос в общем случае возвращает какое-то множество записей. Для отбора этих записей во внешнем запросе могут быть использованы:
сравнение [ANY | ALL | SOME] (оператор);
выражение [NOT] IN (оператор);
[NOT] EXISTS (оператор),
где
сравнение - выражение и оператор сравнения, сравнивающий это выражение с результатом выполнения подчиненного запроса;
выражение - выражение, которое должно быть найдено в наборе записей, являющихся результатом выполнения подчиненного запроса;
оператор - правильный оператор SELECT, заключенный в круглые скобки, который и является вложенным запросом.
Подчиненный запрос обычно используется в предложении WHERE или HAVING.
Предикаты ANY или SOME являются синонимами. Они используются для отбора в главном запросе записей, которые удовлетворяют сравнению с какой-либо из записей, отобранных в подчиненном запросе.
В операторе подчиненного запроса SELECT нельзя задавать запрос на объединение или перекрестный запрос.
Ниже в виде вложенного запроса представлен запрос «Список сотрудников, имеющих детей»:
SELECT сотрудник.ФИО
FROM сотрудник
WHERE сотрудник.код_сотрудника=АNY (SELECT код_сотрудника
FROM дети);
Этот же запрос может быть представлен с использованием предиката IN:
SELECT фио
FROM сотрудник
WHERE код_сотрудника IN
(SELECT код_сотрудника
FROM дети);
Список сотрудников, не имеющих детей, можно выдать, используя запрос
SELECT фио
FROM сотрудник
WHERE код_сотрудника NOT IN
(SELECT код_сотрудника
FROM дети);
или запрос с использованием предиката ALL:
SELECT сотрудник.фио
FROM сотрудник
WHERE сотрудник.код _сотрудника <>ALL (SELECT код_сотрудника
FROM дети);
Тот же запрос с использованием встроенного оператора JOIN может быть представлен в виде
SELECT сотрудник.фио
FROM сотрудник LEFT JOIN дети
ON сотрудник.код_сотрудника = дети.код_сотрудника
WHERE ((дети.фио_ребенка) IS NULL);
7.9.3. Корректирующие операторы
Добавление
Запрос, приводящий к добавлению новых записей в конец существующей таблицы, называется запросом на добавление. Эти действия можно выполнить при использовании оператора INSERT.
Для добавления одной записи может быть использован оператор
INSERT INTO назначение [(поле_1[, поле_2[, ...]])]
VALUES (значение_1[, значение_2[,...])
Список полей может не задаваться, если значения вводятся во все поля, определенные в структуре таблицы.
Пример 1
INSERT INTO сотрудник
VALUES (32, "Ли", #12/30/189912:14:46#, "м", 1, #12/12/1970#, 2000, 1000, yes, "доцент", 21);
В примере 1 вводятся значения во все поля записи в таблице «Сотрудник», поэтому список полей в предложении INSERT INTO отсутствует.
Пример 2
INSERT INTO сотрудник (фио)
VALUES ("Мун");
Если не все поля определены в операторе INSERT (см. пример 2), в недостающие столбцы будет вставлено значение по умолчанию или значение Null.
В таблицу могут вводиться данные, полученные в результате выполнения запроса. В этом случае оператор выглядит следующим образом:
INSERT INTO назначение [(поле_1[, поле_2[,...]])] [IN внешняя БазаДанных]
SELECT [источник.]поле_1[, поле_2[,...]
FROM выражение
Пример 3
INSERT INTO сотрудник2
SELECT Сотрудник.Код_сотрудника AS Код_сотрудника, Сотрудник.ФИО AS ФИО, Сотрудник.Дата_рождения AS Дата_рождения, Сотрудник.Оклад AS Оклад
FROM сотрудник;
Если названия соответствующих полей в целевой таблице и в таблице, получающейся в результате выполнения вложенного SELECT, отличаются друг от друга, то в SELECT можно воспользоваться конструкцией AS, чтобы привести названия полей в соответствие друг другу (в качестве алиасных имен следует задать имена, используемые в целевой таблице). Использование разных имен в целевой таблице и таблице, получаемой в результате выполнения операции SELECT, также возможно. Необходимо только, чтобы они имели соответствующие друг другу типы данных.
Если в предложении SELECT перечислены не все поля, которые имеются в «целевой» таблице, то данные будут добавляться только в те поля, которые обозначены в SELECT.
Запрос на добавление из другой таблицы можно сконструировать, используя табличный язык QBE (см. разд. 6.2).
Обновление
Запрос на обновление изменяет значения некоторых полей указанной таблицы. Записи, которые подвергаются изменению, определяются на основе заданного условия отбора: