SELECT [ ALL | DISTINCT ] {*| [имя_столбца [AS новое_имя]]} [, …n]
FROM имя_таблицы [[AS] псевдоним] [, …n]
[WHERE <условие_поиска>]
[GROUP BY имя_столбца [, …n]]
[HAVING <критерии_выбора_групп>]
[ORDER BY имя_столбца [, …n]];
Обработка элементов оператора выполняется в следующей последовательности:
- FROM – определяются имена используемых таблиц;
- WHERE – выполняется фильтрация строк объекта в соответствии с заданными условиями;
- GROUP BY – образуются группы строк, имеющих одно и то же значение в указанном столбце;
- HAVING – фильтруются группы строк объекта в соответствии с указанным условием;
- SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных;
- ORDER BY – определяется упорядоченность результатов выполнения операторов.
Внимание! Только два предложения и являются обязательными, все остальные могут быть опущены.
Таблица 4.2
Основные предикаты оператора SELECT и примеры выборок
Описание выборки
Примеры
Простая выборка
SELECT поле1, …, поле2, …, полеN
FROM таблица1;
Замечания:
- колонкам можно присваивать алиасные имена (псевдонимы);
- таблицам можно присваивать алиасные имена (псевдонимы);
- имена полей, содержащие пробелы или разделители, заключаются в квадратные скобки;
- символ-заменитель * означает выборку всех полей, что соответствует ключевому слову ALL;
- предикат DISTINCT следует применять в тех случаях, когда требуется отбросить блоки данных, содержащие дублирующие записи в выбранных полях;
Выбрать информацию о клиентах:
SELECT Фамилия, Имя, Отчество
FROM Клиент;
Выбрать фамилии клиентов:
SELECT fio AS ФИО
FROM Клиент;
Использование псевдонимов – выбрать информацию о количестве заказанных путевок (поле kol) из таблицы Заказ:
SELECT Заказ.kol AS [Количество_ заказанных_путевок]
FROM Заказ;
Выбрать всю информацию из таблицы Клиент:
SELECT ALL *
FROM Клиент;
или
SELECT *
FROM Клиент;
Выбрать, без повторов список имен клиентов:
SELECT DISTINCT Имя
FROM Клиент;
Выборка с условием отбора
SELECT поле1, …, поле2, …, полеN
FROM таблица1
WHERE условие;
Замечания:
- даты заключаются в символы диезов (#) и вводятся в SQL в формате: мм/дд/гг;
- в условиях могут использоваться операторы сравнения, логические операторы, а также скобки, используемые для определения порядка вычисления выражения;
- в условиях отбора могут применяться операторы принадлежности к диапазону или множеству или соответствия шаблону или значению NULL:
Выбрать информацию о турах с транспортом авиа:
SELECT Название_тура, Транспорт, Проживание
FROM Туры
WHERE (Транспорт="авиа");
Выбрать информацию о турах, цена путевки которых >1 500 ?:
SELECT Название_тура, Цена_путевки
FROM Туры
WHERE (Цена_путевки>=1500);
Выбрать информацию о турах с ценами в диапазоне от 1000 до 2000 ?:
SELECT Название_тура, Цена_путевки
FROM Туры
WHERE Цена_путевки BETWEEN 1000 AND 1500;
Выбрать клиентов по имени Анна и Юлия:
SELECT Фамилия, Имя, Отчество
FROM Клиент
WHERE Имя IN ("Анна", "Юлия");
Выбрать фамилии клиентов, начинающиеся на букву К:
SELECT Фамилия
FROM Клиент
WHERE (Фамилия Like "К*");
Выбрать фамилии клиентов, с именами от А до М:
SELECT Клиент.Фамилия, Клиент.Имя
FROM Клиент
WHERE (Клиент.Имя Like "[А- М]*");
Список туров, которые имеются в наличие:
SELECT Название_тура, Наличие
FROM Туры
WHERE Наличие Is Not Null;
Выбрать данные для клиентов, фамилии которых начинаются на требуемую букву:
PARAMETERS [Введите первую букву] TEXT;
SELECT *
FROM Клиент
WHERE Клиент.Фамилия Like [Введите первую букву]& "*";
Выборка с параметром
PARAMETERS [Имя параметра1] ТипДанных1,
[Имя параметра2] ТипДанных2;
SELECT поле1, …, полеN
FROM таблица1
WHERE (поле1=[Имя параметра1]
AND (полеN=[Имя параметра2];
Описание типа параметра необходимо для текста, а также в перекрестных запросах.
Выбрать информацию по любому туру:
PARAMETERS [Введите название тура] TEXT;
SELECT Название_тура, Цена_путевки
FROM Туры
WHERE (Название_тура=[Введите название тура]);
Выбрать клиентов, у которых день рождения в месяце, название которого вводится как параметр:
PARAMETERS [Введите месяц] TEXT;
SELECT Фамилия, Имя, Отчество, Дата_рождения
FROM Клиент
WHERE (MonthName(Month(Дата_
рождения))=[Введите месяц]);
Выборка с вычислениями
SELECT поле1, …, поле2, …, выражение1 AS имя для вычисляемого поля, …
FROM таблица1
WHERE условие;
Замечания: Для проведения вычислений можно использовать функции разных категорий:
- математические: Sqr(), Abs(), Cos(), Sin() и др.;
- даты и времени: Date(), Now(), Day(), Month(), Year(), Weekday();
- статистические: Avg(), Count(), Max(), Min(), Sum();
- для работы с текстом: LCase(), UCase(), Left(), Right() и т.д.;
- финансовые функции: PV(), FV(), SLN();
- функции смешанного типа: IIF(), CCur(), CInt(), CStr(), Format().
На основании данных поля ФИО, содержащего информацию вида Иванов Иван Иванович, сформировать выражение в виде Иванов И.
SELECT Клиент.Фамилия, Клиент.Имя, Клиент.Отчество, Фамилия& " "&Left([Имя],InStr([Имя],
" ")+1)& "."&Left([Отчество],
InStr([Отчество]," ")+1)& "." AS ФИО
FROM Клиент;
Вывести списки клиентов по году рождения, вычисленному по полю [Дата_рождения]:
SELECT Фамилия, [Дата_рождения],
Year([Дата_рождения]) AS Год
FROM Клиент
WHERE (Year([Дата_рождения])=
[Введите год]);
Самая высокая цена на путевки:
SELECT Max(Цена_путевки) AS Стоимость
FROM Туры;
Выборка с упорядочением
SELECT поле1, …, поле2, …, полеN
FROM таблица1
ORDER BY поле1 [ASC|DESC];
Позволяет управлять порядком вывода результирующей выборки: ASC – по возрастанию (по умолчанию); DESC – по убыванию.
Выбрать информацию из таблицы Заказ и расположить ее в порядке убывания даты заказ:
SELECT *
FROM Заказ
ORDER BY Дата_заказа DESC;
Выборка по связанным таблицам
SELECT поле1, …, полеN
FROM таблица1 INNER JOIR таблица2 ON таблица1.полеСвязи
=таблица2.полеСвязи;
Связь таблиц может управляться соединением INNER JOIN, LEFT JOIN или RIGHT JOIN для возможности получения и контроля данных.
SELECT Клиент.Фамилия, Заказ.Название_тура
FROM Клиент INNER JOIN Заказ ON Клиент.Фамилия=Заказ.Название_тура;
Таблица 4.3
Агрегирование в операторе SELECT и примеры выборок
Описание выборки
Примеры
Группировка и итоговые функции:
SELECT поле1, …, итоговая функция AS имя для вычисляемого поля
FROM таблица1
GROUP BY поля группировки;
Замечание: Все имена полей, приведенные в списке предложения SELECT, должны присутствовать и во фразе GROUP BY – за исключением случаев, когда имя столбца используется в итоговой функции. Обратное правило не является справедливым – во фразе GROUP BY могут быть имена столбцов, отсутствующие в списке предложения SELECT.
Подсчитать сколько туров было заказано в каком количестве:
SELECT Количество_заказанных_путевок, COUNT (Код_тура) AS [Количество_туров]
FROM Заказ
GROUP BY Количество_заказанных_
путевок
ORDER BY Количество_заказанных_
путевок;
Определить суммарную стоимость каждого тура за каждый месяц:
SELECT Туры.Название_тура, Month (Заказ.Дата_заказа) AS Месяц, Sum(Туры.Цена_путевки*
Заказ.Количество_заказанных_путевок) AS [Стоимость]
FROM Туры INNER JOIN Заказ ON
Туры.Код_тура=Заказ.Код_тура
GROUP BY Туры.Название_тура,
Month(Заказ.Дата_заказа);
Группировка и условие отбора:
SELECT поле1, …, итоговая функция AS имя для вычисляемого поля
FROM таблица1
WHERE условие
GROUP BY поля группировки;
Если совместно с GROUP BY используется предложение WHERE, то оно обрабатывается первым, а группированию подвергаются только те строки, которые удовлетворяют условию поиска.
Определить суммарную стоимость каждого тура во Францию_(Париж) за каждый месяц:
SELECT Туры.Название_тура, Month(Заказ.Дата_заказа) AS Месяц, Sum(Туры.Цена_путевки*Заказ.Количество_заказанных_путевок) AS [Стоимость]
FROM Туры INNER JOIN Заказ ON
Туры.Код_тура=Заказ.Код_тура
WHERE Туры.Название_тура
="Франция_(Париж)"
GROUP BY Туры.Название_тура,
Month(Заказ.Дата_заказа);
Фильтрация после группировки:
SELECT поле1, …, итоговая функция AS имя для вычисляемого поля
FROM таблица1
GROUP BY поля группировки
HAVING условие;
При помощи HAVING отражаются все предварительно сгруппированные посредством GROUP BY блоки данных, удовлетворяющие заданным в HAVING условиям.
Вывести список туров, проданных на сумму более 5000 ?:
SELECT Туры.Название_тура, Sum(Туры.Цена_путевки*Заказ.Количество_заказанных_путевок) AS [Стоимость]
FROM Туры INNER JOIN Заказ ON
Туры.Код_тура=Заказ.Код_тура
GROUP BY Туры.Название_тура
HAVING Sum(Туры.Цена_путевки*Заказ.Количество_заказанных_путевок)>5000;
Перекрестный запрос:
TRANSFORM
Статистическая_функция
SELECT имена полей, по которым будет группировка по строкам
FROM таблица
GROUP BY поля группировки по строкам
PIVOT имя поля, из значений которого формируются заголовки столбцов перекрестного запроса;
Перекрестные запросы позволяют формировать результат выборки виде сводной таблицы, где слово PIVOT определяет подписи столбцов, а GROUP BY – определяет подписи строк при выборке и группировании агрегированных данных статистической функцией в слове TRANSFORM.
Определить суммарное количество путевок, заказанных на каждый тур:
TRANSFORM Sum(Заказ!Количество_
заказанных_путевок) AS [Суммарное_
количество_путевок]
SELECT Заказ.Код_тура
FROM Заказ.Туры
WHERE (((Заказ.Дата_заказа) Between #1/1/2008# And #12/31/2008#))
GROUP BY Заказ.Код_тура
PIVOT Format(Заказ!Дата_заказа,
"mmm","1","1");
Результат запроса:
Ограничения на выборку:
Предикат TOP N [PERCENT] вводится после оператора SELECT и возвращает определенное число записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Предикат не осуществляет выбор между равными значениями.
Получить список из 3 клиентов родившихся в октябре:
SELECT TOP 3 Фамилия, Имя, Отчество
FROM Клиент
WHERE (MonthName(Month([Дата_рождения]))=
"октябрь")
ORDER BY Фамилия DESC;
Таблица 4.4
Нетривиальные запросы (сложные выборки с подзапросами)
Описание выборки
Примеры
Вложенные подзапросы
Подзапрос – инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Текст подзапроса должен быть заключен в скобки.
Подзапрос может извлекать единичное значение и множество значений (табличный подзапрос).
Найти самого молодого клиента:
SELECT Фамилия, [Дата_рождения]
FROM Клиент
WHERE ([Дата_рождения]=
(SELECT MAX ([Дата_рождения])
FROM Клиент));
Определить названия туров, которые были заказаны:
SELECT Название_тура
FROM Туры
WHERE Код_тура IN
(SELECT Код_тура FROM Заказ);