Язык запросов и команда select

Краткий формат команды SELECT представлен ниже:

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"); Результат запроса: язык запросов и команда select - student2.ru
Ограничения на выборку: Предикат 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 Заказ);

Наши рекомендации