Запросы в sql примеры: основные операторы, виды, синтаксис, написание, создание базы данных, примеры простых и сложных команд

Содержание

Запуск запросов: режим «только для чтения», планировщик, SQL-журнал

Консоль запросов

По опыту знаем, что консоль запросов — лучшее место для повседневной работы с SQL. Для каждого источника данных предусмотрена собственная консоль по умолчанию. Чтобы ее открыть, выберите Open Console в контекстном меню или нажмите F4.

Здесь вы можете написать SQL-запрос, запустить его и получить результат. Все просто.

Если вы вдруг захотите создать другую консоль для источника данных, сделайте это в меню: Context menu → New → Console.

Переключатель схем

Создавайте столько консолей запросов, сколько вам нужно, и запускайте запросы одновременно. У каждой консоли есть переключатель схем и баз данных. Если вы работаете с PostgreSQL , составьте здесь search_path.

Запуск выделенного фрагмента

Выделите фрагмент кода и запустите только его. Выбранный запрос посылается в базу «как есть», без дополнительной обработки jdbc-драйвером. Это может быть полезно, когда по той или иной причине IDE думает, что в запросе есть ошибка.

Настройки выполнения

Выполнять запрос можно несколькими способами. Поведение запуска запросов под кареткой можно настраивать. Возможные варианты того, что можно запустить: подзапрос, весь запрос, все после каретки, весь скрипт или предложить выбор.

 

Можно настроить три варианта поведения для запуска (Execute). По умолчанию, сочетание клавиш есть только у первого, но вы можете выбрать их и для остальных. Например, настроим два поведения: «показать выбор» и «запустить весь скрипт».

На видео пример, как сначала выполнено одно действие, затем второе.

Режим «только для чтения»

Режим «только для чтения» включайте в настройках источника данных: флажок Read-Only. Этот флажок включает сразу два режима: на уровне IDE и на уровне jdbc-драйвера .

На уровне jdbc-драйвера в режиме «для чтения» запросы, которые вносят изменения, нельзя запускать в базах: MySQL, PostgreSQL, AWS Redshift, h3 и Derby. В других СУБД этот режим не работает.

Поэтому мы сделали свой режим «только для чтения». Он включается одновременно с режимом на уровне драйвера. IDE понимает, какие запросы приведут к изменениям, и подчеркивает их. При запуске запроса DataGrip покажет предупреждение. Такой запрос можно запустить, нажав Execute на всплывающей панели, если вы точно уверены в том, что делаете.

DataGrip также индексирует все исходники функций и процедур и строит внутри дерево вызовов. Это значит, что если вы запускаете процедуру, которая запускает процедуру (повторите

n раз), которая что-то меняет в базе, 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.

Быстрое изменение размера страницы

Меняйте размер страницы в редакторе данных, не заходя в настройки.

MySQL. Вложеные запросы. JOIN LEFT/RIGHT….

В SQL подзапросы — или внутренние запросы, или вложенные запросы — это запрос внутри другого запроса SQL, который вложен в условие WHERE.

Вложеные запросы

SQL подзапрос — это запрос, вложенный в другой запрос.

Подзапрос используется для возврата данных, которые будут использоваться в основном запросе, в качестве условия для дальнейшей фильтрации данных, подлежащих извлечению.

Существует несколько правил, которые применяются к подзапросам:

  • Подзапросы должны быть заключены в круглые скобки.
  • Подзапрос может иметь только один столбец в условии SELECT, если только несколько столбцов не указаны в основном запросе для подзапроса для сравнения выбранных столбцов.
  • Подзапросы, которые возвращают более одной строки, могут использоваться только с несколькими операторами значений, такими как оператор IN.
  • Команда ORDER BY не может использоваться в подзапросе, хотя в основном запросе она использоваться может. В подзапросе может использоваться команда GROUP BY для выполнения той же функции, что и ORDER BY.
  • С подзапросом не может использоваться оператор BETWEEN. Однако оператор BETWEEN может использоваться внутри подзапроса.
  • Не рекомендуется создавать запросы со степенью вложения больше трех. Это приводит к увеличению времени выполнения и к сложности восприятия кода.
Синтаксис

SELECT

Подзапросы чаще всего используются с инструкцией SELECT. При этом используется следующий синтаксис


					
    SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
        (SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
            (SELECT имя_столбца FROM имя_таблицы WHERE условие)
                .
.. ) ;

Ниже представлена струтура таблицы для демонстрации примеров

Пример таблицы продавцов SALES
snumsnamecitycomm
1КоловановМосква10
2ПетровТверь25
3ПлотниковМосква22
4КучеровСанкт-Петербург28
5МалкинСанкт-Петербург18
6ШипачевЧелябинск 30
7МозякинОдинцово25
8ПроворовМосква25

Пример таблицы покупателей CUSTOMERS
cnumcnamecityratingsnum
1ДесновМосква906
2КрасновМосква957
3КирилловТверь963
4ЕрмолаевОбнинск983
5КолесниковСерпухов985
6ПушкинЧелябинск904
7БелыйОдинцово851
8ЧудиновМосква893
9ПроворовМосква952
10ЛосевОдинцово758

Пример таблицы заказов ORDERS
onumamtodate(YEAR)cnumsnum
1001420201394
10026532005107
1003960201621
1004320201633
1005200201554
10062560201454
10071200201371
100850201713
1009564201237
1010900201868
Вывести суммы заказов и даты, которые проводил продавец с фамилией «Плотников».

Начнем с такого примера и для начала вспомним, как бы делали этот запрос ранее: посмотрели бы в таблицу SALES(или выполнили отдельный запрос), определили бы snum продавца «Плотников» — он равен 3. И выполнили бы запрос SQL с помощью условия WHERE.


					
    SELECT amt, odate
    FROM orders 
    WHERE snum = 3
					
				
Результат работы
amtodate
3202016
502017

Такой запрос, очевидно, не очень универсален, если нам захочется выбрать тоже самое для другого продавца, то всегда придется определять его snum. В SQL предусмотрена возможность объединять такие запросы в один путем превращения одного из них в подзапрос (вложенный запрос).


					
    SELECT amt, odate
    FROM orders
    WHERE snum = (  SELECT snum
                    FROM sales
                    WHERE sname = 'Плотников')
					
				

