Getting started with SQL queries (Начало работы с запросами SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: API SQL

В учетных записях API SQL Azure Cosmos DB имеются два способа чтения данных.

Операции точечного чтения. Поиск пары "ключ-значение" можно выполнить по одному ИД элемента и ключу секции. Сочетание ИД элемента и ключа секции является ключом, а сам элемент является значением. Для документа размером 1 КБ, стоимость операций точечного чтения обычно составляет 1 единицу запроса, а задержка — менее 10 мс. Операции точечного чтения возвращают один элемент.

Ниже приведены некоторые примеры того, как выполнять Операции точечного чтения с каждым пакетом SDK.

Запросы SQL. Позволяет запрашивать данные, путем создания запросов с помощью SQL в качестве языка запросов JSON. Стоимость операций запросов всегда составляет по крайней мере 2.3 единицы запросов. Операции запросов как правило, имеют более высокую и переменную задержку, чем операции точечного чтения. Запросы могут возвращать много элементов.

Большинство рабочих нагрузок с интенсивными операциями чтения в Azure Cosmos DB используют сочетание операций точечного чтения и запросов SQL. Если требуется просто прочитать один элемент — лучше использовать операции точечного чтения, поскольку они дешевле и быстрее, чем запросы. При точечном чтении не требуется использовать обработчик запросов для доступа к данным. Их можно считываться напрямую. Конечно, не все рабочие нагрузки могут считывать данные исключительно с использованием операций точечного чтения, поэтому поддержка SQL в качестве языка запросов и независимое от схемы индексирование обеспечивает более гибкий способ доступа к данным.

Ниже приведены некоторые примеры того, как выполнять Запросы SQL с каждым пакетом SDK.

Ниже показано, как приступить к написанию запросов SQL в Azure Cosmos DB. Запросы SQL можно выполнять через пакет SDK или портал Azure.

Отправка примера данных

В учетной записи Cosmos DB для API SQL откройте Обозреватель данных, чтобы создать контейнер с именем Families. Как только контейнер будет создан, воспользуйтесь браузером структуры данных, чтобы найти и открыть его. В контейнере Families вы увидите параметр Items справа под его именем. Откройте этот параметр, и в строке меню в центре экрана вы увидите кнопку для создания нового элемента. Эта функция будет использоваться для создания элементов JSON ниже.

Создание элементов JSON

Следующие 2 элемента JSON представляют собой документы о семействе Андерсен и Вейкфилд. Они содержат сведения о родителях, детях и их домашних животных, адрес и регистрационные данные.

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

{
  "id": "AndersenFamily",
  "lastName": "Andersen",
  "parents": [
     { "firstName": "Thomas" },
     { "firstName": "Mary Kay"}
  ],
  "children": [
     {
         "firstName": "Henriette Thaulow",
         "gender": "female",
         "grade": 5,
         "pets": [{ "givenName": "Fluffy" }]
     }
  ],
  "address": { "state": "WA", "county": "King", "city": "Seattle" },
  "creationDate": 1431620472,
  "isRegistered": true
}

Второй элемент использует givenName и familyName вместо firstName и lastName:

{
  "id": "WakefieldFamily",
  "parents": [
      { "familyName": "Wakefield", "givenName": "Robin" },
      { "familyName": "Miller", "givenName": "Ben" }
  ],
  "children": [
      {
        "familyName": "Merriam",
        "givenName": "Jesse",
        "gender": "female",
        "grade": 1,
        "pets": [
            { "givenName": "Goofy" },
            { "givenName": "Shadow" }
        ]
      },
      {
        "familyName": "Miller",
         "givenName": "Lisa",
         "gender": "female",
         "grade": 8 }
  ],
  "address": { "state": "NY", "county": "Manhattan", "city": "NY" },
  "creationDate": 1431620462,
  "isRegistered": false
}

Запрос элементов JSON

Попробуйте выполнить несколько запросов к этим данным JSON, чтобы понять некоторые ключевые аспекты языка запросов SQL в Azure Cosmos DB.

Указанный ниже запрос вернет элементы, в которых поле id совпадает с AndersenFamily. Поскольку это запрос SELECT *, результатом выполнения запроса является сформированный элемент JSON. Дополнительные сведения о синтаксисе SELECT см. в разделе Инструкция SELECT.

    SELECT *
    FROM Families f
    WHERE f.id = "AndersenFamily"

Результаты запроса.

    [{
        "id": "AndersenFamily",
        "lastName": "Andersen",
        "parents": [
           { "firstName": "Thomas" },
           { "firstName": "Mary Kay"}
        ],
        "children": [
           {
               "firstName": "Henriette Thaulow", "gender": "female", "grade": 5,
               "pets": [{ "givenName": "Fluffy" }]
           }
        ],
        "address": { "state": "WA", "county": "King", "city": "Seattle" },
        "creationDate": 1431620472,
        "isRegistered": true
    }]

Следующий запрос переформатирует выходные данные JSON в другую форму. Этот запрос создает новый объект JSON Family с двумя выбранными полями, Name и City, если название города совпадает с названием штата. В таком случае совпадут значения "NY" и "NY".

    SELECT {"Name":f.id, "City":f.address.city} AS Family
    FROM Families f
    WHERE f.address.city = f.address.state

Результаты запроса.

    [{
        "Family": {
            "Name": "WakefieldFamily",
            "City": "NY"
        }
    }]

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

    SELECT c.givenName
    FROM Families f
    JOIN c IN f.children
    WHERE f.id = 'WakefieldFamily'
    ORDER BY f.address.city ASC

Результаты:

    [
      { "givenName": "Jesse" },
      { "givenName": "Lisa"}
    ]

Remarks

В предыдущих примерах показано несколько аспектов языка запросов Cosmos DB.

  • Так как SQL API работает со значениями JSON, он имеет дело с сущностями в виде деревьев, а не со строками и столбцами. Можно ссылаться на узлы дерева на любой произвольной глубине, например Node1.Node2.Node3…..Nodem, подобно ссылке из двух частей <table>.<column> в ANSI SQL.

  • Поскольку язык запросов работает с данными без схемы, система типов должна быть привязана динамически. Одно и то же выражение может возвращать различные типы у разных элементов. Результатом запроса является допустимое значение JSON, но оно не обязательно будет иметь фиксированную схему.

  • Azure Cosmos DB поддерживает только элементы, строго соответствующие JSON. Система типов и выражения могут обрабатывать только типы JSON. Дополнительные сведения см. в спецификациях JSON.

  • Контейнер Cosmos является коллекцией элементов JSON, не имеющей схемы. Отношения внутри и между элементами в этом контейнере неявным образом отражены по вложенности, а не задаются связями между первичными и внешними ключами. Эта функция важна для соединений внутри элемента, описанных в разделе Соединения в базе данных Azure Cosmos DB.

Дальнейшие действия