Uploaded by Лиана Ибрагимова

SQL

advertisement
SQL (Structured Query Language) — это стандартизированный язык запросов,
используемый для управления и манипуляции данными в реляционных базах
данных.
Допустим, база данных — это большая библиотека, а данные — это книги.
SQL — это как система для запроса книг, где вы можете спрашивать, какие
книги есть, находить определенные книги, добавлять новые книги или удалять
ненужные. Так, используя SQL, можно легко находить, добавлять, обновлять
или удалять данные в базе данных.
База данных - это организованная коллекция данных, которая может быть
эффективно хранимой, управляемой и обрабатываемой. Базы данных
используются во множестве приложений от простых веб-сайтов до сложных
информационных систем.
Типы Баз Данных:
1. Реляционные Базы Данных (RDBMS)
2. Нереляционные (NoSQL) Базы Данных
 Документо-ориентированные;
 Ключ-значение;
 Столбцово-ориентированные;
 Графовые;
3. Объектно-ориентированные Базы Данных
4. Иерархические Базы Данных
5. Сетевые Базы Данных
Реляционные базы данных (Relational Database Management Systems,
RDBMS) основаны на реляционной модели данных. В реляционных базах
данных информация хранится в виде отдельных таблиц, состоящих из строк
(записей) и столбцов (атрибутов). Отношения между таблицами определяются
через ключи, позволяя эффективно организовывать и связывать различные
данные.
Примеры СУБД (система управления БД):
 MySQL: Популярная открытая СУБД, широко используемая в вебразработке.
 PostgreSQL: Мощная,
открытая СУБД, поддерживающая как
традиционные, так и новаторские функции.
 Oracle: Коммерческая
СУБД, известная своей надежностью и
масштабируемостью.
 Microsoft SQL Server: Коммерческая СУБД от Microsoft, широко
используемая в корпоративных решениях.
Использование:




Универсальность: RDBMS подходят для большинства типов
приложений благодаря их гибкости, мощности и надежности. Они могут
использоваться для всего, от простых веб-приложений до крупных
корпоративных систем.
Сложные запросы и анализ данных: Поддержка сложных SQLзапросов, включая соединения (joins), подзапросы и агрегатные
функции, делает RDBMS идеальными для комплексного анализа
данных.
Транзакционность
и
надежность: RDBMS
обеспечивают
согласованность данных и поддержку транзакций, что критически
важно для банковских, финансовых и любых других систем, где
точность данных является приоритетом.
Строгая схема данных: Наличие строго определенной схемы данных
обеспечивает четкую организацию и целостность данных.
Преимущества:
 Стандартизация и совместимость: SQL как язык запросов является
стандартом для RDBMS, что обеспечивает совместимость и
переносимость знаний между различными системами.
 Интеграция
с
различными
инструментами
и
технологиями: Широкое распространение и поддержка реляционных
баз данных обеспечивает легкую интеграцию с множеством
инструментов и технологий, от отчетности и аналитики до вебразработки и бизнес-приложений.
Реляционные базы данных остаются важным компонентом в мире управления
данными, предлагая структурированный, мощный и надежный способ
хранения и обработки информации.
Нереляционные (NoSQL) Базы Данных
Описание:
NoSQL (Not Only SQL) охватывает широкий спектр баз данных,
предназначенных для решения специфических задач, где традиционные
реляционные базы данных могут быть неэффективны. Эти базы данных часто
оптимизированы для работы с большими объемами данных, распределенными
системами и горизонтальным масштабированием.
Типы NoSQL Баз Данных:
1. Документо-ориентированные Базы Данных
Описание: Хранят данные в виде документов, чаще всего в
форматах JSON или XML. Эти базы данных предлагают гибкость
в структуре данных, позволяя легко добавлять и изменять поля.
 Примеры: MongoDB, CouchDB.
 Использование: Идеально подходят для веб-приложений, CMS,
платформ электронной коммерции, где структура данных может
часто изменяться.
2. Базы Данных ключ-значение
 Описание: Простейшая форма NoSQL баз данных, где каждое
значение ассоциировано с уникальным ключом. Они
обеспечивают быстрый доступ к данным и масштабируемость.
 Примеры: Redis, DynamoDB.
 Использование: Подходят
для
кэширования,
сеансов
пользователей, чатов, рекомендательных систем.
3. Столбцово-ориентированные Базы Данных
 Описание: Оптимизированы для чтения и записи больших
объемов данных, храня данные не по строкам, а по столбцам. Это
улучшает производительность при работе с большими наборами
данных и аналитическими запросами.
 Примеры: Cassandra, HBase.
 Использование: Идеально
подходят
для
аналитических
приложений, Big Data, временных рядов.
4. Графовые Базы Данных
 Описание: Специализированные на хранении и обработке
данных, представленных в виде графов (узлы - это объекты, а
ребра - отношения между ними). Это обеспечивает эффективное
управление связанными данными.
 Примеры: Neo4j, Amazon Neptune.
 Использование: Очень эффективны для социальных сетей,
рекомендательных систем, сетевого анализа.

Преимущества NoSQL:
 Гибкость структур: NoSQL базы данных обеспечивают гибкость в
работе со структурами данных, что позволяет легко адаптироваться к
изменяющимся требованиям.
 Масштабируемость: Отлично
подходят
для
горизонтального
масштабирования и работы с большими объемами данных.
 Высокая производительность: Некоторые типы NoSQL баз данных
оптимизированы для быстрых операций чтения и записи.
Объектно-ориентированные базы данных — это программируемая БД,
которая хранит сложные данные и их взаимосвязи напрямую, без назначения
строк и столбцов, что делает их более подходящими для приложений,
работающих с большими пакетами.
Иерархические базы данных представляют данные в виде дерева, где каждая
запись имеет один родительский элемент и может иметь множество дочерних
элементов. Эта модель напоминает структуру дерева с ветвями, идеально
подходящую для данных, естественно организованных в иерархическом
порядке. Отношения в таких базах данных обычно представляются как
"родитель-потомок".
Сетевые базы данных являются расширением иерархической модели баз
данных. В этом типе баз данных каждый узел (запись) может иметь несколько
родителей, что позволяет создавать сложные сетевые структуры данных. Эта
модель предлагает большую гибкость в определении отношений между
различными элементами данных по сравнению с иерархической моделью, где
каждый узел имеет только одного родителя.
SQL Select
Определение:
SELECT в SQL — это команда, используемая для выборки данных из одной
или нескольких таблиц базы данных. Она позволяет указать конкретные
столбцы для отображения и установить критерии для фильтрации данных.
Объяснение:
Представьте, что таблица базы данных — это большой список информации,
например список всех книг в библиотеке. Используя SELECT, вы можете
выбрать просмотреть только определенную информацию из этого списка,
например названия книг и их авторов, не видя остальных данных, таких как
год издания или количество страниц.
Применение на практике:
 Отчеты по продажам: Выборка данных о продажах из таблицы продаж
для анализа общего объема продаж или продаж по конкретным товарам.
 Управление клиентской базой: Получение списка клиентов с
определенными характеристиками, например, из определенного города
или в определенном возрастном диапазоне.
 Аналитика веб-сайтов: Выборка данных о посещениях веб-страниц для
анализа поведения пользователей.
Синтаксис:
Основной синтаксис команды SELECT выглядит следующим образом:
SELECT column1, column2, ...
FROM table_name;
Здесь column1, column2 — это столбцы, которые вы хотите выбрать,
а table_name — имя таблицы, из которой производится выборка.
Пример запроса:
SELECT Name, Age
FROM Employees;
Этот запрос выберет данные из столбцов Name (имя) и Age (возраст) всех
записей в таблице Employees (сотрудники). Он полезен, если вам нужно
получить только имена и возраст сотрудников, без другой информации,
содержащейся в таблице.
Использование звездочки *
Определение:
В SQL * (звездочка) в команде SELECT используется для выбора всех
столбцов из указанной таблицы.
Объяснение:
Использование * в запросе SELECT подобно запросу к библиотекарю дать
вам список всех глав (столбцов) каждой книги (строки) в разделе (таблице).
Это удобный способ получить полное содержимое таблицы без
необходимости перечислять все названия столбцов.
Применение на практике:
 Быстрый обзор данных: При исследовании новой таблицы данных
можно использовать SELECT * для получения общего представления о
всех столбцах и данных.
 Администрирование баз данных: Для проверки структуры и
содержимого таблиц после выполнения операций вставки, обновления
или удаления.
Синтаксис
SELECT * FROM table_name;
Использование псевдонима AS
Определение:
AS в SQL используется для создания псевдонима (alias) для столбца или
таблицы в запросе. Псевдонимы часто применяются для упрощения запросов
и улучшения читаемости результатов.
Объяснение:
Использование AS в запросе SQL похоже на то, как вы могли бы дать кличку
своему домашнему питомцу. Вместо использования полного или сложного
имени, вы используете короткое и понятное обозначение. Так же и в SQL:
вместо длинных названий столбцов или таблиц можно использовать более
короткие и удобные имена.
Применение на практике:
 Отчеты: Использование псевдонимов для столбцов с длинными или
неинтуитивными названиями при формировании отчетов.
 Сложные запросы: Упрощение написания и понимания запросов,
особенно при соединении нескольких таблиц.
Синтаксис:
SELECT column_name AS alias_name
FROM table_name;
Пример запроса:
SELECT first_name AS name, last_name AS surname
FROM employees;
Объяснение: Этот запрос выбирает столбцы first_name и last_name из
таблицы employees,
но
в
результате
они
будут
отображаться
как name и surname. Это делает результаты запроса более понятными,
особенно если исходные названия столбцов не очень информативны или
слишком длинны.
Эти дополнительные аспекты конструкции SELECT в SQL помогают
улучшить эффективность и читаемость SQL-запросов, делая их более гибкими
и адаптируемыми к различным потребностям анализа данных и управления
базами данных.
SQL Select Distinct
Определение:
Команда SELECT DISTINCT в SQL используется для выборки уникальных
записей из таблицы, исключая дубликаты. Она позволяет получить только
различные (уникальные) значения из выбранного столбца или набора
столбцов.
Объяснение:
Представьте, что у вас есть коробка, наполненная разноцветными шариками,
где некоторые цвета повторяются. Если вы хотите узнать, какие уникальные
цвета шариков есть в коробке, вы бы выбрали по одному шарику каждого
цвета. SELECT DISTINCT работает подобным образом: из "коробки" данных
(таблицы) он выбирает только уникальные значения, игнорируя повторы.
Применение на практике:
 Маркетинговые Анализы: Выборка уникальных категорий товаров из
таблицы продуктов для определения разнообразия ассортимента.
 Анализ Клиентской Базы: Получение списка уникальных городов, из
которых есть клиенты, для географического анализа рынка.
 Исследование Данных: Определение уникальных типов транзакций в
финансовых отчетах.
Синтаксис:
Основной синтаксис команды SELECT DISTINCT:
SELECT DISTINCT column1, column2, ...
FROM table_name;
 column1, column2 — столбцы, из которых нужно выбрать уникальные
значения.
 table_name — имя таблицы, из которой производится выборка.
Пример запроса:
SELECT DISTINCT country
FROM customers;
Объяснение: Этот запрос выберет все уникальные значения из
столбца country в таблице customers. Если в таблице есть несколько клиентов
из одной и той же страны, эта страна появится в результате только один раз.
Это полезно для определения, из каких стран у вас есть клиенты, без
повторения одной и той же страны.
SELECT DISTINCT является важным инструментом для анализа данных,
особенно когда требуется понять разнообразие или уникальность значений в
наборе данных. Это помогает избежать искажения результатов за счет
повторяющихся записей.
SQL LIMIT
Определение:
Команда LIMIT в SQL, используемая в MySQL, ограничивает количество
строк, возвращаемых в результате запроса. Она позволяет выбирать
фиксированное количество записей из начала результата запроса.
Объяснение:
LIMIT в MySQL подобен запросу на получение ограниченного количества
книг из большого списка в библиотеке. Например, если вам нужно изучить
только несколько первых записей из большого набора данных, вы можете
использовать LIMIT для ограничения вывода.
Применение на практике:
 Анализ данных: Выборка топ-5 продуктов по продажам для