В этом примере мы определяем с помощью вложенного запроса идентификатор snum по фамилии из таблицы SALES, а затем, в таблице ORDERS определяем по этому идентификатору нужные нам значения.

Показать уникальные номера и фамилии продавцов, которые провели сделки в 2016 году.

					
    SELECT snum, sname
    FROM sales
    WHERE snum IN ( SELECT snum
                    FROM orders
                    WHERE odate = 2016)
					

Этот SQL запрос отличается тем, что вместо знака = здесь используется оператор IN.

Оператор IN следует использовать в том случае, если вложенный подзапрос SQL возвращает несколько значений.

То есть в запросе происходит проверка, содержится ли идентификатор snum из таблицы SALES в массиве значений, который вернул вложенный запрос. Если содержится, то SQL выдаст фамилию этого продавца.

Результат запроса
snumsname
1Колованов
3Плотников
Предыдущие примеры, которые мы уже рассмотрели, сравнивали в условии WHERE одно поле. Это конечно хорошо, но стоит отметить, что в SQL предусмотрена возможность сравнения сразу нескольких полей, то есть можно использовать вложенный запрос с несколькими параметрами.
Вывести пары покупателей и продавцов, которые осуществили сделку между собой, но не позднее 2014 года

Запрос чем то похож на предыдущий, только теперь мы добавляем еще одно поле для сравнения.


					
    SELECT cname as 'Покупатель', sname as 'Продавец'
    FROM customers cus, sales sal
    WHERE (cus.cnum, sal.snum) IN ( SELECT cnum, snum
                                    FROM orders
                                    WHERE odate < 2014 )
					
				
Список пар покупатель — продавец
ПокупательПродавец
ПроворовКучеров
ЛосевМозякин
БелыйКолованов
КирилловМозякин

В этом примере мы сравниваем сразу два поля одновременно по идентификаторам. То есть из таблицы ORDERS берутся те строки, которые удовлетворяют условию не позднее 2014 года, затем вместо идентификаторов подставляются значение имен покупателей и продавцов.

На самом деле, такой запрос SQL используется крайне редко, обычно используют оператор INNER JOIN.

Оператор as нужен для того, чтобы при выводе SQL показывал не имена полей, а то, что мы зададим. И после оператора FROM за именами таблиц стоят сокращения, которые потом используются — это псевдонимы. Псевдонимы можно называть любыми именами, в этом запросе они используются для явного определения поля, так как мы несколько раз обращаемся к одному и тому же полю, только из разных таблиц.

Подзапросы могут использоваться с инструкциями SELECT, INSERT, UPDATE и DELETE вместе с операторами типа =, <, >, >=, <=, IN, BETWEEN и т. д.
Далее будут показы примеры использования вложеных запросов с использованием базы данных world. БД находится в папке _lec\7\db вместе с лекцией.

CREATE
Данный пример несовсем относится к теме занятия, но по жизни он очень может пригодиться.

Задача — создать копию существующей таблицы.

Копия существующей таблицы может быть создана с помощью комбинации CREATE TABLE и SELECT.

Новая таблица будет имеет те же определение столбцов, могут быть выбраны все столбцы или отдельные столбцы. При создании новой таблицы с помощью существующей таблицы, новая таблица будет заполняться с использованием существующих значений в старой таблице.


					
    CREATE TABLE NEW_TABLE_NAME AS
                                    SELECT [ column1, column2. ..columnN ]
                                    FROM EXISTING_TABLE_NAME
                                    [ WHERE ]
					
				

Создадим копию таблицы city. Вопрос — почему 1=0?


					
    CREATE TABLE city_bkp AS
                            SELECT *
                            FROM city
                            WHERE 1=0
					
				

INSERT

Задача — создать копию существующей таблицы.

