Создание SQL-запроса вручную
Создание SQL-запроса вручную Пожалуйста, включите JavaScript в браузере!Создание SQL-запроса вручную
С помощью строки поиска вы можете вручную создавать SQL-запросы любой сложности для фильтрации событий.
Чтобы сформировать SQL-запрос вручную:
- Перейдите в раздел События веб-интерфейса KUMA.
Откроется форма с полем ввода.
- Введите SQL-запрос в поле ввода.
- Нажмите на кнопку .
Отобразится таблица событий, соответствующих условиям вашего запроса. При необходимости вы можете отфильтровать события по периоду.
Поддерживаемые функции и операторы
SELECT
– поля событий, которые следует возвращать.Для
SELECT
в программе поддержаны следующие функции и операторы:- Функции агрегации:
count, avg, max, min, sum
. - Арифметические операторы:
+, -, *, /, <, >, =, !=, >=, <=
.Вы можете комбинировать эти функции и операторы.
Если вы используете в запросе функции агрегации, настройка отображения таблицы событий, сортировка событий по возрастанию и убыванию, а также получение статистики недоступны.
- Функции агрегации:
FROM
– источник данных.При создании запроса в качестве источника данных вам нужно указать значение events.
WHERE
– условия фильтрации событий.AND, OR, NOT, =, !=, >, >=, <, <=
IN
BETWEEN
LIKE
ILIKE
inSubnet
match
(в запросах используется синтаксис регулярных выражений re2, специальные символы требуется дополнительно экранировать с помощью обратной косой черты (\))
GROUP BY
– поля событий или псевдонимы, по которым следует группировать возвращаемые данные.Если вы используете в запросе группировку данных, настройка отображения таблицы событий, сортировка событий по возрастанию и убыванию, получение статистики, а также ретроспективная проверка недоступны.
ORDER BY
– столбцы, по которым следует сортировать возвращаемые данные.Возможные значения:
DESC
– по убыванию.ASC
– по возрастанию.
OFFSET
– пропуск указанного количества строк перед выводом результатов запроса.LIMIT
– количество отображаемых в таблице строк.Значение по умолчанию – 250.
Если при фильтрации событий по пользовательскому периоду количество строк в результатах поиска превышает заданное значение, вы можете отобразить в таблице дополнительные строки, нажав на кнопку Показать больше записей. Кнопка не отображается при фильтрации событий по стандартному периоду.
Примеры запросов:
SELECT * FROM `events` WHERE Type IN ('Base', 'Audit') ORDER BY Timestamp DESC LIMIT 250
Все события таблицы events с типом Base и Audit, отсортированные по столбцу Timestamp в порядке убывания. Количество отображаемых в таблице строк – 250.
SELECT * FROM `events` WHERE BytesIn BETWEEN 1000 AND 2000 ORDER BY Timestamp ASC LIMIT 250
Все события таблицы events, для которых в поле BytesIn значение полученного трафика находится в диапазоне от 1000 до 2000 байт, отсортированные по столбцу Timestamp в порядке возрастания. Количество отображаемых в таблице строк – 250.
SELECT * FROM `events` WHERE Message LIKE '%ssh:%' ORDER BY Timestamp DESC LIMIT 250
Все события таблицы events, которые в поле Message содержат данные, соответствующие заданному шаблону
%ssh:%
в нижнем регистре, и отсортированы по столбцу Timestamp в порядке убывания. Количество отображаемых в таблице строк – 250.SELECT * FROM `events` WHERE inSubnet(DeviceAddress, '00.0.0.0/00') ORDER BY Timestamp DESC LIMIT 250
Все события таблицы events для хостов, которые входят в подсеть 00.0.0.0/00, отсортированные по столбцу Timestamp в порядке убывания.
SELECT * FROM `events` WHERE match(Message, 'ssh.*') ORDER BY Timestamp DESC LIMIT 250
Все события таблицы events, которые в поле Message содержат текст, соответствующий шаблону
ssh.*
, и отсортированы по столбцу Timestamp в порядке убывания. Количество отображаемых в таблице строк – 250.SELECT max(BytesOut) / 1024 FROM `events`
Максимальный размер исходящего трафика (КБ) за выбранный период времени.
SELECT count(ID) AS "Count", SourcePort AS "Port" FROM `events` GROUP BY SourcePort ORDER BY Port ASC LIMIT 250
Количество событий и номер порта. События сгруппированы по номеру порта и отсортированы по столбцу Port в порядке возрастания. Количество отображаемых в таблице строк – 250.
Столбцу ID в таблице событий присвоено имя Count, столбцу SourcePort присвоено имя Port.
Если вы хотите указать в запросе специальный символ, вам требуется экранировать его, поместив перед ним обратную косую черту (\).
Пример:
Все события таблицы events, которые в поле Message содержат текст, соответствующий шаблону |
При создании нормализатора для событий вы можете выбрать, сохранять ли значения полей исходного события. Данные сохраняются в поле события Extra. Поиск событий по этому полю осуществляется с помощью оператора LIKE.
Пример:
Все события таблицы events для хостов с IP-адресом 00. 00.00.000, на которых запущен процесс example, отсортированные по столбцу Timestamp в порядке убывания. Количество отображаемых в таблице строк – 250. |
При переключении на конструктор параметры запроса, введенного вручную в строке поиска, не переносятся в конструктор: вам требуется создать запрос заново. При этом запрос, созданный в конструкторе, не перезаписывает запрос, введенный в строке поиска, пока вы не нажмете на кнопку Применить в окне конструктора.
Используемые в поисковых запросах псевдонимы не должны содержать пробелов.
Подробнее об SQL см. в справке ClickHouse. Также см. поддерживаемые функции ClickHouse.
В началоЗапуск запросов: режим «только для чтения», планировщик, SQL-журнал
Консоль запросов
По опыту знаем, что консоль запросов — лучшее место для повседневной работы с SQL. Для каждого источника данных предусмотрена собственная консоль по умолчанию. Чтобы ее открыть, выберите Open Console в контекстном меню или нажмите F4.
Здесь вы можете написать SQL-запрос, запустить его и получить результат. Все просто.
Если вы вдруг захотите создать другую консоль для источника данных, сделайте это в меню: Context menu → New → Console.
Переключатель схем
Создавайте столько консолей запросов, сколько вам нужно, и запускайте запросы одновременно. У каждой консоли есть переключатель схем и баз данных. Если вы работаете с PostgreSQL , составьте здесь search_path.
Запуск выделенного фрагмента
Выделите фрагмент кода и запустите только его. Выбранный запрос посылается в базу «как есть», без дополнительной обработки jdbc-драйвером. Это может быть полезно, когда по той или иной причине IDE думает, что в запросе есть ошибка.
Настройки выполнения
Выполнять запрос можно несколькими способами. Поведение запуска запросов под кареткой можно настраивать. Возможные варианты того, что можно запустить: подзапрос, весь запрос, все после каретки, весь скрипт или предложить выбор.
Можно настроить три варианта поведения для запуска (Execute). По умолчанию, сочетание клавиш есть только у первого, но вы можете выбрать их и для остальных. Например, настроим два поведения: «показать выбор» и «запустить весь скрипт».
На видео пример, как сначала выполнено одно действие, затем второе.
Режим «только для чтения»
Режим «только для чтения» включайте в настройках источника данных: флажок Read-Only. Этот флажок включает сразу два режима: на уровне IDE и на уровне jdbc-драйвера .
На уровне jdbc-драйвера в режиме «для чтения» запросы, которые вносят изменения, нельзя запускать в базах:
Поэтому мы сделали свой режим «только для чтения». Он включается одновременно с режимом на уровне драйвера. IDE понимает, какие запросы приведут к изменениям, и подчеркивает их. При запуске запроса DataGrip покажет предупреждение. Такой запрос можно запустить, нажав Execute на всплывающей панели, если вы точно уверены в том, что делаете.
DataGrip также индексирует все исходники функций и процедур и строит внутри дерево вызовов. Это значит, что если вы запускаете процедуру, которая запускает процедуру (повторите
Контроль транзакций
Выберите контроль транзакций, который больше подходит вашей работе. Эта настройка есть в свойствах источника данных. В автоматическим режиме (флажок Auto) вам не надо каждый раз фиксировать транзакцию, а вот в ручном режиме (Manual), очевидно, надо.
Быстрый просмотр результата
Результаты запроса или выражения можно посмотреть во всплывающем окне. В других IDE на платформе IntelliJ Ctrl+Alt+F8 показывает результат вычисления выражения. В DataGrip то же самое работает для отображения результатов запуска. Если нажать эту комбинацию когда курсор на столбце, вы увидите ожидаемые значения этого столбца в результатах запроса. Та же самая операция на любом ключевом слове запроса покажет всплывающее окно с результатом. Клик мышкой при зажатом Alt работает так же.
История запущенных запросов
На панели инструментов каждой консоли есть такая кнопка: . Нажмите ее, чтобы увидеть историю всех запросов, выполненных в этом источнике данных из DataGrip. Еще здесь работает быстрый поиск!
Не забудьте и о локальной истории каждого файла.
Полный SQL-журнал
Буквально все запросы, которые запускает DataGrip, записываются в текстовый файл. Чтобы открыть его, используйте меню Help | Show SQL log.
Запуск хранимых процедур
DataGrip умеет генерировать код для запуска процедур. Укажите значения для параметров и нажмите OK.
Когда процедура открыта в редакторе, вы можете ее запустить, нажав Run на панели инструментов. Или используйте контекстное меню и выберите пункт Execute…
Небезопасные запросы
DataGrip предупредит, если вы собираетесь запустить запросы DELETE
и UPDATE
без предложения WHERE
.
Планировщик запросов
План запросов покажет, как база данных собирается выполнить ваш запрос. Это помогает в оптимизации.
План запросов может быть представлен в виде дерева или диаграммы.
Запросы с параметрами
В запросе могут быть параметры. DataGrip умеет запускать такие запросы.
Описать синтаксис параметров можно в Settings/Preferences → Database → User Parameters. Регулярные выражения для их описания подсвечиваются, а еще для каждого вида параметров можно указать SQL-диалект.
Структурный вид
Каждую консоль или файл можно открыть в структурном виде: в окне появится список запросов. Чтобы открыть структурный вид, используйте сочетание клавиш Ctrl+F12.
Результат запроса
Результат запроса
В DataGrip данные в результате простого запроса можно изменять. Используйте все возможности редактора данных: добавляйте, удаляйте строки, выбирайте режим контроля транзакций.
Сравнение результатов
Два результата можно сравнить, используя инструмент поиска различий. DataGrip подсветит те строчки, которые не являются общими для двух результатов. Параметр Tolerance используется для того, чтобы указать, сколько колонок могут иметь разные значения, чтобы строчки все равно считались одинаковыми. Из сравнения можно исключить любой столбец.
Нажмите кнопку сравнения на панели инструментов и выберите результат запроса, с которым нужно сравнить текущий результат.
Имена вкладок
Вы сами можете называть вкладки результатов: напишите имя в комментарии перед запросом.
Если вам не нравится, что любой предшествующий комментарий становится именем, укажите слово, после которого будет идти строка для заголовка. Это делается в соответствующих настройках: поле Prefix.
Быстрое изменение размера страницы
Меняйте размер страницы в редакторе данных, не заходя в настройки.
SQL Joins
❮ Предыдущий Далее ❯
SQL JOIN
Предложение JOIN
используется для объединения строк из двух или более таблиц на основе
связанный столбец между ними.
Посмотрим на выборку из таблицы «Заказы»:
OrderID | идентификатор клиента | Дата заказа |
---|---|---|
10308 | 2 | 18 сентября 1996 г. |
10309 | 37 | 1996-09-19 |
10310 | 77 | 1996-09-20 |
Затем посмотрите на выбор из таблицы «Клиенты»:
CustomerID | ИмяКлиента | Имя контакта | Страна |
---|---|---|---|
1 | Альфред Футтеркисте | Мария Андерс | Германия |
2 | Ана Трухильо Emparedados y helados | Ана Трухильо | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Мексика |
Обратите внимание, что столбец «CustomerID» в таблице «Заказы» относится к «CustomerID» в таблице «Клиенты». Отношения между двумя таблицами выше является столбец «CustomerID».
Затем мы можем создать следующую инструкцию SQL (содержащую ВНУТРЕННЕЕ СОЕДИНЕНИЕ
),
который выбирает записи, имеющие совпадающие значения в обеих таблицах:
Пример
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
и он выдаст что-то вроде этого:
OrderID | ИмяКлиента | Дата заказа |
---|---|---|
10308 | Ана Трухильо Emparedados y helados | 18.09.1996 |
10365 | Антонио Морено Такерия | 27.11.1996 |
10383 | Вокруг Рога | 16.12.1996 |
10355 | Вокруг Рога | 15.11.1996 |
10278 | Berglunds snabköp | 12. 08.1996 |
Научитесь фильтровать данные в SQL как аналитик данных
Попробуйте практические занятия с пошаговыми инструкциями от эксперта. Попробуйте управляемый проект, созданный в сотрудничестве с Coursera, прямо сейчас!
Начало началоРазличные типы соединений SQL
Вот различные типы соединений в SQL:
-
(Inner) Join
: возвращает записи, которые имеют соответствующие значения в обоих таблицах (Inner). -
ЛЕВОЕ (НАРУЖНОЕ) СОЕДИНЕНИЕ
: Возвращает все записи из левой таблицы и соответствующие записи из правой таблицы -
ПРАВОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
: Возвращает все записи из правой таблицы и соответствующие записей из левой таблицы -
ПОЛНОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ
: Возвращает все записи, если есть совпадение в любом левом или правый стол
Проверьте себя с помощью упражнений
Упражнение:
Вставьте недостающие части в Предложение JOIN
для объединения двух таблиц Orders
и Customers
,
используя поле CustomerID
в обеих таблицах в качестве отношения между двумя таблицами.
ВЫБИРАТЬ * ОТ заказов ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к клиентам =
;
Начать упражнение
❮ Предыдущий Следующий ❯
ВЫБОР ЦВЕТА
Лучшие учебники
Учебное пособие по HTMLУчебное пособие по CSS
Учебное пособие по JavaScript
Учебное пособие
Учебник по SQL
Учебник по Python
Учебник по W3.CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
Лучшие ссылки
HTML ReferenceCSS Reference
JavaScript Reference
SQL Reference
Python Reference
W3.CSS Reference
Bootstrap Reference
PHP Reference
HTML Colors
Java Reference
Angular Reference
jQuery Reference
902 18 Лучшие примеры Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3. CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery
ФОРУМ | О
W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности. Copyright 1999-2023 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.
Изучение SQL: примеры запросов SQL
В предыдущей статье мы практиковали SQL, и сегодня мы продолжим с еще несколькими примерами SQL. Цель этой статьи — начать с довольно простого запроса и перейти к более сложным запросам. Мы рассмотрим вопросы, которые могут вам понадобиться на собеседовании, а также некоторые из них, которые могут вам понадобиться в реальных жизненных ситуациях. Итак, пристегнитесь, мы взлетаем!
Модель данных
Как всегда, давайте сначала кратко рассмотрим модель данных, которую мы будем использовать. Это та же самая модель, которую мы используем в этой серии, так что вы уже должны быть знакомы. В случае, если это не так, просто взгляните на таблицы и на то, как они связаны.
Мы разберем 6 примеров SQL, начиная с довольно простого. Каждый пример будет добавлять что-то новое, и мы обсудите цель обучения, стоящую за каждым запросом. Я буду использовать тот же подход, который описан в статье Изучаем SQL: как написать сложный запрос SELECT? Давайте начнем.
#1 Пример SQL — SELECT
Мы хотим изучить, что находится в таблице вызовов в нашей модели. Следовательно, нам нужно выбрать все атрибуты, и мы отсортируйте их сначала по employee_id, а затем по start_time.
1 2 3 4 5 6 | — Список всех звонков (отсортированных по сотрудникам и времени начала) SELECT * ИЗ звонка ЗАКАЗ ПО call. employee_id ASC, call.start_time ASC; |
Это довольно простой запрос, и вы должны понять его без проблем. Единственное, что я хотел бы отметить здесь, это то, что мы упорядочили наш результат сначала по идентификатору сотрудника (call.employee_id ASC), а затем по времени начала звонка (call.start_time). В реальных ситуациях это то, что вы должны сделать, если хотите выполнить аналитику в течение времени по заданным критериям (все данные для одного и того же сотрудника упорядочены друг за другом).
#2 Пример SQL — функция DATEDIFF
Нам нужен запрос, который должен возвращать все данные о звонках, а также продолжительность каждого звонка в секундах. Мы будем использовать предыдущий запрос в качестве отправной точки.
1 2 3 4 5 6 7 8 | — Список всех вызовов вместе с продолжительностью вызова SELECT вызов. *, DATEDIFF(«СЕКУНДА», call.start_time, call.end_time) AS call_duration ИЗ вызова ORDER BY call.employee_id ASC, 90 003 call.start_time ASC; |
Возвращаемый результат почти такой же, как и в предыдущем запросе (те же столбцы и порядок), за исключением добавления одного столбца. Мы назвали этот столбец call_duration. Чтобы получить продолжительность вызова, мы использовали функцию SQL Server DATEDIFF. Он принимает 3 аргумента, единицу измерения разницы (нам нужны секунды), первое значение даты и времени (время начала, нижний значение), второе значение даты и времени (время окончания, более высокое значение). Функция возвращает разницу во времени в заданных единицах измерения.
- Примечание. SQL Server имеет ряд функций (дата и время), и мы рассмотрим наиболее важные из них в следующих статьях.
#3 Пример SQL — DATEDIFF + функция агрегирования
Теперь мы хотим вернуть суммарную продолжительность всех звонков для каждого сотрудника. Итак, мы хотим иметь 1 строку для каждого сотрудника и сумму продолжительности всех звонков, которые он когда-либо делал. Мы продолжим с того места, на котором остановились в предыдущем запросе.
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 | — СУММА длительности звонка на каждого сотрудника СУММ(DATEDIFF(«СЕКУНД», call.start_time, call.end_time) ) AS call_duration_sum ОТ call ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ сотрудника ON call.employee_id = employee.id ГРУППА ПО employee.id, employee.first_name, employee.last_name ORDER BY employee.id ASC; |
По результату добавить особо нечего – мы получили именно то, что хотели. Но давайте прокомментируем, как мы этого добились. Несколько вещей, которые я хотел бы подчеркнуть здесь:
- Мы объединили таблицы call и employee, потому что нам нужны данные из обеих таблиц (детали сотрудника и продолжительность звонка).
- Мы использовали агрегатную функцию SUM(…) вокруг ранее рассчитанной продолжительности разговора для каждого сотрудника.
- Поскольку мы сгруппировали все на уровне сотрудников, у нас есть ровно 1 строка для каждого сотрудника.
- Примечание: Никаких особых правил при объединении результата, возвращаемого любой функцией, и агрегатной функции не существует. В нашем случае вы можете без проблем объединить функцию СУММ с РАЗНИЦОЙ ДАТЫ.
#4 Пример SQL — расчет коэффициента
Для каждого сотрудника нам нужно вернуть все его звонки с указанием их продолжительности. Мы также хотим знать процент времени, которое сотрудник потратил на этот звонок, по сравнению с общим временем всех его звонков.
- Подсказка: Нам нужно объединить значение, рассчитанное для одной строки, с агрегированным значением. Для этого мы будем использовать подзапрос для вычисления этого агрегированного значения, а затем присоединимся к соответствующей строке.
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | — % продолжительности звонков на каждого сотрудника по сравнению с продолжительностью всех его звонков SELECT employee.id, employee.first_name, employee.last_name, call.start_time, call.end_time, DATEDIFF(«СЕКУНДА», call.start_time, call.end_time) КАК call_duration, duration_sum.call_duration_sum, CAST(CAST(DATEDIFF(«SECOND», call.start_time, call.end_time) AS DECIMAL(7,2)) / CAST(duration_sum.call_duration_sum AS DECIMAL(7,2)) AS DECIMAL(4,4)) AS call_percentage ОТ call ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сотрудник ВКЛ call. employee_id = employee.id ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( SELECT employee.id, SUM(DATEDIFF(«SECOND», call.start_time, call.end_time)) AS call_duration_sum FROM call ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ сотрудника ON call.employee_id = employee.id GROUP BY employee.id ) AS duration_sum ON employee.id = duration_sum.id ПОРЯДОК ПО employee.id ASC, call.start_time ASC; |
Вы можете заметить, что мы достигли комбинирования значений строки с агрегированным значением. Это очень полезно, потому что вы могли поместить такие вычисления в запрос SQL и избежать дополнительной работы позже. Этот запрос содержит еще несколько интересные концепции, которые следует упомянуть:
- Самое главное, что мы поместили весь запрос, возвращающий агрегированное значение, в подзапрос (т. часть, начинающаяся со 2-го ВНУТРЕННЕГО СОЕДИНЕНИЯ (ВНУТРЕННЕЕ СОЕДИНЕНИЕ() и заканчивающееся на ) AS duration_sum ON employee. id = duration_sum.id. Между этими скобками мы поместили слегка измененный запрос из части № 2 Пример SQL — Функция DATEDIFF. Этот подзапрос возвращает идентификатор каждого сотрудника и СУММУ продолжительности всех его звонков. Только подумайте об этом как об одной таблице с этими двумя значениями
- Мы присоединили «таблицу» из предыдущего пункта к таблицам вызовов и сотрудников, потому что нам нужны значения из этих двух таблиц.
- Мы уже проанализировали функцию DATEDIFF(…), используемую для расчета продолжительности одного вызова, в части № 2 Пример SQL — функция DATEDIFF
- Эта часть CAST( CAST(DATEDIFF(«SECOND», call.start_time, call.end_time) AS DECIMAL(7,2)) / CAST(duration_sum.call_duration_sum AS DECIMAL(7,2)) AS DECIMAL(4,4)) AS call_percentage очень важен. Сначала мы преобразовали оба дивиденда (CAST(DATEDIFF(«SECOND», call.start_time, call. end_time) AS DECIMAL(7,2))) и делитель (CAST(duration_sum.call_duration_sum AS DECIMAL(7,2)) как десятичные числа. Хотя они являются целыми числами, ожидаемый результат — десятичное число, и мы должны «сообщить» это SQL Server. В случае, если мы не CAST-ed их, SQL Server будет выполнять деление целых чисел. Мы также преобразовали результат в десятичное число. Этот не был нужен, потому что мы ранее определили это при приведении делимого и делителя, но я хотел отформатировать результат будет иметь 4 числовых значения, и все 4 из них будут десятичными знаками (это процент в десятичном формат)
Из этого примера мы должны помнить, что мы можем использовать подзапросы для возврата дополнительных значений, которые нам нужны. Возвращение агрегированное значение с помощью подзапроса и объединение этого значения с исходной строкой — хороший пример, когда мы могли бы сделать именно это.
#5 Пример SQL — среднее значение (AVG)
Нам нужно два запроса. Первый должен вернуть среднюю продолжительность звонка на одного сотрудника, а второй должен вернуть средняя продолжительность вызова для всех вызовов.
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 15 16 17 18 19 | — средняя продолжительность разговора на одного сотрудника SELECT employee.id, employee.first_name, employee.last_name, AVG(DATEDIFF(«SECOND», call.start_time, call.end_time)) AS call_duration_avg FROM call ВНУТРЕННЕЕ СОЕДИНЕНИЕ сотрудник ON call.employee_id = employee.id ГРУППА ПО 9000 2 employee.id,employee.first_name, employee.last_name ORDER BY employee.id ASC;
— средняя продолжительность вызова — все вызовы SELECT AVG(DATEDIFF(«SECOND», call. start_time, call.end_time)) AS call_duration_avg ОТ вызова; |
Нет необходимости объяснять это более подробно. Расчет средней продолжительности вызовов на одного сотрудника аналогичен расчету СУММЫ длительностей вызовов на одного сотрудника (пример № 3 SQL — DATEDIFF + функция агрегирования). Мы только что заменили агрегатную функцию SUM на AVG.
Второй запрос возвращает продолжительность вызова AVG для всех вызовов. Обратите внимание, что мы не использовали GROUP BY. Нам это просто не нужно, потому что все строки идут в эту группу. Это один из случаев, когда агрегатную функцию можно использовать без предложение GROUP BY.
#6 Пример SQL — сравнение значений AVG
Нам нужно рассчитать разницу между средней продолжительностью разговора по каждому сотруднику и средней продолжительностью разговора продолжительность всех звонков.
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 90 002 2526 27 28 29 30 31 | — разница между продолжительностью звонка AVG на одного сотрудника и длительностью звонка AVG ee. last_name, single_employee.call_duration_avg, single_employee.call_duration_avg — avg_all.call_duration_avg AS avg_difference ОТ ( SELECT 1 AS join_id, employee.id, employee.first_name, employee.last_name, 9000 3 AVG(DATEDIFF(«SECOND», call.start_time, call.end_time)) AS call_duration_avg FROM call ВНУТРЕННЕЕ СОЕДИНЕНИЕ сотрудник ON call.employee_id = employee.id GROUP BY employee.id, employee.first_name, employee.last_name ) single_em ployee
INNER JOIN
( SELECT 1 AS join_id, AVG(DATEDIFF («СЕКУНДА», call.start_time, call.end_time)) AS call_duration_avg FROM call ) avg_all ON avg_all.join_id = single_employee.join_id; |
Этот запрос действительно сложный, поэтому давайте сначала прокомментируем результат. У нас есть ровно 1 строка на каждого сотрудника со средней продолжительностью звонка на одного сотрудника и разницей между этой средней и средней продолжительностью всех звонков.
Итак, что мы сделали для этого. Отметим наиболее важные части этого запроса:
- Мы снова использовали подзапрос для возврата агрегированного значения — средней продолжительности всех вызовов.
- Кроме того, мы добавили это — 1 AS join_id. Он служит для объединения этих двух запросов с использованием идентификатора. Это же значение мы «сгенерируем» и в основном подзапросе.
- «Основной» подзапрос возвращает данные, сгруппированные на уровне сотрудника. Еще раз мы «сгенерировали» искусственный ключ, который мы будем использовать для соединения этих двух подзапросов — 1 AS join_id
- Мы объединили подзапросы с помощью искусственного ключа (join_id) и посчитали разницу между средними значениями
Заключение
Надеюсь, вы многому научились в сегодняшней статье. Главное, что я хотел бы, чтобы вы запомнили после этого, это то, что вы можете выполнять многие статистические вычисления непосредственно в SQL, а затем использовать веб-форму или Excel для представления результатов с помощью блестящих таблиц и графиков. Мы продолжим практиковаться в следующей статье, так что следите за обновлениями.
Содержание
Изучение SQL: операции CREATE DATABASE & CREATE TABLE |
Изучение SQL: ВСТАВИТЬ В ТАБЛИЦУ |
Изучение SQL: первичный ключ |
Изучение SQL: внешний ключ |
Изучение SQL: инструкция SELECT |
Изучение SQL: ВНУТРЕННЕЕ СОЕДИНЕНИЕ и ЛЕВОЕ СОЕДИНЕНИЕ |
Изучение SQL: сценарии SQL |
Изучение SQL: типы отношений |
Изучение SQL: объединение нескольких таблиц |
Изучение SQL: агрегатные функции |
Изучение SQL: как написать сложный запрос SELECT? |
Изучение SQL: база данных INFORMATION_SCHEMA |
Изучение SQL: типы данных SQL |
Изучение SQL: теория множеств |
Изучение SQL: пользовательские функции |
Изучение SQL: определяемые пользователем хранимые процедуры |
Изучение SQL: представления SQL |
Изучение SQL: триггеры SQL |
Изучение SQL: Практика запросов SQL |
Изучение SQL: примеры запросов SQL |
Изучение SQL: создание отчета вручную с помощью SQL-запросов |
Изучение SQL: функции даты и времени SQL Server |
Изучение SQL: создание отчетов SQL Server с использованием функций даты и времени |
Изучение SQL: сводные таблицы SQL Server |
Изучение SQL: экспорт SQL Server в Excel |
Изучение SQL: введение в циклы SQL Server |
Изучение SQL: Курсоры SQL Server |
Изучение SQL: передовые методы SQL для удаления и обновления данных |
Изучение SQL: соглашения об именах |
Изучение SQL: задания, связанные с SQL |
Изучение SQL: неэквивалентные соединения в SQL Server |
Изучение SQL: SQL-инъекция |
Изучение SQL: динамический SQL |
Изучение SQL: как предотвратить атаки SQL Injection |
- Автор
- Последние сообщения
Эмиль Дркусич
Эмиль — специалист по базам данных с более чем 10-летним опытом работы во всем, что связано с базами данных.