определения наиболее популярных товаров.
 Отчетность: Получение первых 10 записей из большого набора данных
для создания сводных отчетов.
 Ограниченный просмотр: Показ только первых нескольких записей в
пользовательском интерфейсе, чтобы не перегружать экран большим
количеством данных.
Синтаксис:
В MySQL синтаксис LIMIT следующий:
SELECT column_name(s)
FROM table_name
LIMIT number;
number здесь указывает на максимальное количество строк, которые должны
быть возвращены.
Пример запроса:
SELECT * FROM
employees
LIMIT 5;
Объяснение: Этот запрос возвращает первые пять записей из
таблицы employees. Он полезен, если вам нужно ограничить количество
данных, возвращаемых запросом, например, для предварительного просмотра
или тестирования.
LIMIT является ключевым инструментом в MySQL для управления объемом
данных, возвращаемых запросом. Он не только ускоряет выполнение
запросов, но и помогает избежать перегрузки при обработке и отображении
данных.
Важно отметить, что аналогичная функциональность в других СУБД,
например, в SQL Server или MS Access, реализована через команду SELECT
TOP.
Оператор OFFSET
Если нужно указать, с какой записи начинать выборку, к оператору LIMIT
добавляют оператор OFFSET. Он позволяет пропустить определённое
число записей.
Скопировать кодSQL
SELECT поле_1,
поле_2,
поле_3
...
FROM таблица
LIMIT 10 OFFSET 5;
Такой запрос выведет записи с 6 по 15. Запрос ниже выведет записи с 1
по 10:
Скопировать кодSQL
SELECT поле_1,
поле_2,
поле_3
...
FROM таблица
LIMIT 10 OFFSET 0;
OFFSET — самостоятельный оператор. Чтобы отобразить записи всей
таблицы, начиная с определённой, указывают только оператор OFFSET без
оператора LIMIT. Например, если нужно отобразить всю таблицу, начиная
с шестой записи, запрос будет выглядеть так:
Скопировать кодSQL
SELECT поле_1,
поле_2,
поле_3
...
FROM таблица
OFFSET 5;
В запросе всё верно: перечислены нужные поля, условие с городом указано правильно. Кроме
того, OFFSET пропустит две записи, а LIMIT отобразит следующие три. Значит, на экране появятся
записи с третьей по пятую.
Приоритет операторов
Чем больше условий, тем сложнее уследить за логикой операторов.
Условия с разными логическими операторами имеют разный приоритет.
Первым всегда выполняется условие с оператором NOT, за ним — AND и в
последнюю очередь — условие с OR.
Для отображения нужного числа строк используйте операторы LIMIT и
OFFSET. LIMIT выгружает требуемое число строк, а OFFSET пропускает их
указанное количество.
Скопировать кодSQL
-- выбор определённых строк из таблицы
SELECT *
FROM таблица
LIMIT число выгружаемых строк OFFSET число пропускаемых строк;
Для комбинации условий используют логические операторы OR, AND и NOT:



Оператор OR сработает, если выполняется хотя бы одно условие.
Оператор AND сработает, если выполняются все указанные условия.
Оператор NOT меняет условие на противоположное.
Скопировать кодSQL
-- фильтрация данных по условию
SELECT поле_1,
поле_2 -- выбор полей
FROM таблица -- таблица, из которой выгружают данные
WHERE условие_1 OR условие_2 AND NOT условие_3; -- условия для среза данных
Набор операторов OR можно заменить конструкцией с оператором IN:
Скопировать кодSQL
-- фильтрация, в которой все значения поля находятся в списке
SELECT *
FROM таблица
WHERE поле IN ('значение_1','значение_2','значение_3');
Номер элемента даты (года, месяца, недели) можно выделить при помощи
оператора EXTRACT:
Скопировать кодSQL
-- извлечение части даты
SELECT EXTRACT(часть_даты FROM поле) AS новое_поле_с_датой
FROM таблица;
Начало элемента даты (например, первый день нужного месяца) можно
выделить при помощи DATE_TRUNC:
Скопировать кодSQL
-- усечение даты до части
SELECT DATE_TRUNC('часть_даты_до_которой_усекаем', поле) AS новое_поле_с_датой
FROM таблица;
Параметры функции DATE_TRUNC:












'microseconds' — микросекунды;
'milliseconds' — миллисекунды;
'second' — секунда;
'minute' — минута;
'hour' — час;
'day' — день;
'week' — неделя;
'month' — месяц;
'quarter' — квартал;
'year' — год;
'decade' — десятилетие;
'century' — век.
Параметры функции EXTRACT:













MILLISECOND — миллисекунда;
SECOND — секунда;
MINUTE — минута;
HOUR — час;
DAY — день;
DOY — день года, выраженный числом от 1 до 365 или 366, если год
високосный;
DOW — день недели, выраженный числом от 0 до 6, где понедельник —
1, воскресенье — 0;
ISODOW — день недели, выраженный числом от 1 до 7, где
понедельник — 1, воскресенье — 7;
WEEK — неделя в году;
MONTH — месяц;
QUARTER — квартал;
YEAR — год;
CENTURY — век.
DATE
Функция DATE_TRUNC
Дата и время часто хранятся в таком виде: '2009-11-19 11:03:05'. Но
сравнивать даты в таком формате неудобно, если нужен, например, только
год.
В таких случаях в PostegreSQL используют функцию DATE_TRUNC, которая
«усекает» дату и время до необходимого значения. Синтаксис функции
такой: DATE_TRUNC('отрезок времени', поле) .
Отрезок времени может быть разным, главное — не забыть одинарные
кавычки:

'microseconds' — микросекунды;











'milliseconds' — миллисекунды;
'second' — секунда;
'minute' — минута;
'hour' — час;
'day' — день;
'week' — неделя;
'month' — месяц;
'quarter' — квартал;
'year' — год;
'decade' — десятилетие;
'century' — век.
Функция DATE_TRUNC — полезный инструмент, но её аналоги есть не во всех
СУБД. Она пригодится, если нужно посчитать записи за конкретный
период: например, неделю или месяц.
Разберём, как работает функция DATE_TRUNC, на примере таблицы с заказами
хот-догов. Таблица hotdog содержит поле date с типом данных date: поле
хранит дату заказа в виде '2022-02-27'.
Применим функцию DATE_TRUNC для этого поля. Для наглядности отобразим
исходное поле с датой и поле с выделенным элементом даты. Выведем
только первые пять строк:
Скопировать кодSQL
SELECT date,
DATE_TRUNC('month', date)
FROM hotdog
LIMIT 5;
Функция EXTRACT
Чтобы получить только конкретную часть даты — год, месяц или минуту,
— используют функцию EXTRACT. Её синтаксис: EXTRACT(отрезок времени FROM
поле).
Одинарные кавычки для значений внутри EXTRACT не нужны. Отрезок
времени можно представить следующими значениями:







CENTURY — век;
YEAR — год;
QUARTER — квартал;
MONTH — месяц;
WEEK — неделя в году;
DAY — день;
DOY (от англ. day of the year) — день года, выраженный числом от 1 до
365 или 366, если год високосный;






DOW (от англ. day of the week) — день недели, выраженный числом от 0
до 6, где понедельник — 1, воскресенье — 0.
ISODOW (от англ. day of the week и ISO 8601) — день недели,
выраженный числом от 1 до 7, где понедельник — 1, воскресенье —
7;
HOUR — час;
MINUTE — минута;
SECOND — секунда;
MILLISECOND — миллисекунда.
Выделим номер недели из поля с датой так же, как ранее мы делали с
месяцем. На этот раз применим EXTRACT:
Скопировать кодSQL
SELECT date,
EXTRACT(WEEK FROM date)
FROM hotdog
LIMIT 5;
SELECT date,
DATE_TRUNC('month', date),
name,
quantity
FROM pizza
WHERE DATE_TRUNC('month', date) = '2022-02-01' AND quantity != 1;
SELECT name,
price,
quantity
FROM pizza
WHERE bracelet_id IN (145738, 145759, 145773, 145807, 145815, 145821,
145873, 145880)
AND DATE_TRUNC('month', date) = '2022-03-01';
.
Отобразите, сколько раз в среднем поливали горчицей каждый вид хот-дога, в
котором пять ингредиентов. Добавьте условие: отберите записи за вторую
неделю года.
Если в хот-дог добавили горчицу, поле mustard содержит значение 1.
select name_hotdog,
avg(mustard) AS mustard_avg
from hotdog
where ingredients = 5 and EXTRACT(week FROM date) = 2
group by name_hotdog;
Отобразите, сколько заказов с вегетарианской сосиской продавалось в первые пять
дней января. Отобразите в итоговой таблице номер дня января и число заказов.
Если сосиска вегетарианская, поле vegan_sausage принимает значение 1.
SELECT COUNT(name_hotdog),
EXTRACT(DAY FROM date)
FROM hotdog
WHERE date >= '2022-01-01'
AND date <= '2022-01-05' AND vegan_sausage = 1
GROUP BY date;
Посчитайте сумму выручки, полученную от продаж каждого хот-дога, за каждый месяц.
Отобразите в итоговой таблице номер месяца, название хот-дога и сумму выручки.
SELECT EXTRACT (MONTH FROM date) AS Month,
name_hotdog,
SUM (price*quantity)
FROM hotdog
GROUP BY name_hotdog, EXTRACT (month FROM date)
ORDER BY name_hotdog DESC, EXTRACT (month FROM date) ASC
Посмотрим на портрет клиента.
Какие три клиента принесли больше всего выручки за третью неделю года?
Отобразите на экране только поле с bracelet_id. Отсортируйте клиентов по
убыванию выручки.
select bracelet_id
from pizza
where EXTRACT(week FROM date) = 3
GROUP BY bracelet_id
order by SUM (price*quantity) DESC
limit 3;
SQL Comments
Определение:
Комментарии в SQL - это фрагменты текста в коде SQL-запросов, которые не
выполняются как часть запроса. Они используются для пояснения кода, уточнения
запросов или временного исключения определенных частей кода из выполнения.
Важность комментариев:
Комментарии в SQL имеют решающее значение для:



Повышения читаемости: Объяснение сложной логики или указание на цели
определенных запросов.
Облегчения совместной работы: Помогают другим разработчикам понять ваш
код, что критически важно в командной работе.
Упрощения отладки и тестирования: Позволяют временно отключить части кода
без удаления их.
Синтаксис комментариев:
В SQL существуют два основных типа комментариев:
1. Однострочные комментарии:

Начинаются с -- и продолжаются до конца строки.
Пример:
-- Это однострочный комментарий
SELECT * FROM users; -- Комментарий после кода
2. Многострочные (блочные) комментарии:


Начинаются с /* и заканчиваются на */ .
Могут занимать несколько строк.
Пример:
/* Это многострочный комментарий,
который продолжается на несколько строк */
SELECT * FROM users;
Применение на практике:

Описание логики запроса:
-- Получение списка пользователей старше 30 лет
SELECT name, age FROM users WHERE age > 30;

Временное отключение кода:
SELECT name, age FROM users;
-- SELECT email FROM users; -- Этот запрос временно отключен

