Skip to content

Latest commit

 

History

History
420 lines (326 loc) · 13.1 KB

miscellaneous-functions.md

File metadata and controls

420 lines (326 loc) · 13.1 KB
title summary aliases
Miscellaneous Functions
Learn about miscellaneous functions in TiDB.
/docs/dev/functions-and-operators/miscellaneous-functions/
/docs/dev/reference/sql/functions-and-operators/miscellaneous-functions/

Miscellaneous Functions

TiDB supports most of the miscellaneous functions available in MySQL 8.0.

Supported functions

Name Description
ANY_VALUE() Suppress ONLY_FULL_GROUP_BY value rejection
BIN_TO_UUID() Convert UUID from binary format to text format
DEFAULT() Returns the default value for a table column
GROUPING() Modifier for GROUP BY operations
INET_ATON() Return the numeric value of an IP address
INET_NTOA() Return the IP address from a numeric value
INET6_ATON() Return the numeric value of an IPv6 address
INET6_NTOA() Return the IPv6 address from a numeric value
IS_IPV4() Whether argument is an IPv4 address
IS_IPV4_COMPAT() Whether argument is an IPv4-compatible address
IS_IPV4_MAPPED() Whether argument is an IPv4-mapped address
IS_IPV6() Whether argument is an IPv6 address
IS_UUID() Whether argument is an UUID
NAME_CONST() Can be used to rename a column name
SLEEP() Sleep for a number of seconds. Note that for TiDB Cloud Serverless clusters, the SLEEP() function has a limitation wherein it can only support a maximum sleep time of 300 seconds.
UUID() Return a Universal Unique Identifier (UUID)
UUID_TO_BIN() Convert UUID from text format to binary format
VALUES() Defines the values to be used during an INSERT

ANY_VALUE()

The ANY_VALUE() function returns any value from a group of values. Typically, it is used in scenarios where you need to include non-aggregated columns in your SELECT statement along with a GROUP BY clause.

CREATE TABLE fruits (id INT PRIMARY KEY, name VARCHAR(255));
Query OK, 0 rows affected (0.14 sec)

INSERT INTO fruits VALUES (1,'apple'),(2,'apple'),(3,'pear'),(4,'banana'),(5, 'pineapple');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

SELECT id,name FROM fruits GROUP BY name;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.fruits.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SELECT ANY_VALUE(id),GROUP_CONCAT(id),name FROM fruits GROUP BY name;
+---------------+------------------+-----------+
| ANY_VALUE(id) | GROUP_CONCAT(id) | name      |
+---------------+------------------+-----------+
|             1 | 1,2              | apple     |
|             3 | 3                | pear      |
|             4 | 4                | banana    |
|             5 | 5                | pineapple |
+---------------+------------------+-----------+
4 rows in set (0.00 sec)

In the preceding example, TiDB returns an error for the first SELECT statement because the id column is non-aggregated and not included in the GROUP BY clause. To address the issue, the second SELECT query uses ANY_VALUE() to get any value from each group and uses GROUP_CONCAT() to concatenate all values of the id column within each group into a single string. This approach enables you to get one value from each group and all values of the group without changing the SQL mode for non-aggregated columns.

BIN_TO_UUID()

BIN_TO_UUID() and UUID_TO_BIN() can be used to convert between a textual format UUID and a binary format. Both functions accept two arguments.

  • The first argument specifies the value to be converted.
  • The second argument (optional) controls the ordering of the fields in the binary format.
SET @a := UUID();
Query OK, 0 rows affected (0.00 sec)

SELECT @a;
+--------------------------------------+
| @a                                   |
+--------------------------------------+
| 9a17b457-eb6d-11ee-bacf-5405db7aad56 |
+--------------------------------------+
1 row in set (0.00 sec)

SELECT UUID_TO_BIN(@a);
+------------------------------------+
| UUID_TO_BIN(@a)                    |
+------------------------------------+
| 0x9A17B457EB6D11EEBACF5405DB7AAD56 |
+------------------------------------+
1 row in set (0.00 sec)

SELECT BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56);
+-------------------------------------------------+
| BIN_TO_UUID(0x9A17B457EB6D11EEBACF5405DB7AAD56) |
+-------------------------------------------------+
| 9a17b457-eb6d-11ee-bacf-5405db7aad56            |
+-------------------------------------------------+
1 row in set (0.00 sec)

SELECT UUID_TO_BIN(@a, 1);
+----------------------------------------+
| UUID_TO_BIN(@a, 1)                     |
+----------------------------------------+
| 0x11EEEB6D9A17B457BACF5405DB7AAD56     |
+----------------------------------------+
1 row in set (0.00 sec)

SELECT BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1);
+----------------------------------------------------+
| BIN_TO_UUID(0x11EEEB6D9A17B457BACF5405DB7AAD56, 1) |
+----------------------------------------------------+
| 9a17b457-eb6d-11ee-bacf-5405db7aad56               |
+----------------------------------------------------+
1 row in set (0.00 sec)

See also UUID() and Best practices for UUID.

DEFAULT()

The DEFAULT() function is used to get the default value of a column.

CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT DEFAULT 5);
Query OK, 0 rows affected (0.15 sec)

INSERT INTO t1 VALUES (1, 1);
Query OK, 1 row affected (0.01 sec)

UPDATE t1 SET c1=DEFAULT(c1)+3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

TABLE t1;
+----+------+
| id | c1   |
+----+------+
|  1 |    8 |
+----+------+
1 row in set (0.00 sec)