Подзапросы также могут использоваться с инструкцией INSERT. Инструкция INSERT использует данные, возвращаемые из подзапроса, для вставки в другую таблицу. Выбранные в подзапросе данные могут быть изменены. Основной синтаксис следующий.


					
    INSERT INTO table_name [ (column1 [, column2 ]) ]
                SELECT [ *|column1 [, column2 ]
                FROM table1 [, table2 ]
                [ WHERE VALUE OPERATOR ]
					
				

Копирование всей таблицы полностью


					
    INSERT INTO city_bkp SELECT * FROM city
					
				

Копируем города которые находся в стране с численостью не меньше 500тыс. человек, но не больше 1 миллиона.


					
    INSERT INTO city_bkp 
                SELECT * FROM city 
                WHERE CountryCode IN 
                                (SELECT Code FROM country 
                                 WHERE Population < 1000000 AND Population > 500000)
					
				

UPDATE

Подзапрос может использоваться в сочетании с инструкцией UPDATE. Один или несколько столбцов в таблице могут быть обновлены при использовании подзапроса с помощью инструкции UPDATE. Основной синтаксис следующий.


					
    UPDATE table
    SET column_name = new_value
        [ WHERE OPERATOR [ VALUE ]
        (SELECT COLUMN_NAME
         FROM TABLE_NAME)
         [ WHERE) ]
					
				

Исходя из того, что у нас есть таблица CITY_BKP, которая является резервной копией таблицы CITY, в следующем примере для всех записей, для которых Population больше или равно 100000, применяет коэффициент 0,25.


					
    UPDATE city_bkp SET Population = Population * 0.25 
    WHERE Population IN (
                         SELECT Population FROM city 
                         WHERE Population >= 100000 ) 
					
				

DELETE

Подзапрос может использоваться в сочетании с инструкцией DELETE, так же как и со всеми описанными выше инструкциями. Основной синтаксис следующий.


					
    DELETE FROM TABLE_NAME
    [ WHERE OPERATOR [ VALUE ]
        (SELECT COLUMN_NAME
         FROM TABLE_NAME)
         [ WHERE) ]
					
				
Далее будут показы примеры использования вложеных запросов с использованием базы данных world. БД находится в папке _lec\7\db вместе с лекцией.

Внутреннее объединение

Вывести идентификатор и название города, а так же страну нахождения

Для этого проще всего обратиться к таблице CITY


				
    SELECT ID, Name, CountryCode FROM city
				
			

Но, что если нам необходимо, чтобы в ответе на запрос был не код страны, а её название? Вложенные запросы нам не помогут. А нам надо получить данные из двух таблиц и объединить их в одну. Запросы, которые позволяют это сделать, в SQL называются объединениями. Синтаксис самого простого объединения следующий:


				
    SELECT city.ID, city.Name, country.Name FROM city, country
				
			

Получилось не совсем то, что мы ожидали. Такое объединение научно называется декартовым произведением, когда каждой строке первой таблицы ставится в соответствие каждая строка второй таблицы.

Чтобы результирующая таблица выглядела так, как мы хотели, необходимо указать условие объединения. Мы связываем наши таблицы по идентификатору, это и будет нашим условием.


				
    SELECT city.ID, city.Name, country.Name 
    FROM city, country 
    WHERE city.CountryCode = country.Code
				
			

Т.е. мы в запросе сделали следующее условие: если в обеих таблицах есть одинаковые идентификаторы, то строки с этим идентификатором необходимо объединить в одну результирующую строку.

Как вы понимаете, объединения дают возможность выбирать любую информацию из любых таблиц, причем объединяемых таблиц может быть и три, и четыре, да и условие для объединения может быть не одно.

JOIN LEFT/RIGHT

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в предложение FROM операторов SELECT, UPDATE и DELETE.

JOIN используется для объединения строк из двух или более таблиц на основе соответствующего столбца между ними.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор.

Особенности операции соединения

  • в схему таблицы-результата входят столбцы обеих исходных таблиц
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы со строкой второй таблицы

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

Ниже представлена струтура таблицы для демонстрации примеров

Таблица персонала Person
idnamecity_id
1Колованов1
2Петров3
3Плотников12
4Кучеров4
5Малкин2
6Иванов13

Ниже представлена струтура таблицы для демонстрации примеров

Таблица городов City
idnamepopulation
1Москва100
2Нижний Новгород25
3Тверь22
4Санкт-Петербург80
5Выборг18
6Челябинск30
7Одинцово5
8Павлово5

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.


					
    SELECT * FROM Person
    INNER JOIN
        City
    ON Person.city_id = City.id
					
				
Результат запроса
Person.idPerson.namePerson.city_idCity.idCity.nameCity.population
1Колованов11Москва100
2Петров33Тверь22
4Кучеров44Санкт-Петербург80
5Малкин22Нижний Новгород25
INNER JOIN

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

В SQL существуют разные типы объединений. Мы рассмотрим только некоторые из них.

LEFT JOIN

Возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений.

LEFT JOIN

					
    SELECT * FROM Person
    LEFT JOIN
        City
    ON Person.city_id = City.id
					
				
Для записей неудовлетворяющих условия объединения поля правой таблицы заполняются значениями NULL
Результат запроса
Person.idPerson. namePerson.city_idCity.idCity.nameCity.population
1Колованов11Москва100
2Петров33Тверь22
3Плотников12NULLNULLNULL
4Кучеров44Санкт-Петербург80
5Малкин22Нижний Новгород25
6Иванов13NULLNULLNULL

RIGHT JOIN

Возвращает все строки из правой таблицы, даже если в левой таблице нет совпадений.

RIGHT JOIN

					
    SELECT * FROM Person
    RIGHT JOIN
        City
    ON Person.city_id = City.id
					
				
Для записей неудовлетворяющих условия объединения поля левой таблицы заполняются значениями NULL
Результат запроса
Person. idPerson.namePerson.city_idCity.idCity.nameCity.population
1Колованов11Москва100
2Петров33Тверь22
4Кучеров44Санкт-Петербург80
5Малкин22Нижний Новгород25
NULLNULLNULL5Выборг18
NULLNULLNULL6Челябинск30
NULLNULLNULL7Одинцово5
NULLNULLNULL8Павлово5

Что такое запрос в SQL?

SQL означает язык структурированных запросов. Он используется в компьютерном программировании для обработки или управления базами данных. Мы используем запросы в SQL для обработки баз данных. Запрос больше похож на вопрос или просьбу простыми словами. Предположим, у вас есть запрос — Пожалуйста, предоставьте мне идентификатор сотрудника всех сотрудников, работающих в бухгалтерии. Или запрос вроде — сколько мест забронировано на шоу? Следовательно, мы запрашиваем или запрашиваем для некоторой информации.

В общих чертах, запрос в SQL — это запрос к базам данных на выборку (или извлечение) информации. Мы используем общий язык — SQL, для запросов к нашим базам данных. Он используется всякий раз, когда у компаний есть масса данных, которыми они хотят манипулировать. Если вы храните свои данные в реляционной базе данных , вы также можете использовать SQL!

Прежде чем углубляться в запросы, давайте кратко рассмотрим SQL.

Краткий обзор SQL

SQL означает язык структурированных запросов. Это один из основных языков запросов, используемых для обработки потоков данных и управления реляционными базами данных. SQL позволяет нам получать доступ к базам данных и управлять ими. SQL имеет широкий спектр приложений в современном мире.

Давайте взглянем на обязательное использование SQL для сбора, хранения и обработки данных и т. д. —

  • SQL можно использовать для выполнения (или выполнения) запросов к базе данных.
  • SQL может вставлять, обновлять, удалять или извлекать данные из баз данных.
  • SQL может создавать новые таблицы или хранимые процедуры, представления и т. д.
  • SQL может устанавливать разрешения для таблиц, процедур и представлений.

Зачем использовать SQL-запрос?

SQL Query используется для запроса или извлечения информации из баз данных. Мы можем выполнять следующие операции с помощью SQL-запроса:

  • Использовать SQL-запрос для создания новой базы данных и вставки данных в базу данных
  • .
  • Используйте SQL-запрос для извлечения (или извлечения) данных из базы данных. Кроме того, для изменения или обновления существующих данных в базе данных.
  • Чтобы удалить или удалить данные или таблицу из базы данных с помощью SQL-запроса . Кроме того, после этого мы можем создать новую таблицу,
  • .
  • Использование SQL-запроса для установки разрешений для таблиц, представлений и процедур. Также для создания функций, представлений и хранимых процедур.

Как написать SQL-запрос?

Основой запроса в SQL Server является предложение SELECT , которое позволяет выбрать отображаемые данные.

Оператор SQL SELECT извлекает записи из таблицы базы данных согласно пунктам (например, FROM и WHERE ), которые определяют критерии, на основании которых будут выбираться наши данные. Синтаксис оператора SQL SELECT:

 
 SELECT столбец1, столбец2.
ИЗ таблицы1, таблицы2
ГДЕ столбец1 = 'xyz' и столбец2 = 'abc';
 

В приведенном выше операторе SQL:

  • Предложение SELECT указывает один или несколько столбцов, которые необходимо получить из базы данных. Чтобы указать несколько столбцов, мы должны использовать запятую и пробел между именами столбцов. Однако, если мы хотим получить все столбцы, мы можем использовать подстановочный знак * (звездочка) SELECT * FROM … .
  • Предложение FROM указывает одну или несколько таблиц, которые должны быть запрошены . Мы можем использовать запятую и пробел между именами таблиц при указании нескольких таблиц, например, FROM Names, Addresses, Phone_Numbers , где Names, Addresses и т. д. — это имена таблиц.
  • Предложение WHERE выбирает только те строки , в которых указанный столбец содержит указанное значение. WHERE позволяет отфильтровать запрос, чтобы сделать его более конкретным. Значение обычно заключается в одинарные кавычки (например, WHERE color = ‘teal’ ).
  • Точка с запятой (;) является терминатором оператора . Однако если у вас есть однострочный оператор SQL-запроса, вы можете пропустить точку с запятой (;). Но это обязательно, если у вас многострочный запрос. Как правило, рекомендуется включать точку с запятой после каждого завершающего оператора SQL-запроса.

В приведенном выше объяснении и синтаксисе мы использовали заглавные буквы для каждого предложения SQL. Однако обратите внимание, что SQL не чувствителен к регистру . То есть SELECT совпадает с select , FROM совпадает с из и т. д.

Примеры SQL-запросов

Давайте рассмотрим несколько примеров, чтобы лучше понять SQL-запросы. Предположим, у нас есть таблица с именем Customers . Давайте выполним некоторые операции SQL для извлечения данных из нашей таблицы и управления ими.

Пример 1. Оператор SELECT

Чтобы получить все столбцы нашего SQL из таблицы «Клиенты», мы можем использовать следующий оператор SQL:

 
 SELECT * FROM Customers;
 

После выполнения вышеуказанного запроса мы получим следующий вывод:

Вывод:

Следовательно, использование * (звездочка) дает нам в качестве вывода всю таблицу.

Теперь предположим, что мы хотим получить на выходе только имя, фамилию и страну, в которой они живут. Для этого мы выполним следующий SQL-запрос:

 
 ВЫБЕРИТЕ имя, фамилию, страну ИЗ Клиентов;
 

Выполнение вышеуказанного запроса даст нам следующий вывод:

Вывод:

США
имя фамилия страна
Джон Доу

6

Роберт Луна США
Дэвид Робинсон Великобритания
Джон Райнхардт Великобритания
Бетти Доу ОАЭ63 2 В приведенном выше выводе вы можете видеть, что мы получили только имя, фамилию и страну. после выполнения вышеуказанного запроса. Это связано с тем, что мы указали только эти имена столбцов в нашем запросе на выборку.

Давайте также возьмем пример, где мы меняем порядок имен наших таблиц и проверяем, получаем ли мы выходные данные в том же порядке или нет.

 
 ВЫБЕРИТЕ страну, customer_id
ОТ клиентов;
 

Вывод:

Следовательно, мы можем заключить, что изменение порядка имен таблиц в операторе select на противоположное также меняет порядок в выводе.

Пример 2. Пункт FROM

Предположим, у нас есть другая таблица Orders . Во-первых, давайте посмотрим содержимое таблицы Orders.

Код:

 
 ВЫБЕРИТЕ * ИЗ Заказов;
 

Вывод:

Итак, приведенное выше является содержимым таблицы Orders. Давайте выполним некоторые операции, объединив таблицы Customers и Orders, чтобы узнать больше о работе предложения FROM.

Код:

 
 ВЫБЕРИТЕ first_name как имя, last_name как фамилия, пункт
ОТ клиентов, заказов;
 

Вывод:

915166 Джон 6880168 Роберт 016888 Доу 9016 Монитор
Имя Фамилия Пункт
Джон Доу Клавиатура
Джон Доу Мышь Доу Монитор
Джон Доу Клавиатура
Джон Доу Коврик для мыши
Роберт Луна Клавиатура
Роберт Мышь
Роберт Луна Монитор
Роберт Луна Клавиатура
Коврик для мыши
Дэвид Робинсон Клавиатура
Дэвид Робинсон Мышь
Дэвид Робинсон Монитор
Дэвид Робинсон Клавиатура
Дэвид Робинсон Коврик для мыши
Джон Рейнхардт 7 Клавиатура
Райнхардт Мышь
Джон Рейнхардт Монитор
Джон Райнхардт Клавиатура
Джон Рейнхардт Коврик для мыши
Бетти Доу Клавиатура
Бетти Доу Мышь
Бетти
Бетти Доу Клавиатура
Бетти Доу Коврик для мыши

В приведенном выше выводе вы можете видеть, что мы попытались выбрать имя, фамилию и элемент из обеих таблиц, что привело к приведенному выше выводу.

Кроме того, мы использовали ‘как’ , который используется как псевдоним. Команда AS используется для переименования столбца или таблицы с помощью псевдонима. Псевдоним существует только на время выполнения запроса. Следовательно, после этого запроса имена столбцов/имена таблиц будут такими же, как и в оригинале.

Следует заметить, что в обеих таблицах есть общее имя столбца, которое представляет собой столбец идентификатора клиента . Таким образом, для отображения идентификатора клиента нам нужно явно указать имя таблицы, за которым следует оператор точки (.), а затем указать имя столбца. Давайте посмотрим на это на примере.

Код:

 
 ВЫБЕРИТЕ Customers.customer_id в качестве идентификатора, first_name в качестве имени, элемент
ОТ клиентов, заказов;
 

Вывод:

Клавиатура8 7 1 Роберт Клавиатура 9016 1566 Джон33 7
ID Имя Артикул
1 Джон
Джон Мышь
1 Джон Монитор
1 Джон Клавиатура
1 Джон Коврик для мыши
2
2 Роберт Мышь
2 Роберт Монитор
2 Роберт Клавиатура
2 Роберт 6 16 7 39 Коврик для мыши Дэвид Клавиатура
3 Дэвид Мышь
3 Монитор 3 Дэвид Клавиатура
3 Дэвид Коврик для мыши
4 Джон Клавиатура
4 Джон Мышь 9016 9016 4
Монитор
4 Джон Клавиатура
4 Джон Коврик для мыши
Бетти Клавиатура
5 Бетти Мышь
5 Бетти Монитор
5 Бетти Клавиатура
5 Мышь Бетти 8

Следовательно, в приведенном выше примере кода после явного упоминания идентификатора клиента с именем его таблицы мы можем получить приведенный выше вывод. Если бы мы не упомянули Customers.customer_id , то получили бы ошибку Error: ambiguous column name: customer_id .

Давайте также рассмотрим пример использования DISTINCT. Оператор SELECT DISTINCT используется для возврата только различных или отличающихся значений. Внутри таблицы столбец иногда содержит много повторяющихся значений, и вам часто нужно перечислить только разные значения. Итак, давайте посмотрим на его использование.

Код:

 
 ВЫБЕРИТЕ РАЗЛИЧНУЮ позицию, количество
ОТ Заказов;
 

Вывод:

В приведенном выше выводе мы получили только разные значения товара и суммы. Мы не получили никаких значений, которые были бы дублированы повсюду.

Пример 3. Предложение WHERE

Наконец, давайте подробнее рассмотрим использование предложения where. Как вы уже знаете, предложение WHERE используется для фильтрации записей. Он используется для извлечения только тех записей, которые удовлетворяют заданному условию.

Код:

 
 ВЫБЕРИТЕ имя, страну, предмет, сумму
ОТ клиентов, заказы
ГДЕ сумма > 400;
 

Вывод:

В приведенном выше выводе вы можете видеть, что мы отфильтровали наши вышеуказанные записи только к записям, в которых количество больше 400. Следовательно, вы можете видеть, что мы получили только эти записи в качестве вывода. где сумма больше 400.

Давайте напишем еще несколько запросов, используя предложение WHERE с использованием И, ИЛИ и НЕ.

Код:

 
 ВЫБЕРИТЕ имя, страну, предмет, сумму
ОТ клиентов, заказы
ГДЕ страна НЕ "США" И сумма < 400;
 

Вывод:

В приведенном выше примере мы использовали оператор И. Оператор AND отображает запись, если все условия, разделенные оператором AND, ИСТИННЫ.

Код:

 
 ВЫБЕРИТЕ имя, страну, товар, сумму
ОТ клиентов, заказы
ГДЕ Customers.customer_id = Orders. customer_id;
 

Вывод:

В приведенном выше примере мы получили только клиентов, которые приобрели товары с помощью оператора сравнения '=' . Мы сравнили идентификаторы клиентов с их заказами.

Давайте посмотрим на последний пример, где мы удаляем некоторые данные из нашей таблицы.

Код:

 
 УДАЛИТЬ ИЗ Customers WHERE first_name='John';
 

Вывод:

Оператор DELETE используется для удаления существующих записей в таблице. В приведенном выше примере все записи с именем first_name равны 9.0003 "Джон" удален.

Заключение

  • SQL означает язык структурированных запросов. Это язык, который используется для получения информации из баз данных.
  • Оператор SQL SELECT извлекает записи из таблицы базы данных в соответствии с предложениями (например, FROM и WHERE), которые определяют критерии. Возвращенные данные сохраняются в таблице результатов, называемой набором результатов.
  • Предложение FROM указывает одну или несколько таблиц для запроса. Предложение WHERE выбирает только те строки, в которых указанный столбец содержит указанное значение.
  • Мы можем выполнять все операции создания, чтения, обновления и удаления с помощью SQL-запросов. Кроме того, мы также можем установить разрешения для таблиц, представлений и процедур.
  • Мы можем выполнять различные операции, такие как И, ИЛИ, НЕ, В и многие другие при выполнении запросов к нашим базам данных.

Примеры запросов SQL | Cloud Logging

Этот документ содержит примеры запросов к записям журнала, которые хранятся в сегменты журналов, обновленные для использования Log Analytics. В этих корзинах вы можете выполнять SQL-запросы из Страница Log Analytics в консоли Google Cloud. Дополнительные образцы см. logging-analytics-samples и security-analytics репозиториев GitHub.

В этом документе не описывается SQL или способ маршрутизации и хранения записей журнала. Для информацию по этим темам см. в разделе «Что дальше».

Перед началом работы

  • Чтобы использовать запросы, показанные в этом документе, на странице Log Analytics , заменить ТАБЛИЦА с названием таблицы, которая соответствует к представлению, которое вы хотите запросить. Имя таблицы имеет формат project_ID.region.bucket_ID.view_ID . Вы можете найти имя таблицы для просмотр на странице Log Analytics ; запрос по умолчанию для журнала представление перечисляет имя таблицы в операторе FROM . Для информация о том, как получить доступ к запросу по умолчанию, см. Запрос представления журнала.

    Перейти к Log Analytics

  • Чтобы использовать запросы, показанные в этом документе, на Большой запрос Рабочая область SQL * страница, заменить ТАБЛИЦА с путем к таблице в связанном наборе данных. Например, чтобы запросить представление _AllLogs в связанном наборе данных mydataset то есть в проекте myproject , установите в этом поле значение мой проект.mydataset._AllLogs :

    Перейти к рабочей области BigQuery SQL

Журналы фильтрации

SQL-запросы определяют, какие строки таблицы обрабатывать, затем они группируются строки и выполнять агрегатные операции. Когда нет группировки и агрегации перечислены операции, результат запроса включает строки, выбранные работа фильтра. Примеры в этом разделе иллюстрируют фильтрацию.

Фильтр по времени

Одним из вариантов фильтрации по времени является использование функции TIMESTAMP_SUB . Этот Функция позволяет указать интервал ретроспективного просмотра от текущего времени.

Например, следующий запрос считывает данные за последний час, сортирует данные по возрастанию метки времени, а затем отображает 100 самых старых записей:

 ВЫБЕРИТЕ
  отметка времени, имя_журнала, серьезность, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), ИНТЕРВАЛ 1 ЧАС)
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Другой вариант — использовать функцию отметки времени . Следующий запрос читает все логи, полученные в закрытом временном диапазоне, а затем отображает 100 самых старых записей:

 SELECT
  отметка времени, имя_журнала, серьезность, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  метка времени >= TIMESTAMP("2022-08-25 13:00:00", "Америка/Нью-Йорк") И
  метка времени <= TIMESTAMP("2022-08-25 17:00:00", "Америка/Нью-Йорк")
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Дополнительные сведения о фильтрации по времени см. Функции времени и функции отметки времени.