Объяснение сложных запросов:
/*
Запрос для получения общего количества покупок
каждого пользователя за последний месяц
*/
SELECT user_id, COUNT(*) FROM purchases
WHERE purchase_date > '2021-01-01'
GROUP BY user_id;
Использование комментариев в SQL улучшает понимание и поддержку кода, делая его
более доступным для других разработчиков и упрощая процесс отладки и модификации
запросов. Комментирование кода является лучшей практикой программирования, и ее
стоит применять регулярно.
SQL Where
WHERE работает только с исходными данными: с результатом вычислений
он работать не умеет.
Определение:
Блок WHERE в SQL используется для фильтрации записей, отвечающих
определенным
условиям,
в
операторах
выборки,
таких
как SELECT, UPDATE или DELETE. Он определяет критерий, согласно
которому строка будет включена в результат или исключена из него.
Объяснение:
Представьте, что у вас есть таблица с данными о студентах, включающая их
имена и оценки. Если вам нужно найти студентов, которые получили оценку
выше 75, вы используете блок WHERE в запросе SELECT, чтобы
отфильтровать только тех студентов, чьи оценки соответствуют этому
условию. Это позволяет точно настраивать запросы, делая их более
специфическими и эффективными.
Практический пример:
В реальной жизни блок WHERE используется для извлечения данных из базы
по определенным критериям. Например, в банковской системе можно выбрать
все транзакции клиента, превышающие определенную сумму, для анализа
подозрительной активности. Таким образом, WHERE служит важным
инструментом для сегментации и анализа данных.
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
WHERE condition;
Здесь condition может включать различные критерии, такие как сравнения (>,
<, = и т.д.) и логические операторы (AND, OR, NOT), для создания более
сложных условий фильтрации.
Пример запроса:
SELECT Name, Grade FROM Students
WHERE Grade > 75;
Этот запрос выберет имена и оценки студентов из таблицы Students, но только
для тех, у кого оценка больше 75. Таким образом, WHERE действует как
фильтр, позволяющий выделить интересующую подгруппу данных из общей
таблицы.
Математические операторы сравнения
Определение:
Математические операторы сравнения в SQL используются для сравнения
двух
значений
или
выражений.
К
основным
операторам
относятся =, >, <, >=, <=, <> (или !=).
Объяснение:
Операторы сравнения позволяют осуществлять выборку, фильтрацию,
обновление и удаление данных на основе заданных условий. Они являются
фундаментальной частью SQL-запросов, позволяя проводить анализ и
обработку данных в базе.
Практический пример:
Рассмотрим таблицу Orders с полями OrderID, CustomerID, Amount. Чтобы
выбрать заказы на сумму более 1000, используем запрос:
SELECT * FROM Orders
WHERE Amount > 1000;
Синтаксис:
 = - Равно
 > - Больше чем
 < - Меньше чем
 >= - Больше или равно
 <= - Меньше или равно
 <> или != - Не равно
Пример запроса:
Выборка заказов с суммой меньше 500 и не равной 0:
SELECT * FROM Orders
WHERE Amount < 500 AND Amount <> 0;
 SELECT * FROM Orders указывает на то, что необходимо выбрать все
поля (*) из таблицы Orders.
 Amount < 500 - Это условие говорит о том, что в результаты выборки
должны попасть те записи, где значение в поле Amount (сумма заказа)
меньше 500.
 AND Amount <> 0 - Это дополнительное условие, соединенное с
предыдущим при помощи логического оператора AND. Оно указывает,
что сумма заказа не должна быть равна 0. Здесь используется
оператор <>, который означает "не равно".
Логический оператор AND в SQL
Определение:
Логический оператор AND в SQL используется для комбинирования двух или более
условий в одном SQL-запросе. Запрос возвращает результаты только в том случае, если
все комбинированные условия истинны.
Объяснение:
Представьте, что вы ищете книгу в библиотеке, которая должна соответствовать
нескольким критериям: быть написанной определенным автором и выпущенной в
определенном году. Использование AND в SQL-запросе аналогично поиску такой книги.
Вы устанавливаете несколько условий, и все они должны быть выполнены, чтобы строка
попала в результат выборки.
Практический пример:
В компании необходимо найти сотрудников, которые работают в определенном отделе и
имеют стаж работы более 5 лет. Использование AND позволяет сформировать запрос,
который отфильтрует только тех сотрудников, которые соответствуют обоим критериям.
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
WHERE condition_1 AND condition_2;
Пример запроса:
SELECT Name, Department, Years_of_Experience
FROM Employees
WHERE Department = 'Finance' AND Years_of_Experience > 5;
Этот запрос выберет имена, отделы и стаж работы сотрудников из таблицы Employees ,
но только для тех, кто работает в финансовом отделе ( Department = 'Finance' ) и
имеет стаж работы более 5 лет ( Years_of_Experience > 5 ). Оба условия должны быть
выполнены для каждой строки, чтобы она попала в результат.
Логический оператор OR в SQL
Определение:
Логический оператор OR в SQL применяется для объединения двух или более условий в
одном запросе, где результат будет возвращен, если хотя бы одно из условий истинно.
Объяснение:
Представьте, что вы хотите заказать напиток в кафе, и вам подойдет либо кофе, либо чай.
Использование OR в SQL-запросе аналогично этому выбору: вы устанавливаете
несколько условий, и для удовлетворения запроса достаточно, чтобы было выполнено
хотя бы одно из них.
Практический пример:
В базе данных магазина требуется найти всех клиентов, которые проживают либо в НьюЙорке, либо в Лос-Анджелесе. Использование OR позволяет сформировать запрос,
который отфильтрует клиентов по любому из этих двух городов.
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
WHERE condition_1 OR condition_2;
Пример запроса:
SELECT Name, City
FROM Customers
WHERE City = 'New York' OR City = 'Los Angeles';
Этот запрос выберет имена и города проживания клиентов из таблицы Customers , но
только для тех, кто проживает в Нью-Йорке ( City = 'New York' ) или Лос-Анджелесе
( City = 'Los Angeles' ). Запись попадет в результаты, если она соответствует хотя бы
одному из этих условий.
Логический оператор NOT в SQL
Определение:
Логический оператор NOT в SQL используется для инвертирования условия в запросе. Он
выбирает строки, где заданное условие не истинно.
Объяснение:
Представьте, что вы ищете книгу, которую не написал определенный автор.
Использование NOT в SQL-запросе аналогично этому поиску: вы исключаете из выборки
все строки, соответствующие определенному условию. Это помогает исключить
нежелательные данные из результатов запроса.
Практический пример:
Компания хочет получить список всех сотрудников, кроме тех, кто работает в отделе
продаж. Использование NOT позволяет легко исключить из запроса сотрудников этого
конкретного отдела.
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
WHERE NOT condition;
Пример запроса:
SELECT Name, Department
FROM Employees
WHERE NOT Department = 'Sales';
В этом запросе выбираются имена и отделы сотрудников из таблицы Employees , но
исключаются сотрудники отдела продаж ( Department = 'Sales' ).
Оператор NOT инвертирует условие, таким образом в результат попадут строки, не
соответствующие условию.
Использование команды ORDER BY в SQL
Определение:
Команда ORDER BY в SQL используется для сортировки результатов запроса по одному
или нескольким столбцам в порядке возрастания или убывания. Это позволяет
организовать вывод данных в более читаемом и удобном для анализа формате.
Для сортировки данных в SQL используют оператор ORDER BY. Его пишут в
самом конце запроса, после него можно указать только операторы LIMIT и
OFFSET.
Объяснение:
Представьте, что вы сортируете книги на полке по алфавиту или по дате издания.
Аналогично, в SQL, ORDER BY позволяет упорядочить строки в таблице по значению
одного или нескольких столбцов. Это может быть полезно, например, для отображения
данных в хронологическом порядке или для сортировки списка клиентов по фамилии.
Практический пример:
Компания хочет получить отсортированный список всех транзакций по дате, чтобы
увидеть самые последние операции в начале списка.
Сортировка по одному столбцу без указания ASC или DESC
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
ORDER BY column_name_1;
Когда ASC или DESC не указаны, SQL по умолчанию применяет сортировку по
возрастанию ( ASC ).
Пример запроса:
SELECT Name, Age
FROM Employees
ORDER BY Age;
В этом запросе выбираются имена и возраст сотрудников из таблицы Employees .
Результаты будут отсортированы по возрасту сотрудников в порядке возрастания.
Поскольку направление сортировки не указано, SQL автоматически применяет
сортировку по возрастанию. Это означает, что сначала будут показаны сотрудники
младшего возраста, а затем более старшие.
Сортировка двух столбцов без явного указания ASC или DESC
Синтаксис:
SELECT column_name_1, column_name_2, ...
FROM table
ORDER BY column_name_1, column_name_2 ...;
При отсутствии явного указания, SQL использует сортировку по возрастанию ( ASC ) по
умолчанию.
Пример запроса:
SELECT LastName, Department
FROM Employees
ORDER BY Department, LastName;
В этом запросе выбираются фамилии сотрудников и названия их отделов из
таблицы Employees . Сначала результаты будут отсортированы по отделам, а затем
внутри каждого отдела — по фамилиям сотрудников. Поскольку направления сортировки
не указаны явно, оба столбца будут отсортированы в порядке возрастания. Это означает,
что сначала будут идти отделы в алфавитном порядке, а внутри каждого отдела —
сотрудники, также расположенные по алфавиту.
Сортировка по алфавиту (DESC)
Синтаксис:
SELECT column_name_1, column_name_2, ...
FROM table
ORDER BY column_name_1 DESC;
Пример запроса:
SELECT LastName, FirstName
FROM Employees
ORDER BY LastName DESC;
В этом запросе выбираются фамилии и имена сотрудников из таблицы Employees .
Результаты будут отсортированы по фамилиям в обратном алфавитном порядке (от Я до
А), благодаря использованию DESC в ORDER BY .
Упорядочивание по нескольким столбцам
Синтаксис:
SELECT column_name_1, column_name_2, ...
FROM table
ORDER BY column_name_1[ASC|DESC], column_name_2[ASC|DESC], ...;
Пример запроса:
SELECT LastName, FirstName, Department
FROM Employees
ORDER BY Department ASC, LastName DESC;
В этом запросе выбираются фамилии, имена и отделы сотрудников из
таблицы Employees . Сначала результаты будут отсортированы по отделам в алфавитном
порядке ( ASC ), а затем внутри каждого отдела — по фамилиям сотрудников в обратном
алфавитном порядке ( DESC ).
Вопрос 1: Как работает ORDER BY , если в запросе не указано ASC или DESC ?
Ответ: Если в запросе с ORDER BY не указано ASC или DESC , SQL автоматически
применяет сортировку по возрастанию ( ASC ). Это означает, что результаты будут
упорядочены от меньшего к большему или от старых к новым.
Вопрос 2: Можно ли использовать ORDER BY для сортировки по нескольким столбцам?
Ответ: Да, можно сортировать данные по нескольким столбцам, указав их через запятую
в команде ORDER BY . Можно также указать для каждого столбца направление
сортировки ( ASC или DESC ). SQL будет сначала сортировать данные по первому
столбцу, затем — внутри каждой группы по второму столбцу и так далее.
Вопрос 3: Как ORDER BY влияет на производительность запроса?
Ответ: Использование ORDER BY , особенно с несколькими столбцами или на больших
объемах данных, может замедлить выполнение запроса. Это связано с тем, что для
сортировки данных требуется дополнительное время и ресурсы. Индексирование
соответствующих столбцов может помочь улучшить производительность.
Вопрос 4: Можно ли использовать псевдонимы столбцов в ORDER BY ?
Ответ: Да, можно использовать псевдонимы, заданные в выражении SELECT , в
команде ORDER BY . Это может быть полезно для упрощения запроса, особенно когда
используются сложные выражения или функции.
Вопрос 5: Можно ли использовать функции в ORDER BY ?
Ответ: Да, можно использовать функции (например, агрегатные функции или функции
обработки строк) в ORDER BY . Это позволяет сортировать результаты запроса на основе
вычисленных значений.
Вопрос 6: Как сортировать данные в случайном порядке?
Ответ: В некоторых СУБД, как, например, в MySQL, можно использовать
функцию RAND() в ORDER BY для сортировки результатов в случайном порядке.
Вопрос 7: Влияет ли ORDER BY на результаты запроса GROUP BY ?
Ответ: ORDER BY не влияет на то, как группируются данные с GROUP BY , но может
использоваться для сортировки этих группированных результатов.
Вопрос 8: Можно ли объединить ORDER BY с LIMIT ?
Ответ: Да, можно сначала упорядочить данные с помощью ORDER BY , а затем
использовать LIMIT для ограничения числа возвращаемых строк. Это полезно для
выборки топовых значений.
Вопрос 9: Как сортировать данные по столбцу, который содержит NULL значения?
Ответ: В SQL NULL значения обычно считаются меньшими всего и по умолчанию идут в
начале при сортировке по возрастанию и в конце при сортировке по убыванию. В
некоторых СУБД можно использовать специальные функции для изменения этого
поведения.
Использование команды LIKE
Определение:
LIKE - это оператор, который используется для поиска совпадений с шаблоном в
текстовых столбцах. Он часто применяется в запросах с WHERE для фильтрации
результатов на основе текстовых шаблонов.
Объяснение:
Использование LIKE похоже на поиск информации с использованием нечеткого запроса.
Например, если вы ищете книгу, название которой начинается на определенные буквы, но
не помните полное название. LIKE позволяет находить строки, соответствующие
заданному текстовому шаблону, например, имена, начинающиеся с определенной буквы,
или адреса, содержащие определенное слово.
Практический пример:
Представьте, что у вас есть база данных клиентов и вы хотите вывести список всех
клиентов, чьи имена начинаются на 'А'. Используя LIKE .
Синтаксис:
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
Два специальных символа, используемых в шаблонах LIKE :

