Сложные 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, '10.0.0.1/24') ORDER BY Timestamp DESC LIMIT 250
Все события таблицы events для хостов, которые входят в подсеть 10.0.0.1/24, отсортированные по столбцу 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 содержат текст, соответствующий шаблону |
При переключении на конструктор параметры запроса, введенного вручную в строке поиска, не переносятся в конструктор: вам требуется создать запрос заново. При этом запрос, созданный в конструкторе, не перезаписывает запрос, введенный в строке поиска, пока вы не нажмете на кнопку Применить в окне конструктора.
После обновления KUMA до версии 1.6 при фильтрации событий с помощью SQL-запроса, содержащего условие inSubnet, может возвращаться ошибка Code: 441. DB::Exception: Invalid IPv4 value.
<cast_ipv4_ipv6_default_on_conversion_error>true</cast_ipv4_ipv6_default_on_conversion_error>
.Подробнее об SQL см. в справке ClickHouse.
В началоНормализация данных через запрос в SQL
Главный принцип анализа данных GIGO (от англ. garbage in — garbage out, дословный перевод «мусор на входе — мусор на выходе») говорит нам о том, что ошибки во входных данных всегда приводят к неверным результатам анализа. От того, насколько хорошо подготовлены данные, зависят результаты всей вашей работы.
Например, перед нами стоит задача подготовить выборку для использования в алгоритме машинного обучения (модели k-NN, k-means, логической регрессии и др). Признаки в исходном наборе данных могут быть в разном масштабе, как, например, возраст и рост человека. Это может привести к некорректной работе алгоритма. Такого рода данные нужно предварительно масштабировать.
В данном материале мы рассмотрим способы масштабирования данных через запрос в SQL: масштабирование методом min-max, min-max для произвольного диапазона и z-score нормализация. Для каждого из методов мы подготовили по два примера написания запроса — один с помощью подзапроса SELECT, а второй используя оконную функцию OVER().
Для работы возьмем таблицу students с данными о росте учащихся.
name | height |
Иван | 174 |
Петр | 181 |
Денис | 199 |
Ксения | 158 |
Сергей | 179 |
Ольга | 165 |
Юлия | 152 |
Кирилл | 188 |
Антон | 177 |
Софья | 165 |
Min-Max масштабирование
Подход min-max масштабирования заключается в том, что данные масштабируются до фиксированного диапазона, который обычно составляет от 0 до 1. В данном случае мы получим все данные в одном масштабе, что исключит влияние выбросов на выводы.
Выполним масштабирование по формуле:
Умножаем числитель на 1.0, чтобы в результате получилось число с плавающей точкой.
SQL-запрос с подзапросом:
SELECT height, 1.0 * (height-t1.min_height)/(t1.max_height - t1.min_height) AS scaled_minmax FROM students, (SELECT min(height) as min_height, max(height) as max_height FROM students ) as t1;
SQL-запрос с оконной функцией:
SELECT height, (height - MIN(height) OVER ()) * 1.0 / (MAX(height) OVER () - MIN(height) OVER ()) AS scaled_minmax FROM students;
В результате мы получим переменные в диапазоне [0…1], где за 0 принят рост самого невысокого учащегося, а 1 рост самого высокого.
name | height | scaled_minmax |
Иван | 174 | 0. 46809 |
Петр | 181 | 0.61702 |
Денис | 199 | 1 |
Ксения | 158 | 0.12766 |
Сергей | 179 | 0.57447 |
Ольга | 165 | 0.2766 |
Юлия | 152 | 0 |
Кирилл | 188 | 0.76596 |
Антон | 177 | 0.53191 |
Софья | 165 | 0.2766 |
Масштабирование для заданного диапазона
Вариант min-max нормализации для произвольных значений. Не всегда, когда речь идет о масштабировании данных, диапазон значений находится в промежутке между 0 и 1.
Формула для вычисления в этом случае такая:
Это даст нам возможность масштабировать данные к произвольной шкале. В нашем примере пусть а=10.0, а b=20.0.
SQL-запрос с подзапросом:
SELECT height, ((height - min_height) * (20.0 - 10.0) / (max_height - min_height)) + 10 AS scaled_ab FROM students, (SELECT MAX(height) as max_height, MIN(height) as min_height FROM students ) t1;
SQL-запрос с оконной функцией:
SELECT height, ((height - MIN(height) OVER() ) * (20. 0 - 10.0) / (MAX(height) OVER() - MIN(height) OVER())) + 10.0 AS scaled_ab FROM students;
Получаем аналогичные результаты, что и в предыдущем методе, но данные распределены в диапазоне от 10 до 20.
name | height | scaled_ab |
Иван | 174 | 14.68085 |
Петр | 181 | 16.17021 |
Денис | 199 | 20 |
Ксения | 158 | 11.2766 |
Сергей | 179 | 15.74468 |
Ольга | 165 | 12.76596 |
Юлия | 152 | 10 |
Кирилл | 188 | 17.65957 |
Антон | 177 | 15.31915 |
Софья | 165 | 12.76596 |
Нормализация с помощью z-score
В результате z-score нормализации данные будут масштабированы таким образом, чтобы они имели свойства стандартного нормального распределения — среднее (μ) равно 0, а стандартное отклонение (σ) равно 1.
Вычисляется z-score по формуле:
SQL-запрос с подзапросом:
SELECT height, (height - t1.mean) * 1.0 / t1.sigma AS zscore FROM students, (SELECT AVG(height) AS mean, STDDEV(height) AS sigma FROM students ) t1;
SQL-запрос с оконной функцией:
SELECT height, (height - AVG(height) OVER()) * 1.0 / STDDEV(height) OVER() AS z-score FROM students;
В результате мы сразу заметим выбросы, которые выходят за пределы стандартного отклонения.
name | height | zscore |
Иван | 174 | 0.01488 |
Петр | 181 | 0.53582 |
Денис | 199 | 1.87538 |
Ксения | 158 | -1.17583 |
Сергей | 179 | 0.38698 |
Ольга | 165 | -0.65489 |
Юлия | 152 | -1. 62235 |
Кирилл | 188 | 1.05676 |
Антон | 177 | 0.23814 |
Софья | 165 | -0.65489 |
Чтение данных из баз данных SQL
Чтение данных из баз данных SQLУзнайте, как писать SQL-запросы в Retool для чтения данных.
Для чтения из базы данных вы можете написать операторы SQL. Например, этот запрос выбирает всех активных или неактивных пользователей в зависимости от того, установлен ли флажок.
выберите * из пользователей, где активно = {{checkbox1.value}};
Назовите запрос getUsers
, сохраните его и получите доступ к его результатам в другом месте как getUsers.data
. Запросы SQL возвращают данные в формате на основе столбцов:
{ "столбец1": [1, 2, 3], "столбец2": [1, 2, 3], ... }
Данные запросов SQL , а не возвращаются в виде массива объектов. Чтобы получить доступ к данным в виде массива объектов, используйте метод formatDataAsArray
.
Примеры более сложных SQL-запросов в Retool см. в памятке по SQL.
Чтобы предотвратить внедрение SQL, Retool преобразует запросы SQL в подготовленные операторы. Точное поведение запроса зависит от вашего конкретного драйвера базы данных. Однако большинство баз данных не поддерживают подготовленные операторы с динамическими именами столбцов или динамическими именами таблиц, поскольку в таких случаях трудно предотвратить внедрение SQL.
Это означает, что следующий запрос не работает в PostgreSQL, поскольку имя таблицы является динамическим, а PostgreSQL не поддерживает динамические имена таблиц в подготовленных операторах.
выберите * из {{textinput1.value === 'getUsers' ? 'пользователи' : 'платежи'}}
Вместо этого следует написать два запроса:
select * from users
выбрать * из платежей
Затем вы можете сослаться на правильный оператор SQL в зависимости от значения textinput1
:
{ { textinput1. value === "getUsers" ? пользователи.данные : платежи.данные; } }
Администраторы могут отключить подготовленные операторы для ресурса, установив флажок Отключить преобразование запросов в подготовленные операторы на странице сведений о ресурсе. Это отключает защиту от SQL-инъекций и подвергает ресурс атакам с SQL-инъекциями, поэтому его следует использовать с осторожностью.
Если вы отключите подготовленные операторы, вам может потребоваться обновить запросы, использующие JavaScript, в течение {{ }}
, потому что некоторые базы данных ожидают заполнители подготовленных операторов без кавычек или выполняют преобразования типов в подготовленных операторах.
Например, если разрешены подготовленные операторы, следующий запрос PostgreSQL не должен заключать в кавычки заполнитель подготовленного оператора.
выберите идентификатор, имя, фамилия от пользователей ты где u.id = {{ numberInput1. value }};
Когда подготовленные операторы отключены, заполнитель требует кавычек.
выберите идентификатор, имя, фамилия от пользователей ты где u.id = '{{ numberInput1.value }}'
Обратитесь к документации вашей базы данных по подготовленным операторам, чтобы подтвердить предполагаемое использование.
Обновлено 18 дней назад
sql:query — Drush
Выполнить запрос к базе данных.
Примеры
-
drush sql:query "SELECT * FROM users WHERE uid=1"
. Просмотр записи пользователя. Префиксы таблиц, если они используются, должны добавляться к именам таблиц вручную. -
drush sql:query --db-prefix "SELECT * FROM {users}"
. Просмотр записи пользователя. Префиксы таблиц учитываются. Внимание: все фигурные скобки будут удалены. -
$(drush sql:connect) < example.sql
. Импорт операторов SQL из файла в текущую базу данных. -
drush sql:query --file=example. sql
. Альтернативный способ импорта операторов SQL из файла. -
drush ev "return db_query('SELECT * FROM users')->fetchAll()" --format=json
. Получить данные обратно в формате JSON. См. https://github.com/drush-ops/drush/issues/3071#issuecomment-347929777. -
драш sql: подключение
-e "выбрать * из лимита пользователей 5;"
Аргументы
- [запрос] . SQL-запрос. Игнорируется, если указан --file.
Опции
- --файл-результата[=ФАЙЛ-РЕЗУЛЬТАТА] . Сохранить в файл. Файл должен относиться к корню Drupal.
- --file=ФАЙЛ . Путь к файлу, содержащему SQL для запуска. Файлы Gzip принимаются.
- --файл-удалить . Удалите --file после его запуска.
- --extra=ДОПОЛНИТЕЛЬНО . Добавьте пользовательские параметры в строку подключения (например, --extra=--skip-column-names)
- --db-префикс . Включите замену фигурных скобок в вашем запросе.
- --база данных[=БАЗА ДАННЫХ] . Ключ подключения к БД при использовании нескольких подключений в settings.php. [по умолчанию: по умолчанию ]
- --цель[=ЦЕЛЬ] . Имя цели в указанном соединении с базой данных. [по умолчанию: по умолчанию ]
- --db-url=DB-URL . URL-адрес базы данных в стиле Drupal 6. Например, mysql://root:pass@localhost:port/dbname
- --показать-пароли . Показать пароль в CLI. Полезно для отладки.
Общие параметры
- -v|vv|vvv, --verbose . Увеличьте уровень детализации сообщений: 1 для обычного вывода, 2 для более подробного вывода и 3 для отладки
- -у, --да . Автоматически принимать значения по умолчанию для всех пользовательских подсказок.