Фильтр по ресурсу

Для фильтрации по ресурсу добавьте ограничение resource.type .

Например, следующий запрос считывает данные за последний час, а затем сохраняет те строки, тип ресурса которых соответствует gce_instance , а затем сортирует и отображает до 100 записей:

 ВЫБРАТЬ
  отметка времени, имя_журнала, серьезность, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  resource.type = "gce_instance"
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Фильтр по серьезности

Вы можете фильтровать по определенной серьезности с ограничением, например серьезность = "ОШИБКА" . Другой вариант — использовать оператор IN . и укажите набор допустимых значений.

Например, следующий запрос считывает данные за последний час и затем сохраняет только те строки, которые содержат серьезность поле, значение которого либо 'ИНФОРМАЦИЯ' , либо 'ОШИБКА' :

 ВЫБОР
  отметка времени, имя_журнала, серьезность, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  серьезность НЕ NULL И
  серьезность IN («ИНФОРМАЦИЯ», «ОШИБКА»)
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Предыдущий запрос фильтрует по значению поля серьезности . Однако, вы также можете писать запросы, фильтрующие числовое значение серьезности журнала. Например, если вы замените серьезность строк со следующими строками, запрос возвращает все записи журнала с уровнем серьезности не ниже . серьезность_число > 200

Информацию о перечисляемых значениях см. LogSeverity .