% - заменяет любое количество символов (включая ноль символов).

_ - заменяет ровно один символ.
Пример запроса:
1. Найти всех сотрудников, имена которых начинаются на 'А':
SELECT *
FROM Employees
WHERE Name
LIKE 'A%';
A% означает, что после 'А' может следовать любое количество символов.
2. Найти всех сотрудников, фамилии которых заканчиваются на 'ов':
SELECT *
FROM Employees
WHERE LastName
LIKE '%ов';
%ов находит строки, где фамилия заканчивается на 'ов'.
3.Найти все адреса, содержащие слово 'улица':
SELECT *
FROM Addresses
WHERE Address
LIKE '%улица%';
%улица% находит любые строки, содержащие 'улица' в любом месте.
4. Найти товары, название которых начинается с любого символа, за которым следует 'р':
SELECT *
FROM Products
WHERE Name
LIKE '_р%';
_р% находит строки, где 'р' является вторым символом в названии.
5. Найти записи, где третий символ в столбце 'Code' является '4':
SELECT *
FROM Products
WHERE Code
LIKE '__4%';
__4% находит строки, где '4' является третьим символом, а два символа перед '4' могут
быть любыми.
6. Найти записи, где название начинается на 'а' и содержит букву 'о' где-то дальше:
SELECT *
FROM Table
WHERE Column
LIKE 'а%о%';
а%о% находит строки, начинающиеся на 'а' и содержащие 'о' в любом месте после этого.
Начинается с а, с или s ‘[асs]%’
Начинается с любой буквы от а до f ‘[a-f]%’
Первая буква не является а, с или s ‘[!асs]%’
1. Избегайте Использования % в Начале Шаблона:

Использование % в начале шаблона ( '%value' ) заставляет MySQL
сканировать всю таблицу, что может быть очень неэффективно для
больших наборов данных. Если возможно, старайтесь формировать
шаблоны так, чтобы символ % стоял не в начале.
2. Используйте Полные Текстовые Индексы:

Для ускорения поиска по большим текстовым полям рассмотрите
возможность использования полнотекстовых индексов. Они могут
значительно ускорить операции поиска с LIKE , особенно когда поиск
ведется по значительным фрагментам текста.
3. Ограничивайте Объем Данных:

Используйте LIMIT для ограничения количества строк, возвращаемых
запросом, особенно в случаях, когда требуется только
предварительный просмотр результатов.
4. Используйте Дополнительные Условия Фильтрации:

Комбинируйте LIKE с другими условиями в WHERE для уменьшения
количества строк, которые необходимо сканировать. Например, если
вы ищете клиентов с определенным именем в определенном городе,
укажите город в запросе, чтобы сузить область поиска.
5. Избегайте Частого Использования LIKE в Операциях с Большими
Данными:

Постоянное использование LIKE , особенно с неопределенными
шаблонами, может замедлить работу с большими базами данных.
Рассмотрите альтернативные методы поиска или оптимизируйте
структуру данных, если LIKE используется регулярно для критически
важных операций.
6. Мониторинг и Оптимизация Запросов:

Используйте инструменты мониторинга и анализа запросов, чтобы
понять, как LIKE влияет на производительность, и оптимизируйте
запросы, когда это необходимо.
7. Вопрос 1: Можно ли использовать LIKE для поиска регистронезависимых
шаблонов?
8. Ответ: В MySQL поиск с использованием LIKE по умолчанию
регистронезависимый. Это означает, что 'А%' найдет все строки, начинающиеся
как с заглавной 'А', так и с прописной 'а'.
9.
10. Вопрос 2: Как искать символы % или _ в тексте, если они используются
в LIKE как специальные символы?
11. Ответ: Для поиска реальных символов % или _ используйте экранирующий
символ перед ними. Например, LIKE '%\%%' для поиска символа % в тексте.
12.
13. Вопрос 3: Влияет ли порядок символов % и _ в шаблоне на результаты поиска?
14. Ответ: Да, порядок и местоположение этих символов важны.
Например, 'a%b%' найдет строки, начинающиеся на 'a' и содержащие 'b' где-то
после 'a', а '%b' найдет любые строки, оканчивающиеся на 'b'.
15.
16. Вопрос 4: Можно ли использовать LIKE с числовыми столбцами?
17. Ответ: Да, можно использовать LIKE с числовыми столбцами, но сначала числа
будут преобразованы в текстовый формат. Это может быть неэффективно и не
рекомендуется для больших объемов данных.
18.
19. Вопрос 5: Есть ли ограничения на использование LIKE с большими текстовыми
полями?
20. Ответ: LIKE может быть медленным с большими текстовыми полями, особенно
если шаблон начинается с % . В этих случаях рассмотрите использование
полнотекстового поиска для улучшения производительности.
21.
22. Вопрос 6: Как LIKE взаимодействует с NULL значениями?
23. Ответ: Если столбец имеет значение NULL , он не будет соответствовать никакому
шаблону LIKE . Запросы с LIKE возвращают строки, где столбец не
равен NULL и соответствует указанному шаблону.
Распространенные ошибки
Ошибка №1: Использование LIKE для точного совпадения

Описание ошибки: Использование LIKE вместо оператора = для поиска точных
совпадений.
Пример неправильного использования:

SELECT *

FROM Employees

WHERE Name

LIKE 'Иван';

Пояснение: Этот запрос неэффективен, если нужно найти точное
совпадение. LIKE без специальных символов % или _ работает как = .
Правильный подход:

SELECT *

FROM Employees

WHERE Name = 'Иван';
Ошибка №3: Использование LIKE с числовыми столбцами

Описание ошибки: Использование LIKE для поиска в числовых столбцах, что
может быть неэффективно.
Пример неправильного использования:

SELECT *

FROM Orders

WHERE Amount

LIKE '123%';


Пояснение: Хотя LIKE может использоваться с числовыми столбцами, это часто
приводит к ненужному преобразованию типов и снижению производительности.
Правильный подход: Использовать другие методы фильтрации для числовых
данных, например, диапазоны с BETWEEN или точные совпадения с = .
Ошибка №4: Чрезмерное использование символа %

Описание ошибки: Использование символа % в начале и в конце шаблона, когда
это не требуется.
Пример неправильного использования:

SELECT *

FROM Products

WHERE Name

LIKE '%шоколад%';

Пояснение: Чрезмерное использование % может замедлить поиск, особенно в
больших таблицах, так как требуется сканировать всю строку на наличие
указанной подстроки.

Правильный подход: Если известно, что строка начинается с определенных
символов, лучше использовать % только в конце:

SELECT *

FROM Products

WHERE Name
LIKE 'шоколад%';
Ошибка №5: Игнорирование регистра символов

Описание ошибки: Неправильное понимание влияния регистра символов в
шаблоне поиска.
Пример неправильного использования:

SELECT *

FROM Employees

WHERE Name

LIKE 'иван%';


Пояснение: В MySQL по умолчанию поиск с LIKE регистронезависимый, но это
поведение может изменяться в зависимости от настроек сервера и коллации
таблицы.
Правильный подход: Учитывать регистрозависимость поиска в зависимости от
конфигурации сервера и использовать подходящий регистр символов в шаблоне.
Ошибка №6: Неверное использование экранирования специальных символов

Описание ошибки: Неправильное использование или игнорирование
экранирования специальных символов % и _ .
Пример неправильного использования:

SELECT *

FROM Comments

WHERE Text

LIKE '%50% скидка%';


Пояснение: Здесь % после '50' интерпретируется как специальный символ, а не
часть текста.
Правильный подход: Использовать символ экранирования ( \ ) перед
специальными символами, если они являются частью искомой строки:

SELECT *

FROM Comments

WHERE Text
LIKE '%50\% скидка%';
SQL IN
Определение:
Оператор IN в SQL используется для фильтрации результатов запроса на основе списка
значений. Он позволяет проверить, соответствует ли столбец одному из нескольких
указанных значений.
Объяснение:
Представьте, что у вас есть список любимых книг, и вы хотите найти все книги в
библиотеке, которые входят в этот список. Используя IN , вы можете легко
отфильтровать все книги, проверяя, входит ли название каждой книги в ваш список
любимых.
Применение на практике:


Фильтрация данных: Оператор IN часто используется в запросах для
фильтрации данных по списку значений, например, для выборки данных по
определенным критериям или категориям.
Упрощение запросов: IN позволяет упростить запросы, заменяя множественные
условия с OR на одно условие с IN , что повышает читаемость и упрощает
написание запросов.
Синтаксис:
SELECT column_name_1, column_name_2, ....
FROM table_name
WHERE column_name_1 IN (value1, value2, ..., valueN);
Пример запроса:
SELECT *
FROM Books
WHERE Author IN ('Лев Толстой', 'Федор Достоевский', 'Антон Чехов');
Этот запрос выберет все книги, написанные авторами Львом Толстым, Федором
Достоевским или Антоном Чеховым. Оператор IN здесь проверяет, соответствует ли
значение столбца Author одному из указанных имен.
Часто задаваемые вопросы (FAQ)
Вопрос 1: Можно ли использовать IN с числовыми значениями?
Ответ: Да, можно. Оператор IN работает как с текстовыми, так и с числовыми
значениями. Например:
SELECT *
FROM Employees
WHERE DepartmentID IN (1, 2, 5);
Вопрос 2: Каковы ограничения по количеству значений в IN ?
Ответ: Хотя технически SQL не устанавливает жёсткий лимит на количество значений
в IN , слишком большое их количество может ухудшить производительность запроса.
Рекомендуется ограничивать список до нескольких десятков значений.
Вопрос 3: Чем IN лучше, чем множественные OR ?
Ответ: IN обычно делает запросы более читаемыми и компактными, особенно когда
проверяется множество значений. Также, в некоторых случаях, использование IN может
улучшить производительность по сравнению с использованием множественных OR .
Вопрос 4: Можно ли использовать IN с подзапросами?
Ответ: Да, IN можно использовать с подзапросами. Это позволяет фильтровать данные
на основе результата другого запроса. Например:
SELECT *
FROM Products
WHERE ID IN (
SELECT ProductID
FROM OrderDetails
WHERE Quantity > 10
);
Вопрос 5: Что произойдет, если использовать IN с пустым списком значений?
Ответ: Если в IN используется пустой список значений, запрос не вернет ни одной
строки. Важно убедиться, что список значений в IN не пустой.
Вопрос 6: Можно ли сочетать IN с другими операторами, такими как NOT ?
Ответ: Да, IN может быть использован с NOT для отбора записей, которые не
соответствуют ни одному из значений в списке. Например:
SELECT *
FROM Employees
WHERE DepartmentID NOT IN (3, 4)
выберет всех сотрудников, не работающих в отделах с идентификаторами 3 и 4.
Вопрос 7: Как работает IN в случае с NULL значениями?
Ответ: Если в списке значений, используемом с IN , есть NULL , это значение будет
игнорироваться при сравнении. То есть, строки, у которых значение столбца NULL , не
будут выбраны, даже если в списке IN указан NULL .
SQL BETWEEN
Определение:
Оператор BETWEEN используется для выбора значений в заданном диапазоне. Значения
могут быть числами, текстом или датами.
Объяснение:
Оператор BETWEEN используется для фильтрации значений, попадающих в определенный
диапазон. Например, для выборки книг, изданных в период с 1990 по 2000 год
включительно, можно использовать BETWEEN для указания границ диапазона дат
издания.
Применение на практике:
BETWEEN часто используется для фильтрации записей по датам, ценам, возрастам и
другим числовым значениям, где требуется найти данные в определенном интервале. К
примеру:



Фильтрация по датам: Выборка записей за определенный период времени.
Фильтрация по диапазону числовых значений: Нахождение записей,
соответствующих определенному числовому диапазону, например, товаров в
определенном ценовом диапазоне.
Упрощение запросов: Замена множественных условий с >= и <= на одно
условие с BETWEEN , что делает запросы более компактными и читаемыми.
Синтаксис:
SELECT column_name
FROM table_name
WHERE column_name BETWEEN value_1 AND value_2;
Помните, что BETWEEN включает в себя и граничные значения (value1 и value2). Это
означает, что если value_1 равно 10, а value_2 равно 20, то оператор BETWEEN
выберет значения, равные 10 и 20, а также все значения между ними.
Пример с числами:
SELECT *
FROM Products
WHERE Price BETWEEN 50 AND 100;
Этот запрос выберет все продукты из таблицы Products , чья цена находится в
диапазоне от 50 до 100 (включительно). Это удобно для фильтрации товаров по ценовым
категориям.
Пример с дробными числами (Float/Double):
SELECT *
FROM Transactions
WHERE Amount BETWEEN 100.50 AND 150.75;
Этот запрос выберет все транзакции из таблицы Transactions , где сумма ( Amount )
лежит в диапазоне между 100.50 и 150.75. Это полезно для поиска транзакций со
специфическими суммами.
Пример с текстовыми данными:
SELECT *
FROM Employees
WHERE FirstName BETWEEN 'A' AND 'M';
При выборке записей сотрудников из таблицы Employees, где имя (FirstName) находится в
диапазоне от 'A' до 'M', будут включены имена, начинающиеся с букв от 'A' до 'Л'. Однако,
важно понимать, что включение границы 'M' в диапазон означает, что будут выбраны
имена, начинающиеся на 'M', но только те, которые равны 'M' без последующих символов.
Имена, начинающиеся на 'M' с дополнительными символами (например, 'Марк'), не
попадут в результат, поскольку сравнение строк происходит лексикографически, и 'M'
считается меньше, чем любая строка, начинающаяся на 'M' с последующими символами.
Пример с перечислениями (Enum):
Допустим, у нас есть таблица Employee с полем Status , которое может принимать
значения 'New', 'Active', 'On Leave', 'Retired'.
SELECT *
FROM Employee
WHERE Status BETWEEN 'Active' AND 'Retired';
Этот запрос выберет всех сотрудников, чей статус находится в алфавитном порядке
между 'Active' и 'Retired', включая оба этих значения.
Пример с временными интервалами (Time):
SELECT *
FROM Appointments
WHERE StartTime BETWEEN '09:00:00' AND '12:00:00';
Здесь мы ищем все записи о встречах ( Appointments ), начало которых запланировано
на время между 9 утра и 12 дня. Это удобно для фильтрации встреч, запланированных на
утренние часы.
Пример с диапазоном дат(Date):
SELECT *
FROM Employee
WHERE HireDate BETWEEN '2023-06-01' AND '2023-08-31';
Этот запрос выбирает всех сотрудников, которые были наняты в период летних месяцев
2023 года (июнь, июль, август). Это может быть полезно для анализа найма сотрудников в
определенный сезон.
Пример с диапазоном дат и времени:
SELECT *
FROM Events
WHERE StartDateTime BETWEEN '2024-01-01 08:00:00' AND '2024-01-01
17:00:00';
Этот запрос выберет события из таблицы Events , которые начинаются в определенное
время – с 8 утра до 5 вечера 1 января 2024 года. Это полезно для фильтрации событий,
происходящих в определенные часы.
Пример с комбинированным использованием:
SELECT *
FROM Sales
WHERE Amount BETWEEN 100 AND 500
AND Date BETWEEN '2023-01-01' AND '2023-12-31';
Здесь мы фильтруем продажи из таблицы Sales , где сумма ( Amount ) находится в
диапазоне от 100 до 500 и дата продажи ( Date ) приходится на 2023 год. Это пример
использования BETWEEN с несколькими условиями.
Пример с бинарными данными (Binary):
Предположим, у нас есть таблица Files с полем Data , которое хранит бинарные
данные.
SELECT *
FROM Files
WHERE Data BETWEEN BINARY 'A' AND BINARY 'F';
Этот запрос выберет все файлы, где бинарные данные находятся в диапазоне между
значениями, соответствующими 'A' и 'F'. Он используется для фильтрации данных в
бинарном формате.
Часто задаваемые вопросы (FAQ)
Вопрос 1: Как SQL BETWEEN работает с текстовыми данными?
Ответ: SQL BETWEEN с текстовыми данными фильтрует строки, основываясь на
алфавитном порядке. Например,
SELECT *
FROM Users
WHERE FirstName BETWEEN 'A' AND 'M'
выберет записи, где FirstName начинается с любой буквы от 'A' до 'M' включительно.
Вопрос 2: Можно ли использовать BETWEEN для фильтрации по времени?
Ответ: Да, можно. Например, WHERE StartTime BETWEEN '09:00:00' AND
'12:00:00' выберет записи, где время находится в этом интервале. Убедитесь, что
формат времени соответствует формату в вашей базе данных.
Вопрос 3: Являются ли границы в BETWEEN включительными?
Ответ: Да, в SQL BETWEEN включает оба граничных значения. Например, BETWEEN 10
AND 20 включает 10 и 20, а также все значения между ними.
Вопрос 4: Как использовать BETWEEN с датами?
Ответ: Для фильтрации по датам используйте формат даты, соответствующий вашей
СУБД. Например, WHERE HireDate BETWEEN '2023-01-01' AND '2023-1231' выберет всех сотрудников, нанятых в 2023 году.
Вопрос 5: Можно ли использовать BETWEEN с дробными числами?
Ответ: Да, BETWEEN работает и с дробными числами. Например, WHERE Amount
BETWEEN 100.50 AND 150.75 отфильтрует записи с Amount в этом числовом
диапазоне.
Вопрос 6: Как использовать BETWEEN для фильтрации по нескольким условиям?
Ответ: Вы можете комбинировать BETWEEN с другими условиями. Например, WHERE
Amount BETWEEN 100 AND 500 AND Date BETWEEN '2023-01-01' AND '2023-1231' фильтрует по двум диапазонам одновременно.
Вопрос 7: Возможно ли использование BETWEEN с бинарными данными?
Ответ: Да, можно использовать BETWEEN с бинарными данными,
используя BINARY для указания бинарного формата. Например, WHERE Data BETWEEN
BINARY 'A' AND BINARY 'F' .
Вопрос 8: Как оптимизировать производительность запросов с BETWEEN?
Ответ: Для оптимизации запросов с BETWEEN убедитесь, что используемые поля
проиндексированы, особенно при работе с большими наборами данных.
Вопрос 9: Можно ли использовать BETWEEN для сравнения строк в разных столбцах?
Ответ: Да, можно использовать BETWEEN для сравнения значений между столбцами.
Например,
SELECT *
FROM Orders
WHERE OrderDate BETWEEN CreatedDate AND ShippedDate
выберет заказы, дата которых попадает в интервал между датами создания и отправки.
Вопрос 10: Что будет, если использовать BETWEEN с обратным диапазоном значений?
Ответ: Если используется обратный диапазон, например BETWEEN 20 AND 10 , запрос
вернет пустой результат, так как нет значений, удовлетворяющих этому условию.
Вопрос 11: Можно ли использовать BETWEEN с переменными или плейсхолдерами в
подготовленных запросах?
Ответ: Да, можно использовать BETWEEN с переменными или плейсхолдерами в
подготовленных запросах. Это делает запросы более гибкими и безопасными от SQLинъекций. Например: WHERE column_name BETWEEN ? AND ? .
Вопрос 12: Можно ли использовать NOT BETWEEN для выбора значений вне заданного
диапазона?
Ответ: Да, NOT BETWEEN делает противоположное BETWEEN и выбирает строки, где
значения не попадают в указанный диапазон.
Вопрос 13: Влияет ли регистр символов при использовании BETWEEN с текстовыми данными?
Ответ: Зависит от конфигурации СУБД. В некоторых СУБД, например MySQL,
сравнение может быть нечувствительным к регистру, в других - чувствительным.
Уточните это в документации вашей СУБД.
Вопрос 14: Как использовать BETWEEN с типом данных ENUM?
Ответ: BETWEEN с ENUM работает на основе порядкового значения ENUM. Например,
если ENUM определен как ('New', 'Active', 'Retired'), BETWEEN 'New' AND
'Retired' включит все перечисленные значения, так как они следуют в определенном
порядке.
Вопрос 15: Можно ли использовать BETWEEN в сочетании с JOIN ?
Ответ: Да, можно использовать BETWEEN в запросах с JOIN . Например,
SELECT *
FROM Orders JOIN
Customers ON
Orders.CustomerID = Customers.ID
WHERE Orders.OrderDate
BETWEEN '2023-01-01' AND '2023-12-31'
выберет заказы в указанном временном диапазоне с информацией о клиентах.
Агрегативные функции(Min, Max, Count, Sum, Avg)
Определение:
Агрегатные функции в SQL, такие как MIN , MAX , COUNT , SUM , и AVG , используются
для выполнения различных операций на наборе значений и возвращения одного значения.
Эти функции часто применяются совместно с GROUP BY для агрегации данных по
определенным критериям.
Объяснение:




MIN и MAX возвращают минимальное и максимальное значения в столбце
соответственно.
COUNT подсчитывает количество строк, удовлетворяющих определенному условию.
SUM суммирует числовые значения в столбце.
AVG вычисляет среднее значение числовых данных в столбце.
Применение на практике:



Анализ данных: Например, определение максимальной и минимальной зарплаты
сотрудников, подсчет общего числа заказов или расчет общего дохода компании.
Отчеты: Создание сводных отчетов, включая статистические данные, такие как средние
значения, суммы, минимальные и максимальные значения.
Условное агрегирование: Использование в сочетании с CASE для более сложных
агрегаций, основанных на условиях.
Синтаксис:
SELECT MIN(column_name), MAX(column_name), COUNT(column_name),
SUM(column_name), AVG(column_name)
FROM table_name
WHERE condition;
Примеры:
1. Поиск минимальной и максимальной зарплаты:
2. SELECT MIN(Salary) AS MinSalary, MAX(Salary) AS MaxSalary
FROM Employees;
3. Подсчет общего количества заказов:
4. SELECT COUNT(OrderID) AS TotalOrders
FROM Orders;
5. Расчет общего дохода:
6. SELECT SUM(Salary) AS TotalSalary
FROM Orders;
7. Вычисление средней зарплаты:
8. SELECT AVG(Salary) AS AverageSalary
FROM Employees;
9. Комбинирование агрегатных функций с GROUP BY :
10. SELECT DepartmentID, COUNT(EmployeeID) AS EmployeesCount,
AVG(Salary) AS AverageSalary
11. FROM Employees
GROUP BY DepartmentID;
Эти функции играют ключевую роль в анализе и обработке данных, позволяя выполнять
различные агрегатные операции над наборами данных для получения значимой
информации.
Часто задаваемые вопросы (FAQ)
Вопрос 1: Можно ли использовать агрегатные функции без GROUP BY ?
Ответ: Да, можно использовать агрегатные функции без GROUP BY для получения
агрегированных значений по всей таблице. Например, SELECT COUNT(*) FROM
Employees; подсчитает общее количество сотрудников в таблице.
Вопрос 2: Как COUNT(*) отличается от COUNT(column_name) ?
Ответ: COUNT(*) подсчитывает все строки в таблице, включая строки
с NULL значениями в любом столбце, тогда как COUNT(column_name) считает только
строки, где указанный столбец не содержит NULL .
Вопрос 3: Влияют ли NULL значения на результаты функций SUM и AVG ?
Ответ: NULL значения игнорируются функциями SUM и AVG . Таким образом, они не
влияют на суммирование или вычисление среднего значения.
Вопрос 4: Что возвращает MIN и MAX при работе с текстовыми данными?
Ответ: При работе с текстовыми данными MIN и MAX возвращают минимальное и
максимальное значения в алфавитном порядке.
Вопрос 5: Можно ли использовать агрегатные функции в условиях WHERE ?
Ответ: Непосредственно в WHERE использовать агрегатные функции нельзя. Для
фильтрации агрегированных результатов используйте предложение HAVING .
Вопрос 6: Как можно комбинировать агрегатные функции с условными операторами?
Ответ: Используйте CASE внутри агрегатных функций для выполнения условного
агрегирования. Например, SELECT AVG(CASE WHEN gender = 'Male' THEN salary
END) FROM Employees; вычислит среднюю зарплату только для мужчин.
Вопрос 7: Что произойдет, если в GROUP BY используются несколько столбцов?
Ответ: Если в GROUP BY указаны несколько столбцов, данные будут агрегированы по
уникальным комбинациям значений этих столбцов. Это позволяет проводить более
детализированный анализ данных.
Вопрос 8: Как AVG обрабатывает дробные числа?
Ответ: Функция AVG возвращает среднее значение с учетом дробной части. Тип
возвращаемого значения зависит от СУБД и может потребовать округления или
приведения типа.
Используя таблицу Orders , напишите запрос для подсчета уникальных клиентов,
которые сделали заказы. Учитывайте каждого клиента только один раз, даже если он
сделал несколько заказов. Задайте для столбца псевдоним UniqueCustomers
SELECT COUNT(distinct customer_id) AS UniqueCustomers
FROM Orders;
SQL GROUP BY
Определение:
Оператор GROUP BY в SQL используется для группирования строк, которые имеют
одинаковые значения в одном или нескольких столбцах, в суммарные данные, как,
например, количество строк для каждой группы.
Объяснение:
Оператор GROUP BY собирает данные, разбивая результаты запроса на группы, в рамках
которых можно выполнить агрегатные вычисления. Основное применение GROUP BY –
это агрегирование данных для аналитических и статистических отчетов.
Применение на практике:



Анализ данных: Группировка данных по определенным критериям для анализа,
например, подсчет общего количества продаж по категориям продуктов.
Отчеты: Создание сводных отчетов, которые показывают суммарные, средние,
максимальные или минимальные значения по различным группам.
Упрощение данных: Группирование данных для упрощения их анализа, представляя
только агрегированную информацию вместо детального списка.
Синтаксис:
SELECT column_1, aggregate_function(column_2)
FROM table
WHERE condition
GROUP BY column_1;
Здесь column1 – это столбец, по которому производится группировка,
а aggregate_function может быть SUM() , COUNT() , MAX() , MIN() , AVG() и т.д.,
применяемая к column2 .
Примеры:
1. Подсчет количества сотрудников в каждом отделе:
SELECT Department, COUNT(EmployeeID)
FROM Employees
GROUP BY Department;
В этом примере строки сгруппированы по столбцу Department , и для каждой группы
подсчитывается количество сотрудников с помощью функции COUNT .
2. Суммирование продаж по каждому продукту:
SELECT ProductName, SUM(Sales)
FROM Sales
GROUP BY ProductName;
Здесь данные группируются по ProductName , и для каждой группы рассчитывается
общая сумма продаж.
3. Средняя зарплата по отделам:
SELECT Department, AVG(Salary)
FROM Employees
GROUP BY Department;
В этом запросе для каждого отдела вычисляется средняя зарплата сотрудников.
1. До сих пор мы указывали в SELECT поле, по которому производилась
группировка, но это необязательно. Если его не указать, это поле
просто не отобразится в итоговой таблице:
Скопировать кодSQL
SELECT COUNT(name_hotdog) AS cnt_order,
AVG(quantity) AS average_quantity,
SUM(vegan_sausage) AS sum_vegan_sausage
FROM hotdog
GROUP BY name_hotdog;
2. Но если поле указано в SELECT, оно обязательно должно
присутствовать и в группировке. Вот такой код вернёт ошибку: поле
date тоже нужно указать в группировке через запятую.
Скопировать кодSQL
SELECT name_hotdog,
date,
AVG(price)
FROM hotdog
GROUP BY name_hotdog;
Часто задаваемые вопросы (FAQ)
Вопрос 1: Что произойдет, если столбец в списке SELECT не указан в GROUP BY?
Ответ: Во многих СУБД запрос будет считаться недопустимым, если столбец, не
являющийся агрегатной функцией, включен в SELECT , но отсутствует в GROUP BY . Это
приводит к ошибке, так как СУБД не может определить, какое конкретное значение
должно быть показано для этого столбца.
Вопрос 2: Можно ли использовать алиасы столбцов в GROUP BY ?
Ответ: В большинстве СУБД нельзя использовать алиасы столбцов, определенные
в SELECT , непосредственно в GROUP BY . Вам нужно использовать само выражение или
номер столбца в GROUP BY .
Вопрос 3: Можно ли группировать данные по нескольким столбцам?
Ответ: Да, можно группировать данные по нескольким столбцам, указав их через запятую
в GROUP BY . Это позволяет проводить более детальный анализ, создавая подгруппы
внутри групп.
Вопрос 4: Что делать, если в группирующем столбце есть NULL значения?
Ответ: Строки, в которых группирующий столбец содержит NULL , будут сгруппированы
в одну группу. В SQL NULL считается отдельным значением при группировке.
Вопрос 5: Можно ли использовать GROUP BY без агрегатных функций?
Ответ: Хотя GROUP BY чаще всего используется с агрегатными функциями, его также
можно использовать без них для удаления дубликатов из результата запроса, но это менее
эффективно по сравнению с использованием DISTINCT .
Вопрос 6: Как использовать HAVING с GROUP BY ?
Ответ: HAVING используется для фильтрации групп, созданных с помощью GROUP BY .
В отличие от WHERE , который фильтрует строки до группировки, HAVING фильтрует
группы после их формирования.
Вопрос 7: В каком порядке обрабатываются GROUP BY и ORDER BY в SQL-запросе?
Ответ: Сначала выполняется GROUP BY для группировки строк в наборы, а затем ORDER
BY для упорядочивания этих групп или отдельных строк в результатах запроса.
Задание заключается в подсчете количества различных продуктов в каждой категории, используя
данные из таблицы Products . Для вывода результата используйте псевдоним ProductCount .
SELECT category, COUNT(category) AS ProductCount
FROM Products
GROUP BY category;
Используя таблицу Employees необходимо написать запрос для определения количества
сотрудников
в
каждом
отделе
( department ). Для
вывода
результата
используйте
псевдоним EmployeesCount .
SELECT department, COUNT(department) AS EmployeesCount
FROM Employees
GROUP BY department;
Задача заключается в расчете средней цены проданных единиц для каждого продукта в
таблице Sales . Для вывода результатов используйте псевдоним AveragePrice .
SELECT product_id, AVG(price) AS AveragePrice
FROM Sales
GROUP BY product_id;
Задание состоит в определении пяти наиболее продаваемых продуктов по количеству продаж,
используя данные из таблицы Sales . Необходимо ранжировать продукты по общему количеству
проданных единиц и вывести топ 5.
SELECT product_id, SUM(quantity) AS TotalQuantity
FROM Sales
GROUP BY product_id
ORDER BY TotalQuantity DESC
LIMIT 5;
SQL HAVING
Определение:
HAVING — это оператор в SQL, используемый для фильтрации агрегированных данных,
полученных с помощью оператора GROUP BY . Этот оператор позволяет указывать
условия для агрегатных функций, которые не могут быть применены в
предложении WHERE .
Он фильтрует значения, полученные в результате группировки — то есть
работает не с новыми полями, а с результатом вычислений. Его
записывают после GROUP BY.
WHERE работает с исходными данными, HAVING — с результатом группировки.
Все операторы, с которыми вы знакомы, можно комбинировать с HAVING —
но только при условии, что в запросе есть группировка GROUP BY. Без неё
HAVING работать не будет.
Объяснение:
HAVING работает аналогично WHERE , но используется после группировки данных. В то
время как WHERE фильтрует строки до выполнения агрегации, HAVING фильтрует
результаты после того, как агрегатные функции уже применены. Это критично для работы
с суммарными, средними значениями, максимумами, минимумами и другими
агрегированными данными.
Применение на практике:



