# Redis

### SELECT Statements <a href="#default" id="default"></a>

The Provider for Redis is SQL-92 compliant. Below are some example SELECT statements.

1. Return all columns:<br>

   | `SELECT * FROM Customers` |
   | ------------------------- |
2. Rename a column:<br>

   | `SELECT [CompanyName] AS MY_CompanyName FROM Customers` |
   | ------------------------------------------------------- |
3. Search data:<br>

   | `SELECT * FROM Customers WHERE Country = 'US';` |
   | ----------------------------------------------- |
4. Return the number of items in a group:<br>

   | `SELECT COUNT(*) AS MyCount FROM Customers` |
   | ------------------------------------------- |
5. Return the number of unique items in a group:<br>

   | `SELECT COUNT(DISTINCT CompanyName) FROM Customers` |
   | --------------------------------------------------- |
6. Summarize data:<br>

   | `SELECT CompanyName, MAX(Balance) FROM Customers GROUP BY CompanyName` |
   | ---------------------------------------------------------------------- |
7. &#x20;Retrieve data from multiple tables.<br>

   | `SELECT Restaurants.name, Zips.city FROM Restaurants INNER JOIN Zips ON Restaurants.zipcode = Zips.id` |
   | ------------------------------------------------------------------------------------------------------ |

   See JOIN Queries below for details.
8. Sort a result set in ascending order:<br>

   | `SELECT City, CompanyName FROM Customers ORDER BY CompanyName ASC` |
   | ------------------------------------------------------------------ |
9. Restrict a result set to the specified number of rows:<br>

   | `SELECT City, CompanyName FROM Customers LIMIT 10` |
   | -------------------------------------------------- |
10. Parameterize a query to pass in inputs at execution time. This enables you to create prepared statements and mitigate SQL injection attacks.<br>

    | `SELECT * FROM Customers WHERE Country = @param` |
    | ------------------------------------------------ |

### Aggregate Functions <a href="#default" id="default"></a>

The provider supports SQL-92 summary functions.

#### COUNT <a href="#count" id="count"></a>

Returns the number of rows matching the query criteria.<br>

| `SELECT COUNT(*) FROM Customers WHERE Country = US` |
| --------------------------------------------------- |

#### COUNT\_DISTINCT <a href="#countdistinct" id="countdistinct"></a>

Returns the number of distinct, non-null field values matching the query criteria.<br>

| `SELECT COUNT_DISTINCT(City) AS DistinctValues FROM Customers` |
| -------------------------------------------------------------- |

#### AVG <a href="#avg" id="avg"></a>

Returns the average of the column values.<br>

| `SELECT CompanyName, AVG(Balance) FROM Customers  GROUP BY CompanyName` |
| ----------------------------------------------------------------------- |

#### MIN <a href="#min" id="min"></a>

Returns the minimum column value.<br>

| `SELECT MIN(Balance), CompanyName FROM Customers GROUP BY CompanyName` |
| ---------------------------------------------------------------------- |

#### MAX <a href="#max" id="max"></a>

Returns the maximum column value.<br>

| `SELECT CompanyName, MAX(Balance) FROM Customers GROUP BY CompanyName` |
| ---------------------------------------------------------------------- |

#### SUM <a href="#sum" id="sum"></a>

Returns the total sum of the column values.<br>

| `SELECT SUM(Balance) FROM Customers WHERE Country = US` |
| ------------------------------------------------------- |

#### JOIN Queries <a href="#default" id="default"></a>

The Provider for Redis supports joins of multiple tables.

#### Joining Multiple Tables

You can join multiple tables just like you would in a relational database. Set SupportEnhancedSQL to True to execute these types of joins. The following examples use two tables: Restaurants and Zips.

The query below returns the Restaurant records that exist, if any, for each ZIP code:<br>

| `SELECT z.city, r.name, r.borough, r.cuisine, r.zipcodeFROM Zips zLEFT JOIN Restaurants rON r.zipcode = z._id` |
| -------------------------------------------------------------------------------------------------------------- |

The query below returns records from both tables that match the join condition:<br>

| `SELECT z.city, r.name, r.borough, r.cuisine, r.zipcodeFROM Restaurants rINNER JOIN Zips zON r.zipcode = z._id` |
| --------------------------------------------------------------------------------------------------------------- |

### Date Literal Functions <a href="#default" id="default"></a>

The following date literal functions can be used to filter date fields using relative intervals. Note that while the <, >, and = operators are supported for these functions, <= and >= are not.

#### L\_TODAY() <a href="#ltoday" id="ltoday"></a>

The current day.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_TODAY()` |
| ----------------------------------------------------- |

#### L\_YESTERDAY() <a href="#lyesterday" id="lyesterday"></a>

The previous day.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_YESTERDAY()` |
| --------------------------------------------------------- |

#### L\_TOMORROW() <a href="#ltomorrow" id="ltomorrow"></a>

The following day.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_TOMORROW()` |
| -------------------------------------------------------- |

#### L\_LAST\_WEEK() <a href="#llastweek" id="llastweek"></a>

Every day in the preceding week.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_LAST_WEEK()` |
| --------------------------------------------------------- |

#### L\_THIS\_WEEK() <a href="#lthisweek" id="lthisweek"></a>

Every day in the current week.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_THIS_WEEK()` |
| --------------------------------------------------------- |

#### L\_NEXT\_WEEK() <a href="#lnextweek" id="lnextweek"></a>

Every day in the following week.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_NEXT_WEEK()` |
| --------------------------------------------------------- |

Also available:

* L\_LAST/L\_THIS/L\_NEXT MONTH
* L\_LAST/L\_THIS/L\_NEXT QUARTER
* L\_LAST/L\_THIS/L\_NEXT YEAR

#### L\_LAST\_N\_DAYS(n) <a href="#llastndaysn" id="llastndaysn"></a>

The previous n days, excluding the current day.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_LAST_N_DAYS(3)` |
| ------------------------------------------------------------ |

#### L\_NEXT\_N\_DAYS(n) <a href="#lnextndaysn" id="lnextndaysn"></a>

The following n days, including the current day.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_NEXT_N_DAYS(3)` |
| ------------------------------------------------------------ |

Also available:

* L\_LAST/L\_NEXT\_90\_DAYS

#### L\_LAST\_N\_WEEKS(n) <a href="#llastnweeksn" id="llastnweeksn"></a>

Every day in every week, starting n weeks before current week, and ending in the previous week.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_LAST_N_WEEKS(3)` |
| ------------------------------------------------------------- |

#### L\_NEXT\_N\_WEEKS(n) <a href="#lnextnweeksn" id="lnextnweeksn"></a>

Every day in every week, starting the following week, and ending n weeks in the future.<br>

| `SELECT * FROM MyTable WHERE MyDateField = L_NEXT_N_WEEKS(3)` |
| ------------------------------------------------------------- |

Also available:

* L\_LAST/L\_NEXT\_N\_MONTHS(n)
* L\_LAST/L\_NEXT\_N\_QUARTERS(n)
* L\_LAST/L\_NEXT\_N\_YEARS(n)