Фильтр по имени журнала

Для фильтрации по имени журнала можно добавить ограничение на значение log_name или поле log_id . имя_журнала 9Поле 0825 включает ресурс путь. То есть это поле имеет такие значения, как project/myproject/logs/mylog . В поле log_id хранится только имя журнала, например mylog .

Например, следующий запрос считывает данные за последний час, а затем сохраняет те строки, где значение в поле log_name заканчивается на data_access , а затем сортирует и отображает результаты:

 SELECT
  отметка времени, имя_журнала, серьезность, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  имя_журнала НРАВИТСЯ "%data_access"
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

В предыдущем примере указывается частичное имя и используется Оператор LIKE и подстановочный знак % .

Фильтр по метке ресурса

Большинство отслеживаемых дескрипторов ресурсов определяют метки, которые используются для идентификации конкретный ресурс. Например, дескриптор экземпляра Compute Engine включает метки для зоны, идентификатор проекта и идентификатор экземпляра. Когда запись в журнал записывается, каждому полю присваиваются значения. Следующее например:

 {
   тип: "gce_instance"
   метки: {
      instance_id: "1234512345123451"
      project_id: "мой-проект"
      зона: "us-central1-f"
   }
}
 

Поскольку тип данных поля labels — JSON, включая ограничение например resource.labels.zone = "us-centra1-f" в запросе приводит к синтаксису ошибка. Чтобы получить значение поля с типом данных JSON, используйте функцию JSON_VALUE .