In the preceding example, the UPDATE statement sets the value of the c1 column to the default value of the column (which is 5) plus 3, resulting in a new value of 8.

GROUPING()

See GROUP BY modifiers.

INET_ATON()

The INET_ATON() function converts an IPv4 address in dotted-quad notation into a binary version that can be stored efficiently.

SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+
1 row in set (0.00 sec)

INET_NTOA()

The INET_NTOA() function converts a binary IPv4 address into a dotted-quad notation.

SELECT INET_NTOA(2130706433);
+-----------------------+
| INET_NTOA(2130706433) |
+-----------------------+
| 127.0.0.1             |
+-----------------------+
1 row in set (0.00 sec)

INET6_ATON()

The INET6_ATON() function is similar to INET_ATON(), but INET6_ATON() can also handle IPv6 addresses.

SELECT INET6_ATON('::1');
+--------------------------------------+
| INET6_ATON('::1')                    |
+--------------------------------------+
| 0x00000000000000000000000000000001   |
+--------------------------------------+
1 row in set (0.00 sec)

INET6_NTOA()

The INET6_NTOA() function is similar to INET_NTOA(), but INET6_NTOA() can also handle IPv6 addresses.

SELECT INET6_NTOA(0x00000000000000000000000000000001);
+------------------------------------------------+
| INET6_NTOA(0x00000000000000000000000000000001) |
+------------------------------------------------+
| ::1                                            |
+------------------------------------------------+
1 row in set (0.00 sec)

IS_IPV4()

The IS_IPV4() function tests whether the given argument is an IPv4 address or not.

SELECT IS_IPV4('127.0.0.1');
+----------------------+
| IS_IPV4('127.0.0.1') |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)
SELECT IS_IPV4('300.0.0.1');
+----------------------+
| IS_IPV4('300.0.0.1') |
+----------------------+
|                    0 |
+----------------------+
1 row in set (0.00 sec)

IS_IPV4_COMPAT()

The IS_IPV4_COMPAT() function tests whether the given argument is an IPv4-compatible address.

SELECT IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1'));
+-------------------------------------------+
| IS_IPV4_COMPAT(INET6_ATON('::127.0.0.1')) |
+-------------------------------------------+
|                                         1 |
+-------------------------------------------+
1 row in set (0.00 sec)

IS_IPV4_MAPPED()

The IS_IPV4_MAPPED() function tests whether the given argument is an IPv4-mapped address.

SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1'));
+------------------------------------------------+
| IS_IPV4_MAPPED(INET6_ATON('::ffff:127.0.0.1')) |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+
1 row in set (0.00 sec)

IS_IPV6()

The IS_IPV6() function tests whether the given argument is an IPv6 address.

SELECT IS_IPV6('::1');
+----------------+
| IS_IPV6('::1') |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

IS_UUID()

The IS_UUID() function tests whether the given argument is a UUID.

SELECT IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56');
+-------------------------------------------------+
| IS_UUID('eb48c08c-eb71-11ee-bacf-5405db7aad56') |
+-------------------------------------------------+
|                                               1 |
+-------------------------------------------------+
1 row in set (0.00 sec)

NAME_CONST()

The NAME_CONST() function is used to name columns. It is recommended to use column aliases instead.

SELECT NAME_CONST('column name', 'value') UNION ALL SELECT 'another value';
+---------------+
| column name   |
+---------------+
| another value |
| value         |
+---------------+
2 rows in set (0.00 sec)

The preceding statement uses NAME_CONST() and the following statement uses the recommended way of aliasing columns.

SELECT 'value' AS 'column name' UNION ALL SELECT 'another value';
+---------------+
| column name   |
+---------------+
| value         |
| another value |
+---------------+
2 rows in set (0.00 sec)

SLEEP()

The SLEEP() function is used to pause the execution of queries for a specified number of seconds.

SELECT SLEEP(1.5);
+------------+
| SLEEP(1.5) |
+------------+
|          0 |
+------------+
1 row in set (1.50 sec)

UUID()

The UUID() function returns a universally unique identifier (UUID) version 1 as defined in RFC 4122.

SELECT UUID();
+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| cb4d5ae6-eb6b-11ee-bacf-5405db7aad56 |
+--------------------------------------+
1 row in set (0.00 sec)

See also Best practices for UUID.

UUID_TO_BIN

See BIN_TO_UUID().

VALUES()

The VALUES(col_name) function is used to reference the value of a specific column in the ON DUPLICATE KEY UPDATE clause of an INSERT statement.

CREATE TABLE t1 (id INT PRIMARY KEY, c1 INT);
Query OK, 0 rows affected (0.17 sec)

INSERT INTO t1 VALUES (1,51),(2,52),(3,53),(4,54),(5,55);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

INSERT INTO t1 VALUES(2,22),(4,44) ON DUPLICATE KEY UPDATE c1=VALUES(id)+100;
Query OK, 4 rows affected (0.01 sec)
Records: 2  Duplicates: 2  Warnings: 0

TABLE t1;
+----+------+
| id | c1   |
+----+------+
|  1 |   51 |
|  2 |  102 |
|  3 |   53 |
|  4 |  104 |
|  5 |   55 |
+----+------+
5 rows in set (0.00 sec)

Unsupported functions

Name Description
UUID_SHORT() Provides a UUID that is unique given certain assumptions not present in TiDB TiDB #4620