Язык запросов состоит из одной команды SELECT. Она используется совместно с множеством опций и предложений.
Синтаксис простейшей формы оператора SELECT:
SELECT {*| ALL | field1, field2, …, fieldN} FROM table1 { , table2, …, tableN}
- Имена полей в списке разделяются через запятую;
- Для выборки всех полей используется символ подстановки (*);
- Опция ALL (задана по умолчанию) означает, что результат выборки будет содержать все записи, включая дублирующие друг друга;
- При использовании опции DISTINCT результат не будет содержать дублирующих строк;
- Если имена полей содержат пробел, они заключаются в квадратные скобки.
Условия при выборки данных задаются с помощью предложения WHERE.
Операторы сравнения: =, , >, =, <=. p="">
Логические операторы:
- BETWEEN … AND применяется для отбора записей, в которых значения поля находится внутри заданного диапазона;
- IN применяется для выборки записей, в которых значение некоторого поля соответствует хотя бы одному из значений заданного списка;
- LIKE применяется для сравнения значения поля со значением, заданным при помощи шаблонов.
Операторы объединения
- AND – для каждой записи, включаемой в результат должны выполняться все заданные ограничения;
- OR – запись включается в результирующую выборку в случае выполнения хотя бы одного из заданных ограничений;
- При использовании операторов объединения каждое логическое выражение заключается в скобки.
Что бы не делать лишних запросов в базу данных, используйте переменные ORDER BY и суфиксы.
Для упорядочения данных в выборке используется предложение ORDER BY. Синтаксис:
ORDER BY FIELD {ASC | DESC}
- ASC – по возрастанию;
- DESC – по убыванию;
- Вместо имени поля, можно использовать порядковый номер поля в списке после слова SELECT.
Псевдонимы – измененные имена полей. Применяются при задании вычисляемых полей. Псевдоним помещается после имени поля или после вычисляемого предложения через ключевое поле AS: SELECT [Код товара], Заказано, Продано, Цена, Цена*Продано AS [Сумма продажи]
Группировка записей – объединение записей в соответствии со значениями некоторого заданного поля. Предложение GROUP BY. Совместно с ним используются функции агрегирования. В этом случае они применяются для вычисления итоговых значений по отдельным группам данных.
Использование вычисляемых полей
На основании данных таблицы «Продажи» вычислите для каждого товара сумму денег, полученных за проданный товар (произведение цены на количество проданного товара), и сумму, на которую заказано товаров (произведение цены на количество заказанного товара), а также разность между ними:
SELECT [Код товара], Цена, Заказано, Продано, Цена*Продано, Цена*3аказано, Цена*Заказано-Цена*Продано FROM Продажи
Псевдонимы полей
Задайте псевдонимы для вычисляемых полей в предыдущем запросе.
SELECT [Код товара], Цена, Заказано, Продано, Цена*Продано AS [Сумма продажи], Цена*3аказано AS [Сумма заказа], Цена*Заказано-Цена*Продано AS [Разность] FROM Продажи
Функции агрегирования
В таблице «Продажи» подсчитайте количество записей в поле «Продано», минимальное и максимальное количество проданных товаров, общую сумму проданных товаров и среднее значение проданных товаров.
SELECT COUNT(Продано) AS [Всего записей], МIN(Продано) AS min, МАХ(Продано) AS max, SUM(Продано) AS [Всего продано], AVG(Продано) AS [Среднее количество продаж] FROM Продажи
Группировка данных
Подсчитайте количество покупок товаров, сделанных каждым из клиентов.
SELECT [Код клиента], SUM(Продано) AS [Количество покупок] FROM Продажи GROUP BY [Код клиента]
В предыдущем запросе выберите только тех клиентов, которые сделали за один раз более 10 покупок, и упорядочьте результаты выборки в порядке возрастания:
Язык SQL позволяет извлечь данные из нескольких таблиц. При этом выполняется операция соединения. Способы соединения: соединение равенства, соединение неравенства, внешние соединения. Для задания вида соединения используется предложение WHERE.
Соединение равенства производится по общему для нескольких таблиц полю. Синтаксис:
SELECT table1.field1, table2.field2 {, …, tableN.fieldN} FROM table1, table2 {, …, tableN} WHERE table1.common_field1= table2.common_field1 {AND table1.common_field2= table2.common_field2}
При использовании внешнего соединения результат запроса будет содержать все записи одной из таблиц, даже в том случае, если в связанной с ней таблице отсутствуют совпадающие значения. Реализуется с помощью оператора OUTER JOIN:
SELECT table1.field1, table2.field2 {, …, tableN.fieldN} FROM table1 LEFT | RIGHT | FULL {OUTER} JOIN table2 ON условие {LEFT | RIGHT | FULL {OUTER} JOIN table3 ON условие}
LEFT – левое внешнее соединение, RIGHT – правое внешнее соединение, FULL – полное внешнее соединение.
Подзапрос – запрос, помещенный внутри другого запроса.
- Подзапросы должны заключаться в круглые скобки;
SELECT {*| ALL | field1, field2, …, fieldN} FROM table1 { , table2, …, tableN} WHERE условие (SELECT {*| ALL | field1, field2, …, fieldN} FROM table1 { , table2, …, tableN} WHERE условие)
- Предложение ORDER BY может быть использовано только в основном запросе;
- Подзапросы, возвращающие более одной записи, могут использоваться только с многозначными операторами;
- В основном запросе нельзя использовать оператор BETWEEN.
Запросы, включающие в себя несколько операторов SELECT, называются составными. Правила объединения запросов:
- каждый из запросов, входящих в объединение, должен возвращать одинаковое количество полей;
- типы полей, возвращаемых в результате выполнения каждого запроса, должны совпадать.
- при использовании оператора UNION результаты выполнения отдельных запросов объединяются, дублирующие друг друга записи исключаются;
- при использовании оператора UNION ALL в результирующую выборку включаются дублирующие записи;
Примеры
Выбрать записи из двух таблиц, используя соединение равенства.
Выбрать из таблицы «Клиенты» поля, содержащие сведения об именах клиентов, а из таблицы «Продажи» — поля, в которых содержатся сведения о покупках, сделанных клиентами. Для связывания таблиц воспользуемся общим для обеих таблиц полем «Код клиента»:
SELECT Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество, Продажи.Продано FROM Клиенты, Продажи WHERE Клиенты.[Код клиента]=Продажи.[Код клиента]
Дополнить данный запрос предложением группировки и полем, содержащим функцию агрегирования.
Изменить рассмотренный выше запрос таким образом, чтобы результаты были сгруппированы по полям «Фамилия», «Имя», «Отчество» и для каждого клиента выводилось суммарное количество покупок:
SELECT Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество, SUM(Продажи.Продано) AS [Количество покупок] FROM Клиенты.Продажи WHERE Клиенты [Код клиента]=Продажи [Код клиента] GROUP BY Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество
Выбрать записи из трех взаимосвязанных таблиц.
Включить информацию о наименовании товара из таблицы «Товары»:
SELECT Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество, SUM(Продажи.Продано) AS [Количество покупок], Товары.Наименование FROM Клиенты, Продажи, Товары WHERE (Клиенты.[Код клиента]=Продажи.[Код клиента]) AND (Продажи.[Код товара]=Товары.[Код товара]) GROUP BY Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество, Товары.Наименование
Создать левое и правое внешние соединения.
Выбрать из таблицы «Товары» список товаров, из таблицы «Продажи» — суммарное количество проданных товаров:
SELECT Товары.[Наименование], SUM(Продажи.Продано) AS [Всего продано] FROM Товары LEFT OUTER JOIN Продажи ON Товары.[Код товара]=Продажи.[Код товара] GROUP BY Товары.[Наименование]
Создать сложный запрос, использующий подзапрос.
Выбрать из таблицы «Продажи» информацию о продажах товара с наименованием «Delphi 5»:
SELECT [Код клиента]. Заказано, Продано. Цена FROM Продажи WHERE [Код товара]=(SELECT [Код товара] FROM Товары WHERE Наименование='Delphi 5')