Например, следующий запрос считывает самые последние данные, а затем сохраняет те строки, где ресурс является экземпляром Compute Engine, находится в us-central1-f зона:

 ВЫБЕРИТЕ
  отметка времени, имя_журнала, серьезность, JSON_VALUE(resource. labels.zone) зона AS, json_payload, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  resource.type = "gce_instance" И
  JSON_VALUE(resource.labels.zone) = "us-central1-f"
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Для получения информации обо всех функциях, которые могут извлекать и преобразовывать JSON. данные, см. функции JSON.

Фильтровать по HTTP-запросу

Чтобы отфильтровать таблицу, чтобы включить только те строки, которые соответствуют HTTP-запросу или ответьте, добавьте ограничение http_request IS NOT NULL :

 SELECT
  отметка времени, имя_журнала, серьезность, http_request, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  http_request НЕ НУЛЬ
ЗАКАЗАТЬ ПО отметке времени
ПРЕДЕЛ 100
 

Следующий запрос включает только строки, соответствующие ПОЛУЧИТЬ или ОТПРАВИТЬ запросы:

 ВЫБЕРИТЕ
  отметка времени, имя_журнала, серьезность, http_request, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  http_request НЕ NULL И
  http_request. request_method IN ('GET', 'POST')
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Фильтр по статусу HTTP

Чтобы фильтровать по статусу HTTP, измените предложение WHERE , чтобы оно требовало http_request.status 9Поле 0825 должно быть определено:

 ВЫБРАТЬ
  отметка времени, имя_журнала, http_request.status, http_request, ресурс, метки
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  http_request НЕ NULL И
  http_request.status НЕ НУЛЬ
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 100
 

Чтобы определить тип данных, хранящихся в поле, просмотрите схему или отобразите поле. Результаты предыдущего запроса показывают, что http_request.status 9Поле 0825 хранит целочисленные значения.

Фильтр по полю с типом JSON

Чтобы извлечь значение из столбца с типом данных JSON, используйте функцию JSON_VALUE .

Рассмотрим следующие запросы:

 SELECT
  json_payload
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  json_payload.status НЕ НУЛЬ
 

и

 ВЫБОР
  json_payload
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  JSON_VALUE(json_payload.status) НЕ НУЛЬ
 