Фильтрация агрегатных результатов: Отбор групп по специфическим критериям
агрегации, например, суммы продаж выше определённого порога.
Управление статистическими данными: Выделение значений, удовлетворяющих
заданным условиям после агрегации, например, средних зарплат по отделам.
Использование в сложных запросах: Комбинирование с другими SQL операторами для
формирования многоуровневых фильтров и анализов.
Синтаксис:
SELECT column1, aggregate_function(column2)
FROM table
WHERE condition
GROUP BY column1
HAVING aggregate_condition;
Здесь aggregate_function может быть SUM() , COUNT() , MAX() , MIN() , AVG() и
т.д., а aggregate_condition — это условие, применяемое к результатам выполнения
этих функций.
Примеры:
1. Фильтрация групп по сумме
SELECT Department, SUM(Salary) AS TotalSalary
FROM Employees
GROUP BY Department
HAVING SUM(Salary) > 100000;
В этом запросе выбираются только те отделы, где общая зарплата сотрудников превышает
100000.
2. Отбор по количеству элементов в группе
SELECT Product, COUNT(*) AS CountOfProducts
FROM Inventory
GROUP BY Product
HAVING COUNT(*) > 10;
Запрос показывает продукты, количество которых на складе больше 10.
3. Комбинирование с WHERE и HAVING
SELECT CustomerID, COUNT(OrderID) AS NumberOfOrders
FROM Orders
WHERE OrderDate >= '2020-01-01'
GROUP BY CustomerID
HAVING COUNT(OrderID) > 5;
Этот запрос выбирает клиентов, сделавших более 5 заказов после '2020-01-01'.
Часто задаваемые вопросы (FAQ)
Вопрос 1. В чем разница между WHERE и HAVING ?
Ответ: Основное различие между WHERE и HAVING заключается в том,
что WHERE применяется до агрегирования данных, фильтруя строки, которые будут
участвовать в агрегации. В свою очередь, HAVING применяется после агрегирования,
позволяя фильтровать агрегированные результаты по заданным условиям.
Вопрос 2. Можно ли использовать HAVING без GROUP BY ?
Ответ: Да, использовать HAVING можно без GROUP BY , если в запросе присутствуют
агрегатные функции. В таком случае, HAVING будет действовать на результаты этих
функций, примененных ко всему набору данных.
Вопрос 3. Почему мой запрос с HAVING работает медленно?
Ответ: HAVING может замедлять выполнение запроса, так как он требует от СУБД
сначала выполнить агрегацию данных перед применением фильтра. Для оптимизации
производительности убедитесь, что используете индексы, минимизируете количество
данных, участвующих в агрегации, или рассмотрите возможность оптимизации вашего
запроса другими способами.
Вопрос 4. Как использовать HAVING для фильтрации на нескольких уровнях агрегации?
Ответ: Для фильтрации на нескольких уровнях агрегации можно использовать
вложенные запросы или CTE (Common Table Expressions), где каждый уровень агрегации
фильтруется отдельно в своем запросе. HAVING применяется в каждом подзапросе или
CTE для соответствующего уровня агрегации.
Вопрос 5. Можно ли использовать HAVING с неагрегатными столбцами?
Ответ: Нет, HAVING предназначен для работы с агрегатными функциями. Для
фильтрации по значениям неагрегатных столбцов следует использовать WHERE . Если
пытаться использовать HAVING для неагрегированных столбцов без GROUP BY , это
приведет к ошибке в большинстве СУБД.
Вопрос 6. Какие агрегатные функции можно использовать с HAVING ?
Ответ: С HAVING можно использовать любые агрегатные функции, такие
как COUNT() , SUM() , AVG() , MAX() , и MIN() . Эти функции позволяют выполнять
различные виды агрегаций и затем фильтровать их результаты.
Используя таблицу Orders , напишите запрос для выявления клиентов ( customer_id ), которые
сделали более трех заказов( order_id ).
SELECT customer_id, COUNT(order_id) AS NumberOfOrders
FROM Orders
GROUP BY customer_id
HAVING COUNT(order_id)>3;
Используя таблицу Employees , выявите отделы, где количество сотрудников меньше трех. Это
задание поможет определить малочисленные отделы в компании.
SELECT department, COUNT(employee_id) AS EmployeesCount
FROM Employees
GROUP BY department
HAVING COUNT(employee_id) < 3;
Используя таблицу Orders , напишите запрос для идентификации клиентов, чья общая сумма всех
заказов превышает 5000. Это задание поможет выявить наиболее важных клиентов с точки зрения
оборота компании.
SELECT customer_id, SUM(total_amount) AS TotalAmount
FROM Orders
GROUP BY customer_id
HAVING SUM(total_amount) > 5000;
Используя таблицу Sales , напишите запрос, который идентифицирует месяцы, в
которых общая сумма продаж превысила 10000. Это задание поможет анализировать
месяцы с высокой коммерческой активностью.
SELECT MONTH(transaction_date) AS SaleMonth, SUM(total_price) AS
TotalSales
FROM Sales
GROUP BY SaleMonth
HAVING SUM(total_price) > 10000;
Используя таблицу Sales , определите продукты, у которых средний доход от продажи каждой
единицы продукта превышает 1000, и общий доход от всех продаж составляет более 50000. Это
задание поможет выявить высокодоходные продукты, которые приносят значительный вклад в
общий оборот компании.
SELECT product_id, AVG(price) AS AveragePricePerUnit, SUM(price*quantity)
AS TotalRevenue
FROM Sales
GROUP BY product_id
HAVING AVG(price) > 1000 AND SUM(price*quantity) > 50000;
Используя таблицу Employees , определите отделы, где разница между максимальной и
минимальной зарплатой сотрудников превышает 30000, и средняя зарплата больше 80000. Этот
запрос поможет идентифицировать отделы с большим разбросом зарплат и высоким средним
уровнем оплаты труда.
SELECT department, MAX(salary) - MIN(salary) AS SalaryRange, AVG(salary)
AS AverageSalary
FROM Employees
GROUP BY department
HAVING MAX(salary) - MIN(salary) > 30000 and AVG(salary) > 80000;
Используя таблицу Sales , выявите категории продуктов, где общее количество проданных
единиц превышает 100, а суммарный доход от продаж в каждой категории больше 100000. Этот
анализ поможет определить наиболее успешные категории по объему и доходу от продаж.
SELECT category, SUM(quantity) AS TotalQuantity, SUM(quantity*price) AS
TotalIncome
FROM Sales
GROUP BY category
HAVING SUM(quantity) > 100 AND SUM(quantity*price) > 100000;
Используя таблицу Orders , определите клиентов, у которых максимальное количество
товаров в одном заказе более чем в 10 раз превышает минимальное количество товаров в
заказе, и общее количество заказов больше 5. Это задание поможет выявить клиентов с
нестабильным потребительским поведением, что может быть важно для анализа продаж и
планирования маркетинговых мероприятий.
SELECT customer_id, MAX(quantity) AS MaxQuantity, MIN(quantity) AS
MinQuantity, COUNT(quantity) AS OrdersCount
FROM Orders
GROUP BY customer_id
HAVING COUNT(quantity) > 5;
SQL ROLLUP
Введение:
ROLLUP — это функционал в SQL, предназначенный в основном для аналитических
задач, а не для повседневной разработки.
То есть, ROLLUP чаще всего применяется в аналитических задачах, а не в базовой
разработке SQL. Если вы изучаете SQL в контексте разработки, возможно, вы не
столкнетесь с необходимостью использования ROLLUP на практике, и эту тему можно
пропустить.
Определение:
ROLLUP — это расширение оператора GROUP BY , которое используется в SQL для
создания сводных отчетов с подитогами на разных уровнях агрегации. Этот оператор
особенно полезен для аналитических запросов, где требуется суммировать данные по
иерархической структуре.
Объяснение:
ROLLUP добавляет подитоги на каждом уровне иерархии группировки, начиная от
наименее детализированного до наиболее детализированного уровня. Это позволяет
быстро и легко создавать многоуровневые сводные отчеты, которые полезны для
принятия решений в бизнесе.
Применение на практике:
ROLLUP идеально подходит для:



Подготовки отчетов о продажах, где требуются итоги по различным временным периодам.
Финансового анализа, где необходимы субитоги по различным сегментам или категориям.
Любых аналитических задач, где требуется иерархический подсчет данных.
Синтаксис:
SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY column1, column2 WITH ROLLUP;
Пример запроса:
SELECT Year, Month, SUM(Sales)
FROM SalesData
GROUP BY Year, Month WITH ROLLUP;
В этом запросе мы получаем сумму продаж для каждого месяца в каждом году, а также
итоги по каждому году и общий итог по всем месяцам и годам.
Часто задаваемые вопросы (FAQ)
Вопрос 1. Что такое SQL ROLLUP и для чего он используется?
Ответ: SQL ROLLUP — это расширение оператора GROUP BY , которое используется для
генерации итоговых и подитоговых значений в запросах. Это позволяет выполнять
агрегирование данных на нескольких уровнях, упрощая создание отчетов с подробной
разбивкой по иерархическим уровням, таким как по годам, кварталам и месяцам.
Вопрос 2. Как отличается ROLLUP от CUBE ?
Ответ: ROLLUP создает подитоги, которые идут от наиболее детализированного к
наименее детализированному уровню, формируя иерархическую структуру
агрегации. CUBE , в отличие от ROLLUP , генерирует подитоги для всех возможных
комбинаций группирующих столбцов, предоставляя более комплексный и многомерный
анализ данных.
Вопрос 3. Можно ли использовать ROLLUP без GROUP BY ?
Ответ: ROLLUP является частью синтаксиса GROUP BY и не может использоваться
отдельно от него. Он указывается вместе с GROUP BY для определения, какие столбцы
будут использоваться для группировки и агрегации на разных уровнях.
Вопрос 4. Какие функции агрегации можно использовать с ROLLUP ?
Ответ: С ROLLUP можно использовать любые стандартные SQL агрегатные функции,
такие как SUM() , COUNT() , AVG() , MIN() , и MAX() . Эти функции применяются для
расчета итогов по каждой группе и подгруппе, созданной с помощью ROLLUP .
Вопрос 5. В каких случаях полезно использовать ROLLUP ?
Ответ: ROLLUP особенно полезен при создании финансовых отчетов, статистических
анализов и любых других документов, где требуется демонстрация итогов и подитогов по
различным сегментам данных. Он помогает аналитикам и руководителям легче понимать
общие тенденции и детали на более мелких уровнях агрегации.
Вопрос 6. Каковы лучшие практики для оптимизации запросов с ROLLUP ?
Ответ: Для оптимизации запросов с ROLLUP рекомендуется:



