Functions
The functions below behave as in MySQL and MariaDB unless a note says otherwise. Names are not case-sensitive.
Aggregate functions
| Function | Notes |
|---|---|
COUNT(*), COUNT([DISTINCT] x) | |
SUM(x), AVG(x), MIN(x), MAX(x) | |
GROUP_CONCAT([DISTINCT] x [ORDER BY ...] [SEPARATOR 's']) | STRING_AGG(x, 's' [ORDER BY ...]) also works |
JSON_ARRAYAGG(x [ORDER BY ...]), JSON_OBJECTAGG(k, v) | |
STD, STDDEV, STDDEV_POP, STDDEV_SAMP, VARIANCE, VAR_POP, VAR_SAMP | no DISTINCT |
BIT_AND, BIT_OR, BIT_XOR | |
ANY_VALUE(x) | |
ARG_MAX(value, by), ARG_MIN(value, by), MAX_BY, MIN_BY | the value of the row with the largest or smallest by |
BOOL_AND(cond), EVERY(cond), BOOL_OR(cond) |
Any aggregate takes FILTER (WHERE cond): SUM(amount) FILTER (WHERE status = 'paid').
Window functions
ROW_NUMBER, RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, NTILE(n), LAG, LEAD, FIRST_VALUE, LAST_VALUE, NTH_VALUE, and SUM, AVG, COUNT, MIN, MAX with OVER.
SELECT customer, amount,
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY trans_date DESC) AS rn,
SUM(amount) OVER (PARTITION BY customer ORDER BY trans_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running
FROM sales;
Frames take ROWS or RANGE with UNBOUNDED PRECEDING, n PRECEDING, CURRENT ROW, n FOLLOWING and UNBOUNDED FOLLOWING. Named windows work: OVER w ... WINDOW w AS (...). Window functions are not allowed in WHERE, GROUP BY, HAVING or ON.
String
CONCAT, CONCAT_WS, LENGTH, CHAR_LENGTH, CHARACTER_LENGTH, OCTET_LENGTH, BIT_LENGTH, UPPER, UCASE, LOWER, LCASE, TRIM([LEADING | TRAILING | BOTH] x FROM s), LTRIM, RTRIM, SUBSTRING / SUBSTR / MID (also FROM ... FOR), LEFT, RIGHT, LPAD, RPAD, REPLACE, INSERT, REVERSE, REPEAT, SPACE, LOCATE, INSTR, POSITION(x IN s), SUBSTRING_INDEX, FIELD, FIND_IN_SET, MAKE_SET, ELT, ASCII, ORD, CHAR, CHR, HEX, UNHEX, BIN, OCT, CONV, STRCMP, FORMAT, QUOTE, SOUNDEX, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR.
Numeric
ABS, ROUND, TRUNCATE, TRUNC, FLOOR, CEIL, CEILING, SIGN, MOD, POW, POWER, SQRT, EXP, LN, LOG, LOG2, LOG10, PI, SIN, COS, TAN, COT, ASIN, ACOS, ATAN, ATAN2, DEGREES, RADIANS, GREATEST, LEAST, RAND, BIT_COUNT, CRC32.
ROUND of a DOUBLE rounds the value as written; see Support and differences.
Date and time
| Group | Functions |
|---|---|
| Now | NOW, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, SYSDATE, CURDATE, CURRENT_DATE, CURTIME, CURRENT_TIME, UTC_TIMESTAMP, UTC_DATE, UTC_TIME |
| Parts | YEAR, QUARTER, MONTH, MONTHNAME, WEEK, WEEKOFYEAR, YEARWEEK, DAY, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAYNAME, WEEKDAY, HOUR, MINUTE, SECOND, MICROSECOND, EXTRACT(unit FROM d), DATE, TIME, LAST_DAY |
| Arithmetic | DATE_ADD, DATE_SUB, ADDDATE, SUBDATE, ADDTIME, SUBTIME, DATEDIFF, TIMEDIFF, TIMESTAMPDIFF, TIMESTAMPADD, PERIOD_ADD, PERIOD_DIFF, d + INTERVAL n unit |
| Conversion | DATE_FORMAT, TIME_FORMAT, STR_TO_DATE, UNIX_TIMESTAMP, FROM_UNIXTIME, TO_DAYS, FROM_DAYS, TO_SECONDS, TIME_TO_SEC, SEC_TO_TIME, MAKEDATE, MAKETIME, CONVERT_TZ |
EXTRACT takes YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND and YEAR_MONTH.
Conditional and null handling
IF(cond, a, b), CASE ... END, IFNULL, NVL, COALESCE, NULLIF, ISNULL, INTERVAL(n, n1, n2, ...).
Conversion
CAST(x AS type), CONVERT(x, type), CONVERT(x USING charset), x::type, BINARY x.
CAST targets: SIGNED, UNSIGNED, INTEGER, DECIMAL(p,s), DOUBLE, FLOAT, REAL, CHAR(n), BINARY(n), DATE, DATETIME, TIME.
JSON
JSON_EXTRACT, JSON_UNQUOTE, JSON_VALUE, JSON_QUERY, JSON_OBJECT, JSON_ARRAY, JSON_SET, JSON_INSERT, JSON_REPLACE, JSON_REMOVE, JSON_ARRAY_APPEND, JSON_ARRAY_INSERT, JSON_MERGE, JSON_MERGE_PRESERVE, JSON_MERGE_PATCH, JSON_CONTAINS, JSON_CONTAINS_PATH, JSON_EXISTS, JSON_SEARCH, JSON_KEYS, JSON_LENGTH, JSON_DEPTH, JSON_TYPE, JSON_VALID, JSON_QUOTE, JSON_PRETTY, JSON_DETAILED, JSON_COMPACT, JSON_LOOSE.
doc->'$.path' is JSON_EXTRACT(doc, '$.path'); doc->>'$.path' also unquotes the result.
Hashing and encoding
MD5, SHA, SHA1, SHA2(s, bits), TO_BASE64, FROM_BASE64, AES_ENCRYPT, AES_DECRYPT (the default aes-128-ecb only), ENCODE, DECODE, COMPRESS, UNCOMPRESS, UNCOMPRESSED_LENGTH, RANDOM_BYTES, UUID.
Network
INET_ATON, INET_NTOA, IS_IPV4, IS_IPV6.
Geometry
WKT text in, WKT text out: ST_GEOMFROMTEXT, ST_POINTFROMTEXT, ST_LINESTRINGFROMTEXT, ST_POLYGONFROMTEXT, ST_ASTEXT, ST_ASWKT, POINT(x, y), ST_X, ST_Y, ST_LATITUDE, ST_LONGITUDE, ST_GEOMETRYTYPE, ST_SRID, ST_DISTANCE, ST_DISTANCE_SPHERE, ST_CONTAINS, ST_WITHIN, MBRCONTAINS, MBRWITHIN.
Full-text search
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST ('replica lag' IN NATURAL LANGUAGE MODE);
IN BOOLEAN MODE and WITH QUERY EXPANSION are accepted.
Session and server
DATABASE, SCHEMA, VERSION, USER, CURRENT_USER, SESSION_USER, SYSTEM_USER, CONNECTION_ID, LAST_INSERT_ID, FOUND_ROWS, ROW_COUNT, CHARSET, COLLATION, BENCHMARK, SLEEP, VALUES(col), DEFAULT(col), NAME_CONST.
Named locks: GET_LOCK, RELEASE_LOCK, RELEASE_ALL_LOCKS, IS_FREE_LOCK, IS_USED_LOCK.
ASQL functions
| Function | Returns |
|---|---|
ASQL_CHANGES('t1', 't2', ...) | a token that changes whenever any of the tables is written; reads no rows |
GENERATE_SERIES(start, stop [, step]) | a table of numbers, in FROM (with LATERAL for a per-row series) |
Sequences
| Function | Returns |
|---|---|
NEXTVAL(s), NEXT VALUE FOR s | the sequence's next value |
LASTVAL(s), PREVIOUS VALUE FOR s | the value NEXTVAL last gave this connection, or NULL |
SETVAL(s, n [, is_used [, round]]) | n, after setting the sequence so the next value follows n (is n with is_used = 0); NULL when n is behind the sequence |
ASQL_CHANGES is how a client can tell cheaply whether to run a query again; Grain's live() uses it.
Not available
DATE_TRUNC, TO_CHAR, SPLIT_PART, MEDIAN, PERCENTILE_CONT, PERCENTILE_DISC, LISTAGG, UUID_SHORT and the INET6_ functions return "unknown function".