Предыдущие запросы проверяют значение столбца json_payload ; Контент этого столбца определяется содержанием записи журнала. Оба запроса отбрасывать строки, не содержащие столбец с меткой json_payload . Разница между этими двумя запросами заключается в последней строке, которая определяет что протестировано против NULL . Теперь рассмотрим таблицу с двумя строками. В одной столбец json_payload имеет следующий вид:

 {
    положение дел: {
        время измерения: "1661517845"
    }
}
 

В другой строке столбец json_payload имеет другую структуру:

 {
    @type: "type. googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
    jobName: "проекты/мой-проект/местоположения/us-central1/jobs/test1"
    относительный URL: "/food=торт"
    статус: "НЕ НАЙДЕНО"
    targetType: "APP_ENGINE_HTTP"
}
 

Обе предыдущие строки удовлетворяют ограничению json_payload.status НЕ НУЛЕВОЕ . То есть результат запроса включает обе строки. Однако при ограничении JSON_VALUE(json_payload.status) НЕ НУЛЕВОЕ , в результат включается только вторая строка.

Фильтр по регулярному выражению

Чтобы вернуть подстроку, соответствующую регулярному выражению, используйте функцию REGEXP_EXTRACT . Тип возвращаемого значения этой функции либо STRING , либо BYTES .

Следующий запрос отображает самые последние полученные записи журнала, сохраняет эти записи с полем json_payload. jobName , а затем отображает часть имени, начинающаяся с тест :

 ВЫБОР
  метка времени, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") Имя AS,
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  json_payload.jobName НЕ НУЛЕВОЕ
ЗАКАЗАТЬ ПО отметке времени DESC
ПРЕДЕЛ 20
 

Дополнительные примеры см. REGEXP_EXTRACT документация. Примеры других регулярных выражений, которые вы можете использовать, см. Функции, операторы и условные операторы.

Запрос, показанный в этом примере, неэффективен. Для совпадения подстроки, например показано, используйте функцию CONTAINS_SUBSTR .

Групповые и агрегированные записи журнала

Этот раздел основывается на предыдущих примерах и иллюстрирует, как вы можете группировать и агрегировать строки таблицы. Если вы не укажете группировку, но сделаете указать агрегацию, печатается один результат, поскольку SQL обрабатывает все строки, которые удовлетворяют предложению WHERE , как единая группа.

Каждое выражение SELECT должно быть включено в поля группы или агрегировано.

Группировка по времени

Для группировки данных по времени используйте функцию TIMESTAMP_TRUNC , который усекает отметку времени до указанной детализации, например MINUTE . Для например метка времени 15:30:11 , которая отформатирована как часы:минуты:секунды , становится 15:30:00 , когда установлена ​​степень детализации МИНУТА .

Следующий запрос считывает данные за последние 10 часов, а затем сохраняет те строки, где значение Поле json. payload.status не равно NULL. Запрос усекает отметку времени в каждой строке по часам, а затем группирует строки по усеченной отметке времени и статусу:

 SELECT
  TIMESTAMP_TRUNC(отметка времени, ЧАС) КАК час,
  JSON_VALUE(json_payload.status) статус AS,
  COUNT(*) КАК считать
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени> TIMESTAMP_SUB(CURRENT_TIMESTAMP(), ИНТЕРВАЛ 10 ЧАСОВ) И
  json_payload НЕ NULL И
  JSON_VALUE(json_payload.status) НЕ НУЛЬ
ГРУППА ПО час,статус
ЗАКАЗАТЬ ПО часам ASC
 

Дополнительные образцы см. TIMESTAMP_TRUNC документация. Для получения информации о других функциях, основанных на времени, см. Функции даты и времени.

Группировка по ресурсу

Следующий запрос считывает данные за последний час, а затем группирует строки по типу ресурса. Затем он подсчитывает количество строк для каждого типа, и возвращает таблицу с двумя столбцами. В первом столбце перечислены ресурсы тип, а второй столбец — количество строк для этого типа ресурса:

 ВЫБОР
   resource.type, COUNT(*) КАК количество
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), ИНТЕРВАЛ 1 ЧАС)
СГРУППИРОВАТЬ ПО resource.type
ПРЕДЕЛ 100
 

Группировка по серьезности

Следующий запрос считывает данные за последний час, а затем сохраняет строки. которые имеют поле серьезности. Затем запрос группирует строки по серьезности и подсчитывает количество строк для каждой группы:

 SELECT
  серьезность, COUNT(*) AS количество
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  серьезность НЕ НУЛЕВАЯ
СГРУППИРОВАТЬ ПО серьезности
ORDER BY серьезности
ПРЕДЕЛ 100
 

Группировка по

log_id

Результатом следующего запроса является таблица с двумя столбцами. Первый столбце перечислены имена журналов, а во втором столбце указано количество записи журнала, которые были записаны в этот журнал за последний час. запрос сортирует результаты по количеству записей:

 SELECT
  log_id, COUNT(*) КАК количество
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), ИНТЕРВАЛ 1 ЧАС)
СГРУППИРОВАТЬ ПО log_id
ЗАКАЗАТЬ ПО КОЛИЧЕСТВУ DESC
ПРЕДЕЛ 100
 

Вычислить среднюю задержку для HTTP-запроса

Следующий запрос иллюстрирует группировку по нескольким столбцам и вычисление среднее значение. Запрос группирует строки по URL-адресу, содержащемуся в HTTP-запросе. запросом и значением поля labels.checker_location . После группируя строки, запрос вычисляет среднюю задержку для каждой группы:

 ВЫБОР
  JSON_VALUE(labels.checker_location) КАК местоположение,
  AVG(http_request. latency.seconds) AS сек, http_request.request_url
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  http_request НЕ NULL И
  http_request.request_method IN ('GET')
СГРУППИРОВАТЬ ПО http_request.request_url, местоположение
ЗАКАЗАТЬ ПО МЕСТОПОЛОЖЕНИЮ
ПРЕДЕЛ 100
 

В предыдущем выражении для извлечения значения требуется JSON_VALUE . из labels.checker_location поле, потому что тип данных для метки - это JSON. Однако вы не используете эту функцию для извлечения значения из поле http_request.latency.seconds . Последнее поле имеет тип данных целое число.

Вычисление среднего количества байтов, отправленных для теста подсети

Следующий запрос иллюстрирует, как можно отобразить среднее число байтов, отправленных по местоположению.