Использовать индексы на столбцах, участвующих в группировке, чтобы ускорить
агрегацию.
Тщательно планировать запросы, чтобы избежать лишней нагрузки на сервер, особенно
при работе с большими объемами данных.
Проверять результаты на тестовом наборе данных для убеждения в корректности
агрегаций и итогов.
Распространенные ошибки
Ошибка №1: Неправильная последовательность столбцов в ROLLUP
Описание ошибки: Очередность столбцов, указанных в ROLLUP , важна, так как она
определяет иерархию агрегирования данных. Неправильная последовательность может
привести к неправильным или нелогичным итогам.
Пример неправильного использования:
SELECT Region, City, SUM(Sales)
FROM SalesData
GROUP BY ROLLUP (City, Region);
Пояснение: В этом запросе сначала агрегируются данные по городу, а затем по региону,
что логически некорректно, так как города входят в состав регионов.
Правильный подход:
SELECT Region, City, SUM(Sales)
FROM SalesData
GROUP BY ROLLUP (Region, City);
Здесь данные сначала агрегируются по региону, что является более крупной единицей, а
затем по городам внутри каждого региона.
Ошибка №2: Использование ROLLUP вместо CUBE при необходимости полной кросс-агрегации
Описание ошибки: Иногда пользователи применяют ROLLUP , когда требуется полный
многомерный анализ возможных комбинаций, что лучше делать с помощью CUBE .
Пример неправильного использования:
SELECT Region, Product, SUM(Sales)
FROM SalesData
GROUP BY ROLLUP (Region, Product);
Пояснение: ROLLUP даст итоги по продуктам в каждом регионе и общий итог по
регионам, но не покажет итоги по каждому продукту независимо от региона.
Правильный подход:
SELECT Region, Product, SUM(Sales)
FROM SalesData
GROUP BY CUBE (Region, Product);
Использование CUBE обеспечит полный анализ комбинаций регионов и продуктов,
включая итоги по каждому продукту и каждому региону отдельно.
Ошибка №3: Заблуждение относительно вывода NULL значений
Описание ошибки: В результате использования ROLLUP могут появляться строки
с NULL в столбцах группировки, что иногда воспринимается как ошибка.
Пример неправильного понимания:
SELECT Year, Month, SUM(Sales)
FROM SalesData
GROUP BY ROLLUP (Year, Month);
Пояснение: Пользователи могут ожидать увидеть значения для всех годов и месяцев,
но ROLLUP также включит строки, где Month будет NULL , что указывает на итоги за
весь год.
Как правильно интерпретировать результаты: Принять, что строки с NULL в столбце
месяца представляют собой итоговые суммы за весь год, а строка, где и Year ,
и Month равны NULL , показывает общий итог по всем годам и месяцам.
Используя таблицу Sales , напишите запрос для отображения общего дохода по каждой категории
продуктов с использованием ROLLUP, чтобы также получить итоговый общий доход по всем
категориям.
SELECT category, SUM(total_price) AS TotalRevenue
FROM Sales
GROUP BY category WITH ROLLUP;
Используя таблицу Sales , создайте запрос с использованием ROLLUP для суммирования
месячных продаж каждого отдела и подсчета общей суммы продаж.
SELECT department, MONTH(sale_date) AS SaleMonth, SUM(total_price) AS
TotalSales
FROM Sales
GROUP BY department, SaleMonth WITH ROLLUP;
SELECT 'столбцы или * для выбора всех столбцов; обязательно'
FROM 'таблица; обязательно'
WHERE 'условие/фильтрация, например, city = 'Moscow'; необязательно'
GROUP
BY
'столбец,
по
которому
хотим
сгруппировать
данные;
необязательно'
HAVING
'условие/фильтрация
на
уровне
сгруппированных
данных;
необязательно'
ORDER BY 'столбец, по которому хотим отсортировать вывод; необязательно'
Вставка записи в таблицу
Для занесения новой записи в таблицу используется SQL запрос, в котором
указывается в какую таблицу, в какие поля заносить новые значения.
Структура запроса:
ключевые слова INSERT INTO (ключевое слово INTO можно пропустить);
имя таблицы, в которую добавляется запись;
открывающая круглая скобка «(»;
список полей через запятую, в которые следует занести новые данные;
закрывающая скобка «)»;
ключевое слово VALUES;
открывающая круглая скобка «(»;
список значений через запятую, которые заносятся в соответствующие поля,
при этом текстовые значения заключаются в кавычки, числовые значения
записываются без кавычек, в качестве разделителя целой и дробной части
используется точка;
закрывающая скобка «)».
Пример. В таблицу, состоящую из двух столбцов добавим новую строку, при
этом в поле1 заносится значение1, в поле2 - значение2.
INSERT INTO таблица(поле1, поле2)
VALUES (значение1, значение2);
В результате выполнения запроса новая запись заносится в конец обновляемой
таблицы.
При составлении списка полей и списка значений необходимо учитывать
следующее:
количество полей и количество значений в списках должны совпадать;
должно существовать прямое соответствие между позицией одного и того же
элемента в обоих списках, поэтому первый элемент списка значений должен
относиться к первому столбцу в списке столбцов, второй – ко второму столбцу
и т.д.;
типы данных элементов в списке значений должны быть совместимы с
типами данных соответствующих столбцов таблицы ( целое число можно
занести в поле типа DECIMAL, обратная операция - недопустима);
новые значения нельзя добавлять в поля, описанные как PRIMARY KEY
AUTO_INCREMENT;
рекомендуется заполнять все поля записи, если же поле пропущено, значение
этого поля зависит от установленных по умолчанию значений, если значения
не установлены - на данной платформе вставляется пустое значение (NULL).
INSERT INTO book (title, author, price, amount)
VALUES ('Мастер и Маргарита', 'Булгаков М.А.', '670.99', 3);
Создание таблицы
Для создания таблицы используется SQL-запрос. В нем указывается какая
таблица создается, из каких атрибутов(полей) она состоит и какой тип данных
имеет каждое поле, при необходимости указывается описание полей
(ключевое поле и т.д.). Его структура :
ключевые слова : CREATE TABLE
имя создаваемой таблицы;
открывающая круглая скобка «(»;
название поля и его описание, которое включает тип поля и другие
необязательные характеристики;
запятая;
название поля и его описание;
...
закрывающая скобка «)».
Пример. Создадим таблицу genre следующей структуры:
Поле Тип, описание
genre_id
INT PRIMARY KEY AUTO_INCREMENT
name_genre VARCHAR(30)
Запрос:
CREATE TABLE genre(
genre_id INT PRIMARY KEY AUTO_INCREMENT,
name_genre VARCHAR(30)
);
Созданная таблица - пустая.
CREATE TABLE book(
book_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(50),
author VARCHAR(30),
price DECIMAL(8, 2),
amount INT
);
Тип данных
INT
INTEGER
DECIMAL
NUMERIC
Описание
Пример
Целое число, могут принимать значения
от -2 147 483 648 до 2 147 483 647
-567
1205
Вещественное число,
в скобках указывается максимальная
длина числа (включает символы слева и справа от
десятичной запятой)
и количество знаков после запятой.
Можно использовать оба этих типа, они эквивалентны,
принимают значения в диапазоне -1038+1 до 1038-1.
34.6
-3.294
DECIMAL(4,1)
NUMERIC(6,3)
DATE
VARCHAR
Дата в формате ГГГГ-ММ-ДД
26 июля 2020 года
3 января 2021 года
Строка длиной не более 255 символов,
в скобках указывается максимальная
длина строки, которая может храниться в поле
2020-0726
2021-0103
VARCHAR(10)(рассматриваются однобайтовые
кодировки,
пример
описание
для которых число в скобках соответствует
максимальному
количеству символов в строке)
Например, код
Скопировать кодSQL
SELECT 7/2
вернёт результат 3.
Один из элементов деления обязательно должен быть дробным типом,
чтобы всё прошло как надо. Именно поэтому в запросе выше написано
100.0, а не 100. Остальные математические операции в PostgreSQL
выполняются как обычно.
Еще можно иногда заметить вот такой вариант деления:
Скопировать кодSQL
SELECT 7::numeric/2
После делителя или делимого добавляют сочетание слов ::numeric. Так мы
говорим программе, что это дробное число, и деление выполнится с
остатком.
В поле bracelet_id хранится шестизначное число, отвечающее за код браслета. Все эти числа
начинаются с 145. Чтобы было удобнее работать с полем, эти цифры можно убрать.
Отобразите первые пять записей с полем bracelet_id и с новым полем, где будут только три
последние цифры.
SELECT bracelet_id, bracelet_id - 145000 AS id-- впишите сюда нужные поля
FROM buyer
LIMIT 5;
сколько всего пользователей в таблице hotdog и сколько — уникальных:
SELECT COUNT(DISTINCT(bracelet_id)),
COUNT(bracelet_id)
FROM hotdog;
Посчитайте, сколько раз заказывали хот-дог «Карибский Потоп» в феврале. Вам понадобятся
поле date и поле с названием хот-дога (name_hotdog).
SELECT COUNT(name_hotdog)
FROM hotdog
WHERE DATE_TRUNC('month', date) = '2022-02-01' AND name_hotdog =
'Карибский Потоп';
Давайте рассчитаем настоящую бизнес-метрику — conversion rate, или CR. Это доля
уникальных пользователей от пользователей в целом из таблицы hotdog. Разделите число
уникальных пользователей на число всех пользователей. Используйте поле bracelet_id.
SELECT COUNT(DISTINCT(bracelet_id))/COUNT(bracelet_id)-- впишите сюда
формулу
::numeric -- не удаляйте эту строку из-за особенностей деления
FROM hotdog;


Средний чек — сумма, которую в среднем приносит покупатель за
один заказ. Для наших вычислений мы будем использовать баллы —
внутреннюю валюту «Роботлэнда».
CR (от англ. Conversion Rate) — отношение в процентах, которое
показывает, сколько человек из общего числа посетителей
совершили целевое действие. В нашем случае это отношение
посетителей «Роботлэнда», которые заказали пиццу, к общему числу
посетителей.
Теперь посчитаем конверсию посетителей парка в заказы пиццы. Напомним,
конверсия — это отношение числа уникальных посетителей, которые заказали
пиццу, к общему количеству уникальных посетителей. Отдел маркетинга сообщает,
что за три месяца в парке побывала 1000 посетителей.
SELECT COUNT(DISTINCT (bracelet_id))/1000
::numeric
FROM pizza


DAU, WAU и MAU (от англ. Daily, Weekly, Monthly Active Users) —
число уникальных покупателей за день, неделю и месяц.
ARPPU (от англ. Average Revenue per Paying User) — средняя выручка
на одного уникального покупателя. Эта метрика показывает, сколько
денег в среднем приносит парку один покупатель за квартал.
Сначала посчитаем средний чек. Будем проводить анализ пошагово и
посчитаем:
Общий средний чек. Это позволит оценить, какой доход в среднем приносит
один заказ пиццы.
Средний чек для каждого вида пиццы: возможно, некоторые приносят более
высокую выручку.
Средний чек для вегетарианских и мясных пицц — вдруг вегетарианские
пиццы приносят больше баллов?
Средний чек для пиццы с сырным бортиком и без.
Затем посмотрим, как ведут себя покупатели пиццы и вычислим:
Общую конверсию: так мы узнаем, как часто посетители «Роботлэнда»
заказывают пиццу.
Конверсию в динамике: посмотрим, как менялся показатель в разные месяцы.
Конверсию по первой зоне подключения и по виду пиццы: возможно, найдутся
неожиданные закономерности.
Каждую задачу рассмотрим отдельно и сделаем выводы.
Рассчитайте конверсию по месяцам. Отобразите в итоговой таблице первый день месяца и
конверсию. Отсортируйте таблицу по месяцам в порядке возрастания. Не учитывайте
сотрудников парка: номера их браслетов — 145738, 145759, 145773, 145807, 145815, 145821,
145873, 145880.
SELECT DATE_TRUNC('month', date),
COUNT(DISTINCT (bracelet_id))/1000.0::numeric as conv
FROM pizza
WHERE bracelet_id NOT IN (145738, 145759, 145773, 145807, 145815, 145821,
145873, 145880)
GROUP BY DATE_TRUNC('month', date)
ORDER BY DATE_TRUNC('month', date)
А может быть, конверсия связана с размером пиццы? Проверим!
Отобразите название и радиус пиццы. Рассчитайте конверсию. Не учитывайте
работников компании. Оставьте только те строки, где конверсия выше 3% — такой
целевой показатель у менеджеров парка.
SELECT name, radius, COUNT(DISTINCT (bracelet_id))/1000.0 AS conv
FROM pizza
WHERE bracelet_id NOT IN (145738, 145759, 145773, 145807, 145815, 145821,
145873, 145880)
--AND conv > 0.03
GROUP BY name, radius
HAVING COUNT(DISTINCT (bracelet_id))/1000.0 > 0.03
Ранее мы обращали внимание, что конверсия немного упала в марте. Рассчитайте
показатель DAU за март: узнайте количество уникальных покупателей в этом
месяце.
Отобразите дату и количество уникальных покупателей. Отсортируйте таблицу по
дате в порядке возрастания.
SELECT date, COUNT(DISTINCT bracelet_id)
FROM pizza
WHERE date >='2022-03-01' AND date <='2022-03-31'
GROUP BY date
ORDER BY date;
Теперь посмотрим динамику по неделям. Рассчитайте WAU: количество уникальных
покупателей по неделям.
Отобразите в таблице номер недели и WAU. Отсортируйте таблицу по номеру
недели в порядке возрастания.
SELECT
EXTRACT(WEEK FROM date),
COUNT(DISTINCT bracelet_id)
FROM pizza
group by EXTRACT(WEEK FROM date)
Давайте проверим, связан ли небольшой провал конверсии в марте с количеством
уникальных покупателей. Рассчитайте показатель MAU: количество уникальных
покупателей для января, февраля и марта.
Отобразите в таблице месяц в виде первой даты и MAU. Отсортируйте таблицу по
месяцу в порядке возрастания.
SELECT
DATE_TRUNC('month', date),
COUNT(DISTINCT bracelet_id)
FROM pizza
WHERE
DATE_TRUNC('month',
date)
DATE_TRUNC('month', date) <='2022-03-31'
GROUP BY DATE_TRUNC('month', date)
>='2022-01-01'
AND
ORDER BY DATE_TRUNC('month', date);
.
Теперь посчитаем ARPPU за январь по дням. Отобразите номер дня и значение
метрики. Чтобы вычислить ARPPU, разделите общую выручку на число уникальных
покупателей.
SELECT
EXTRACT(day FROM date) AS numer_day,
SUM(price*quantity) /COUNT(DISTINCT bracelet_id)AS ARPPU
FROM pizza
WHERE DATE_TRUNC('day', date) >= '2022-01-01'
and DATE_TRUNC('day', date) <= '2022-01-31'
GROUP BY numer_day
ORDER BY numer_day ASC
Download