27 KiB
| title | seotitle | list_title | description | menu | weight | metadata | related | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Get started querying data | Query data | Get started with InfluxDB Cloud Dedicated | Query data | Get started querying data in InfluxDB Cloud Dedicated by learning about SQL and InfluxQL, and using tools like the influx3 CLI and InfluxDB client libraries. |
|
102 |
|
|
{{% cloud-name %}} supports multiple query languages:
- SQL: Traditional SQL powered by the Apache Arrow DataFusion query engine. The supported SQL syntax is similar to PostgreSQL.
- InfluxQL: An SQL-like query language designed to query time series data stored in InfluxDB.
This tutorial walks you through the fundamentals of querying data in InfluxDB and focuses on using SQL to query your time series data. The InfluxDB SQL implementation is built using Arrow Flight SQL, a protocol for interacting with SQL databases using the Arrow in-memory format and the Flight RPC framework. It leverages the performance of Apache Arrow with the simplicity of SQL.
{{% note %}} The examples in this section of the tutorial query the get-started database for data written in the Get started writing data section. {{% /note %}}
Tools to execute queries
{{% cloud-name %}} supports many different tools for querying data, including:
{{< req type="key" text="Covered in this tutorial" color="magenta" >}}
influx3data CLI{{< req "* " >}}- InfluxDB v3 client libraries
- Flight clients{{< req "* " >}}
- Superset
- Grafana
- InfluxQL with InfluxDB v1 HTTP API
- [Chronograf](/{{< latest "chronograf" >}}/)
SQL query basics
The {{% cloud-name %}} SQL implementation is powered by the Apache Arrow DataFusion query engine which provides an SQL syntax similar to PostgreSQL.
{{% note %}} This is a brief introduction to writing SQL queries for InfluxDB. For more in-depth details, see Query data with SQL. {{% /note %}}
InfluxDB SQL queries most commonly include the following clauses:
{{< req type="key" >}}
- {{< req "*">}}
SELECT: Identify specific fields and tags to query from a measurement or use the wildcard alias (*) to select all fields and tags from a measurement. - {{< req "*">}}
FROM: Identify the measurement to query. If coming from an SQL background, an InfluxDB measurement is the equivalent of a relational table. WHERE: Only return data that meets defined conditions such as falling within a time range, containing specific tag values, etc.GROUP BY: Group data into SQL partitions and apply an aggregate or selector function to each group.
{{% influxdb/custom-timestamps %}}
-- Return the average temperature and humidity within time bounds from each room
SELECT
avg(temp),
avg(hum),
room
FROM
home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY
room
{{% /influxdb/custom-timestamps %}}
Example SQL queries
Select all data in a measurement
SELECT * FROM home
Select all data in a measurement within time bounds
{{% influxdb/custom-timestamps %}}
SELECT
*
FROM
home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
{{% /influxdb/custom-timestamps %}}
Select a specific field within relative time bounds
SELECT temp FROM home WHERE time >= now() - INTERVAL '1 day'
Select specific fields and tags from a measurement
SELECT temp, room FROM home
Select data based on tag value
SELECT * FROM home WHERE room = 'Kitchen'
Select data based on tag value within time bounds
{{% influxdb/custom-timestamps %}}
SELECT
*
FROM
home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
AND room = 'Living Room'
{{% /influxdb/custom-timestamps %}}
Downsample data by applying interval-based aggregates
{{% influxdb/custom-timestamps %}}
SELECT
DATE_BIN(INTERVAL '1 hour', time, '2022-01-01T00:00:00Z'::TIMESTAMP) as _time,
room
selector_max(temp, time)['value'] AS 'max temp',
FROM
home
GROUP BY
_time,
'max temp',
room
ORDER BY room, _time
{{% /influxdb/custom-timestamps %}}
Execute an SQL query
Get started with one of the following tools for querying data stored in an {{% cloud-name %}} database:
- InfluxDB v3 client libraries: Use language-specific (Python, Go, etc.) clients to execute queries in your terminal or custom code.
- influx3 CLI: Send queries from your terminal command-line.
- Grafana: Use the FlightSQL Data Source plugin, to query, connect, and visualize data.
For this example, use the following query to select all the data written to the get-started database between {{% influxdb/custom-timestamps-span %}} 2022-01-01T08:00:00Z and 2022-01-01T20:00:00Z. {{% /influxdb/custom-timestamps-span %}}
{{% influxdb/custom-timestamps %}}
SELECT
*
FROM
home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
{{% /influxdb/custom-timestamps %}}
{{% note %}} Some examples in this getting started tutorial assume your InfluxDB credentials (URL, organization, and token) are provided by environment variables. {{% /note %}}
{{< tabs-wrapper >}} {{% tabs %}} influx3 CLI Python Go C# {{% /tabs %}} {{% tab-content %}}
{{% influxdb/custom-timestamps %}}
Query InfluxDB v3 using SQL and the influx3 CLI.
The following steps include setting up a Python virtual environment already covered in Get started writing data. If your project's virtual environment is already running, skip to step 3.
-
Setup your Python virtual environment. Inside of your project directory:
python -m venv envs/virtual-env -
Activate the virtual environment.
source ./envs/virtual-env/bin/activate -
Install the CLI package (already installed in the Write data section).
pip install influxdb3-python-cliInstalling
influxdb3-python-clialso installs thepyarrowlibrary for working with Arrow data returned from queries. -
Create the
config.jsonconfiguration.influx3 config \ --name="config-dedicated" \ --database="get-started" \ --host="cluster-id.influxdb.io" \ --token="DATABASE_TOKEN" \ --org="ORG_ID"Replace the following:
DATABASE_TOKEN: a database token with read access to the get-started databaseORG_ID: any non-empty string (InfluxDB ignores this parameter, but the client requires it)
-
Enter the
influx3 sqlcommand and your SQL query statement.
influx3 sql "SELECT *
FROM home
WHERE time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'"
influx3 displays query results in your terminal.
{{% /influxdb/custom-timestamps %}}
{{% /tab-content %}} {{% tab-content %}}
{{% influxdb/custom-timestamps %}}
Use the influxdb_client_3 client library module to integrate {{< cloud-name >}} with your Python code.
The client library supports writing data to InfluxDB and querying data using SQL or InfluxQL.
The following steps include setting up a Python virtual environment already covered in Get started writing data. If your project's virtual environment is already running, skip to step 3.
-
Open a terminal in the
influxdb_py_clientmodule directory you created in the Write data section:-
To create your Python virtual environment, enter the following command in your terminal:
python -m venv envs/virtual-env -
Activate the virtual environment.
source ./envs/virtual-env/bin/activate -
Install the following dependencies:
{{< req type="key" text="Already installed in the Write data section" color="magenta" >}}
influxdb3-python{{< req text="* " color="magenta" >}}: Provides the InfluxDBinfluxdb_client_3Python client library module and also installs thepyarrowpackage for working with Arrow data returned from queries.pandas: Providespandasfunctions, modules, and data structures for analyzing and manipulating data.tabulate: Provides thetabulatefunction for formatting tabular data. pandas requires this module for formatting data as Markdown.
In your terminal, enter the following command:
pip install influxdb3-python pandas tabulate -
In your terminal or editor, create a new file for your code--for example:
query.py.
-
-
In
query.py, enter the following sample code:from influxdb_client_3 import InfluxDBClient3 import os # INFLUX_TOKEN is an environment variable you assigned to your # database READ token string TOKEN = os.getenv('INFLUX_TOKEN') client = InfluxDBClient3( host="cluster-id.influxdb.io", token=TOKEN, database="get-started", ) sql = ''' SELECT * FROM home WHERE time >= '2022-01-01T08:00:00Z' AND time <= '2022-01-01T20:00:00Z' ''' table = client.query(query=sql) print(table.to_pandas().to_markdown())
{{< expand-wrapper >}} {{% expand "Important: If using Windows, specify the Windows certificate path" %}}
If using a non-POSIX-compliant operating system (such as Windows), specify the root certificate path when instantiating the client.
The following example shows how to use the Python certifi package and client library options to pass the certificate path:
-
In your terminal, install the Python
certifipackage.pip install certifi -
In your Python code, import
certifiand call thecertifi.where()method to retrieve the certificate path. -
When instantiating the client, pass the
flight_client_options.tls_root_certs=<ROOT_CERT_PATH>option with the certificate path--for example:from influxdb_client_3 import InfluxDBClient3, flight_client_options import os import certifi TOKEN = os.getenv('INFLUX_TOKEN') fh = open(certifi.where(), "r") cert = fh.read() fh.close() client = InfluxDBClient3( host="cluster-id.influxdb.io", token=TOKEN, database="get-started", flight_client_options=flight_client_options( tls_root_certs=cert)) ...
For more information, see influxdb_client_3 query exceptions.
{{% /expand %}} {{< /expand-wrapper >}}
The sample code does the following:
-
Imports the
InfluxDBClient3constructor from theinfluxdb_client_3module. -
Calls the
InfluxDBClient3()constructor method with credentials to instantiate an InfluxDBclientwith the following credentials:host: {{% cloud-name %}} cluster URL (withouthttps://protocol or trailing slash)token: a database token with read access to the specified database. Store this in a secret store or environment variable to avoid exposing the raw token string.database: the name of the {{% cloud-name %}} database to query
-
Defines the SQL query to execute and assigns it to a
queryvariable. -
Calls the
client.query()method with the SQL query.query()sends a Flight request to InfluxDB, queries the database, retrieves result data from the endpoint, and then returns apyarrow.Tableassigned to thetablevariable. -
Calls the
to_pandas()method to convert the Arrow table to apandas.DataFrame. -
Calls the
pandas.DataFrame.to_markdown()method to convert the DataFrame to a markdown table. -
Calls the
print()method to print the markdown table to stdout. -
Enter the following command to run the program and query your {{% cloud-name %}} cluster:
python query.py
{{< expand-wrapper >}} {{% expand "View returned markdown table" %}}
| co | hum | room | temp | time | |
|---|---|---|---|---|---|
| 0 | 0 | 35.9 | Kitchen | 21 | 2022-01-01 08:00:00 |
| 1 | 0 | 36.2 | Kitchen | 23 | 2022-01-01 09:00:00 |
| 2 | 0 | 36.1 | Kitchen | 22.7 | 2022-01-01 10:00:00 |
| 3 | 0 | 36 | Kitchen | 22.4 | 2022-01-01 11:00:00 |
| 4 | 0 | 36 | Kitchen | 22.5 | 2022-01-01 12:00:00 |
| 5 | 1 | 36.5 | Kitchen | 22.8 | 2022-01-01 13:00:00 |
| 6 | 1 | 36.3 | Kitchen | 22.8 | 2022-01-01 14:00:00 |
| 7 | 3 | 36.2 | Kitchen | 22.7 | 2022-01-01 15:00:00 |
| 8 | 7 | 36 | Kitchen | 22.4 | 2022-01-01 16:00:00 |
| 9 | 9 | 36 | Kitchen | 22.7 | 2022-01-01 17:00:00 |
| 10 | 18 | 36.9 | Kitchen | 23.3 | 2022-01-01 18:00:00 |
| 11 | 22 | 36.6 | Kitchen | 23.1 | 2022-01-01 19:00:00 |
| 12 | 26 | 36.5 | Kitchen | 22.7 | 2022-01-01 20:00:00 |
| 13 | 0 | 35.9 | Living Room | 21.1 | 2022-01-01 08:00:00 |
| 14 | 0 | 35.9 | Living Room | 21.4 | 2022-01-01 09:00:00 |
| 15 | 0 | 36 | Living Room | 21.8 | 2022-01-01 10:00:00 |
| 16 | 0 | 36 | Living Room | 22.2 | 2022-01-01 11:00:00 |
| 17 | 0 | 35.9 | Living Room | 22.2 | 2022-01-01 12:00:00 |
| 18 | 0 | 36 | Living Room | 22.4 | 2022-01-01 13:00:00 |
| 19 | 0 | 36.1 | Living Room | 22.3 | 2022-01-01 14:00:00 |
| 20 | 1 | 36.1 | Living Room | 22.3 | 2022-01-01 15:00:00 |
| 21 | 4 | 36 | Living Room | 22.4 | 2022-01-01 16:00:00 |
| 22 | 5 | 35.9 | Living Room | 22.6 | 2022-01-01 17:00:00 |
| 23 | 9 | 36.2 | Living Room | 22.8 | 2022-01-01 18:00:00 |
| 24 | 14 | 36.3 | Living Room | 22.5 | 2022-01-01 19:00:00 |
| 25 | 17 | 36.4 | Living Room | 22.2 | 2022-01-01 20:00:00 |
{{% /expand %}} {{< /expand-wrapper >}} {{% /influxdb/custom-timestamps %}}
{{% /tab-content %}} {{% tab-content %}}
{{% influxdb/custom-timestamps %}}
-
In the
influxdb_go_clientdirectory you created in the Write data section, create a new file namedquery.go. -
In
query.go, enter the following sample code:package main import ( "context" "fmt" "io" "os" "time" "text/tabwriter" "github.com/apache/arrow/go/v12/arrow" "github.com/InfluxCommunity/influxdb3-go/influx" ) func Query() error { // INFLUX_TOKEN is an environment variable you created // for your database read token. token := os.Getenv("INFLUX_TOKEN") database := "get-started" // Instantiate the client. client, err := influx.New(influx.Configs{ HostURL: "https://cluster-id.influxdb.io", AuthToken: token, }) // Close the client when the function returns. defer func (client *influx.Client) { err := client.Close() if err != nil { panic(err) } }(client) // Define the query. query := `SELECT * FROM home WHERE time >= '2022-01-02T08:00:00Z' AND time <= '2022-01-02T20:00:00Z'` // Execute the query. iterator, err := client.Query(context.Background(), database, query) if err != nil { panic(err) } w := tabwriter.NewWriter(io.Discard, 4, 4, 1, ' ', 0) w.Init(os.Stdout, 0, 8, 0, '\t', 0) fmt.Fprintln(w, "time\troom\ttemp\thum\tco") // Iterate over rows and prints column values in table format. for iterator.Next() { row := iterator.Value() // Use Go arrow and time packages to format unix timestamp // as a time with timezone layout (RFC3339). time := (row["time"].(arrow.Timestamp)). ToTime(arrow.TimeUnit(arrow.Nanosecond)). Format(time.RFC3339) fmt.Fprintf(w, "%s\t%s\t%d\t%.1f\t%.1f\n", time, row["room"], row["co"], row["hum"], row["temp"]) } w.Flush() return nil }The sample code does the following:
-
Imports the following packages:
contextfmtioostext/tabwritergithub.com/apache/arrow/go/v12/arrowgithub.com/InfluxCommunity/influxdb3-go/influx
-
Defines a
Query()function that does the following:-
Instantiates
influx.Clientwith InfluxDB credentials.HostURL: your {{% cloud-name %}} cluster URLAuthToken: a database token with read access to the specified database. Store this in a secret store or environment variable to avoid exposing the raw token string.
-
Defines a deferred function to close the client after execution.
-
Defines a string variable for the SQL query.
-
Calls the
influx.Client.query()method to send the query request with the database name and SQL string. Thequery()method returns aniteratorfor data in the response stream. -
Iterates over rows, formats the timestamp as anRFC3339 timestamp, and prints the data in table format to stdout.
-
-
-
In your editor, open the
main.gofile you created in the Write data section and insert code to call theQuery()function--for example:package main func main() { WriteLineProtocol() Query() } -
In your terminal, enter the following command to install the necessary packages, build the module, and run the program:
go mod tidy && go build && go run influxdb_go_clientThe program executes the
main()function that writes the data and prints the query results to the console.
{{% /influxdb/custom-timestamps %}}
{{% /tab-content %}} {{% tab-content %}}
{{% influxdb/custom-timestamps %}}
-
In the
influxdb_csharp_clientdirectory you created in the Write data section, create a new file namedQuery.cs. -
In
Query.cs, enter the following sample code:// Query.cs using System; using System.Threading.Tasks; using InfluxDB3.Client; using InfluxDB3.Client.Query; namespace InfluxDBv3; public class Query { /** * Queries an InfluxDB database using the C# .NET client * library. **/ public static async Task QuerySQL() { /** Set InfluxDB credentials **/ const string hostUrl = "https://cluster-id.influxdb.io"; string? database = "get-started"; /** INFLUX_TOKEN is an environment variable you assigned to your * API token value. **/ string? authToken = System.Environment .GetEnvironmentVariable("INFLUX_TOKEN"); /** * Instantiate the InfluxDB client with credentials. **/ using var client = new InfluxDBClient( hostUrl, authToken: authToken, database: database); const string sql = @" SELECT time, room, temp, hum, co FROM home WHERE time >= '2022-01-02T08:00:00Z' AND time <= '2022-01-02T20:00:00Z' "; Console.WriteLine("{0,-30}{1,-15}{2,-15}{3,-15}{4,-15}", "time", "room", "co", "hum", "temp"); await foreach (var row in client.Query(query: sql)) { { /** * Iterate over rows and print column values in table format. * Format the timestamp as sortable UTC format. */ Console.WriteLine("{0,-30:u}{1,-15}{4,-15}{3,-15}{2,-15}", row[0], row[1], row[2], row[3], row[4]); } } Console.WriteLine(); } }The sample code does the following:
-
Imports the following classes:
SystemSystem.Threading.Tasks;InfluxDB3.Client;InfluxDB3.Client.Query;
-
Defines a
Queryclass with aQuerySQL()method that does the following:-
Calls the
new InfluxDBClient()constructor to instantiate a client configured with InfluxDB credentials.hostURL: your {{% cloud-name %}} cluster URL.authToken: a database token with read access to the specified database. For security reasons, we recommend setting this as an environment variable rather than including the raw token string.database: the name of the {{% cloud-name %}} database to query
-
Defines a string variable for the SQL query.
-
Calls the
InfluxDBClient.Query()method to send the query request with the SQL string.Query()returns batches of rows from the response stream as a two-dimensional array--an array of rows in which each row is an array of values. -
Iterates over rows and prints the data in table format to stdout.
-
-
-
In your editor, open the
Program.csfile you created in the Write data section and insert code to call theQuery()function--for example:// Program.cs using System; using System.Threading.Tasks; namespace InfluxDBv3; public class Program { public static async Task Main() { await Write.WriteLineProtocol(); await Query.QuerySQL(); } } -
To execute the program and query your {{% cloud-name %}} cluster, enter the following commands in your terminal:
dotnet builddotnet run
{{% /influxdb/custom-timestamps %}}
{{% /tab-content %}} {{< /tabs-wrapper >}}
Query results
{{< expand-wrapper >}} {{% expand "View query results" %}}
{{% influxdb/custom-timestamps %}}
| time | room | co | hum | temp |
|---|---|---|---|---|
| 2022-01-01T08:00:00Z | Kitchen | 0 | 35.9 | 21 |
| 2022-01-01T09:00:00Z | Kitchen | 0 | 36.2 | 23 |
| 2022-01-01T10:00:00Z | Kitchen | 0 | 36.1 | 22.7 |
| 2022-01-01T11:00:00Z | Kitchen | 0 | 36 | 22.4 |
| 2022-01-01T12:00:00Z | Kitchen | 0 | 36 | 22.5 |
| 2022-01-01T13:00:00Z | Kitchen | 1 | 36.5 | 22.8 |
| 2022-01-01T14:00:00Z | Kitchen | 1 | 36.3 | 22.8 |
| 2022-01-01T15:00:00Z | Kitchen | 3 | 36.2 | 22.7 |
| 2022-01-01T16:00:00Z | Kitchen | 7 | 36 | 22.4 |
| 2022-01-01T17:00:00Z | Kitchen | 9 | 36 | 22.7 |
| 2022-01-01T18:00:00Z | Kitchen | 18 | 36.9 | 23.3 |
| 2022-01-01T19:00:00Z | Kitchen | 22 | 36.6 | 23.1 |
| 2022-01-01T20:00:00Z | Kitchen | 26 | 36.5 | 22.7 |
| 2022-01-01T08:00:00Z | Living Room | 0 | 35.9 | 21.1 |
| 2022-01-01T09:00:00Z | Living Room | 0 | 35.9 | 21.4 |
| 2022-01-01T10:00:00Z | Living Room | 0 | 36 | 21.8 |
| 2022-01-01T11:00:00Z | Living Room | 0 | 36 | 22.2 |
| 2022-01-01T12:00:00Z | Living Room | 0 | 35.9 | 22.2 |
| 2022-01-01T13:00:00Z | Living Room | 0 | 36 | 22.4 |
| 2022-01-01T14:00:00Z | Living Room | 0 | 36.1 | 22.3 |
| 2022-01-01T15:00:00Z | Living Room | 1 | 36.1 | 22.3 |
| 2022-01-01T16:00:00Z | Living Room | 4 | 36 | 22.4 |
| 2022-01-01T17:00:00Z | Living Room | 5 | 35.9 | 22.6 |
| 2022-01-01T18:00:00Z | Living Room | 9 | 36.2 | 22.8 |
| 2022-01-01T19:00:00Z | Living Room | 14 | 36.3 | 22.5 |
| 2022-01-01T20:00:00Z | Living Room | 17 | 36.4 | 22.2 |
| {{% /influxdb/custom-timestamps %}} |
{{% /expand %}} {{< /expand-wrapper >}}
Congratulations! You've learned the basics of querying data in InfluxDB with SQL. For a deep dive into all the ways you can query {{% cloud-name %}}, see the Query data in InfluxDB section of documentation.
{{< page-nav prev="/influxdb/cloud-dedicated/get-started/write/" keepTab=true >}}