Запрос считывает данные за последний час, а затем сохраняет только эти строки. чей столбец типа ресурса равен gce_subnetwork и чей json_payload столбец не NULL. Затем запрос группирует строки по расположению ресурс. В отличие от предыдущего примера, где данные хранятся в виде числового значение, значение поля bytes_sent является строкой, и поэтому вы должны преобразовать значение в FLOAT64 перед вычислением среднего:

 SELECT JSON_VALUE(resource.labels.location) КАК местоположение,
   AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) КАК байты
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  resource.type = "gce_subnetwork" И
  json_payload НЕ НУЛЬ
СГРУППИРОВАТЬ ПО местоположению
ПРЕДЕЛ 100
 

Результатом предыдущего запроса является таблица, в каждой строке которой указано местоположение и среднее количество байтов, отправленных для этого местоположения.

Для получения информации обо всех функциях, которые могут извлекать и преобразовывать JSON. данные, см. функции JSON.

Информацию о CAST и других функциях преобразования см. Конверсионные функции.

Подсчет записей журнала с полем, соответствующим шаблону

Чтобы вернуть подстроку, соответствующую регулярному выражению, используйте функцию REGEXP_EXTRACT . Тип возвращаемого значения этой функции либо STRING , либо BYTES .

Следующий запрос сохраняет записи журнала, для которых значение поля json_payload.jobName не равно NULL. Затем он группирует записи по суффиксу имени, который начинается с тестом . Наконец, запрос подсчитывает количество записей в каждой группе:

 ВЫБОР
  REGEXP_EXTRACT(JSON_VALUE(json_payload. jobName), r".*(test.*)$") Имя AS,
  COUNT(*) КАК считать
ОТ
  `  ТАБЛИЦА  `
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  json_payload.jobName НЕ НУЛЕВОЕ
СГРУППИРОВАТЬ ПО имени
ЗАКАЗАТЬ ПО количеству
ПРЕДЕЛ 20
 

Дополнительные примеры см. REGEXP_EXTRACT документация. Примеры других регулярных выражений, которые вы можете использовать, см. Функции, операторы и условные операторы.

Поиск по столбцам

В этом разделе описываются два разных подхода, которые можно использовать для поиска несколько столбцов таблицы.

Поиск на основе токенов

Для поиска в таблице записей, соответствующих набору условий поиска, используйте функцию ПОИСК . Эта функция требует два параметра: где искать и поисковый запрос. Поскольку функция SEARCH имеет определенные правила поиска данных, мы рекомендуем вам прочитать документацию SEARCH .

Следующий запрос сохраняет только те строки, в которых есть поле точно соответствует «35.193.12.15»:

 SELECT
  временная метка, log_name, proto_payload, серьезность, resource.type, ресурс, метки
ОТ
  `  ТАБЛИЦА  ` AS t
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  proto_payload НЕ NULL И
  log_name КАК "%cloudaudit.googleapis.com%" И
  ПОИСК(t,"`35.193.12.15`")
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 20
 

В предыдущем запросе обратные кавычки заключают в себе искомое значение. Этот гарантирует, что ПОИСК Функция ищет точное совпадение между значение поля и значение между обратными кавычками.

Если в строке запроса опущены обратные кавычки, строка запроса разделяется на основе правил, определенных в документации SEARCH . Например, когда выполняется следующий оператор, строка запроса разделена на четыре токена: "35", "193", "12" и "15":

 ПОИСК(t,"35. 193.12.15")
 

Предыдущий оператор SEARCH соответствует строке, когда одно поле соответствует всем четырем токенам. Порядок токенов не имеет значения.

В запрос можно включить несколько операторов SEARCH . Например, в предыдущий запрос, вы можете заменить фильтр по имени журнала на утверждение, подобное следующему:

 SEARCH(t,"`cloudaudit.googleapis.com`")
 

Предыдущий оператор ищет всю таблицу, в то время как исходный оператор ищет только столбец log_name .

Чтобы выполнить множественный поиск по столбцу, разделите отдельные строки символом пространство. Например, следующий оператор соответствует строкам, в которых поле содержит «Hello World», «happy» и «days»:

 SEARCH(t,"`Hello World` счастливые дни")
 

Наконец, вы можете искать определенные столбцы таблицы вместо поиска весь стол. Например, следующий оператор ищет только столбцы с именами text_payload и json_payload :

 SEARCH((text_payload, json_payload), "`35.222.132.245`")
 

Для получения информации о том, как обрабатываются параметры функции ПОИСК , см. справочную страницу BigQuery Функции поиска.

Поиск подстроки

Чтобы выполнить тест без учета регистра, чтобы определить, существует ли значение в выражение, используйте функцию CONTAINS_SUBSTR . Эта функция возвращает TRUE , когда значение существует и ЛОЖЬ иначе. Значение поиска должно быть литералом STRING , но не литерал NULL .

Например, следующий запрос извлекает все записи журнала аудита с определенный IP-адрес, временные метки которого находятся в определенном диапазоне времени. Наконец, запрос сортирует результаты, а затем отображает 20 самых старых результатов:

 ВЫБОР
  временная метка, log_name, proto_payload, серьезность, resource.type, ресурс, метки
ОТ
  `  ТАБЛИЦА  ` AS t
ГДЕ
  отметка времени > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) И
  proto_payload НЕ NULL И
  log_name КАК "%cloudaudit.googleapis.com%" И
  CONTAINS_SUBSTR(т,"35.193.12.15")
ЗАКАЗАТЬ ПО отметке времени ASC
ПРЕДЕЛ 20
 

Предыдущий запрос выполняет проверку подстроки. Таким образом, строка, содержащая "35.193.12.152" соответствует CONTAINS_SUBSTR 9Заявление 0825.

Что дальше

Для получения информации о маршрутизации и хранении записей журнала см. см. следующие документы:

  • Создание сегмента журнала
  • Обновление корзины для использования Log Analytics
  • Связать сегмент журналов с набором данных BigQuery
  • Настройка приемников и управление ими

Справочную документацию по SQL см.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

© 2019 Штирлиц Сеть печатных салонов в Перми

Цифровая печать, цветное и черно-белое копирование документов, сканирование документов, ризография в Перми.