Post

SQL Functions Cheatsheet

A comprehensive cheatsheet covering all SQL functions, including Aggregate, String, Math, Date & Time, Comparison & Logical, Window Functions, Type Conversion, Security & Hashing, JSON, NULL Handling, and Common Patterns. Includes inline and table-level syntax, add/drop/modify examples, cross-engine compatibility.

SQL Functions Cheatsheet

1. πŸ“Š SQL Functions Cheatsheet

Grouped by category Β· Common syntax examples Β· Cross-engine compatibility


1.1. Legend

| Symbol | Meaning | |——–|β€”β€”β€”| | βœ… | Supported (same or very similar syntax) | | ⚠️ | Supported with different syntax | | ❌ | Not supported / no direct equivalent |


Here’s your SQL Functions Cheatsheet! It covers 11 categories:

  1. Aggregate β€” COUNT, SUM, AVG, GROUP_CONCAT, STDDEV…
  2. String β€” CONCAT, TRIM, SUBSTRING, REPLACE, LPAD…
  3. Math / Numeric β€” ROUND, FLOOR, CEIL, MOD, RAND, GREATEST…
  4. Date & Time β€” NOW, DATEDIFF, DATE_FORMAT, TIMESTAMPDIFF…
  5. Comparison & Logical β€” BETWEEN, IN, LIKE, COALESCE, CASE, IF…
  6. Window Functions β€” ROW_NUMBER, RANK, LAG, LEAD, NTILE…
  7. Type Conversion β€” CAST, HEX, ASCII, TO_BASE64…
  8. Security & Hashing β€” MD5, SHA2, AES_ENCRYPT, UUID…
  9. JSON β€” JSON_EXTRACT, JSON_SET, JSON_ARRAYAGG…
  10. NULL Handling β€” engine-by-engine quick reference
  11. Common Patterns β€” running totals, top-N per group, age calc, pivot aggregation

Each section includes a cross-engine compatibility table for MySQL, SQLite, PostgreSQL, SQL Server, Oracle, and MS Access with βœ… / ⚠️ / ❌ indicators.


1.2. πŸ”’ Aggregate Functions

Operate on a set of rows and return a single summary value.

FunctionDescriptionMySQL Syntax Example
COUNT()Count rowsSELECT COUNT(*) FROM orders;
COUNT(DISTINCT)Count unique valuesSELECT COUNT(DISTINCT customer_id) FROM orders;
SUM()Sum of valuesSELECT SUM(price) FROM products;
AVG()Average valueSELECT AVG(salary) FROM employees;
MIN()Minimum valueSELECT MIN(price) FROM products;
MAX()Maximum valueSELECT MAX(salary) FROM employees;
GROUP_CONCAT()Concatenate group valuesSELECT GROUP_CONCAT(name) FROM employees GROUP BY dept;
STD() / STDDEV()Population std deviationSELECT STDDEV(salary) FROM employees;
VARIANCE()Population varianceSELECT VARIANCE(score) FROM results;

1.2.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
COUNT()βœ…βœ…βœ…βœ…βœ…βœ…
SUM()βœ…βœ…βœ…βœ…βœ…βœ…
AVG()βœ…βœ…βœ…βœ…βœ…βœ…
GROUP_CONCAT()βœ…βœ…βš οΈ STRING_AGG(col, ',')⚠️ STRING_AGG(col, ',')⚠️ LISTAGG(col, ',')❌
STDDEV()βœ…βŒβš οΈ STDDEV_POP()⚠️ STDEV()βœ…βŒ
VARIANCE()βœ…βŒβš οΈ VAR_POP()⚠️ VAR()βœ…βŒ

1.3. πŸ”€ String Functions

Manipulate and analyze text data.

FunctionDescriptionSyntax Example
CONCAT()Join stringsSELECT CONCAT(first_name, ' ', last_name) FROM users;
CONCAT_WS()Join with separatorSELECT CONCAT_WS(', ', city, country) FROM addresses;
LENGTH()Length in bytesSELECT LENGTH(email) FROM users;
CHAR_LENGTH()Length in charactersSELECT CHAR_LENGTH(name) FROM users;
UPPER()UppercaseSELECT UPPER(name) FROM users;
LOWER()LowercaseSELECT LOWER(email) FROM users;
TRIM()Remove leading/trailing spacesSELECT TRIM(' hello ');
LTRIM()Remove leading spacesSELECT LTRIM(' hello');
RTRIM()Remove trailing spacesSELECT RTRIM('hello ');
SUBSTRING()Extract part of stringSELECT SUBSTRING(phone, 1, 3) FROM users;
LEFT()Leftmost N charactersSELECT LEFT(name, 5) FROM users;
RIGHT()Rightmost N charactersSELECT RIGHT(code, 4) FROM products;
REPLACE()Replace occurrencesSELECT REPLACE(phone, '-', '') FROM users;
INSTR()Position of substringSELECT INSTR(email, '@') FROM users;
LOCATE()Position of first occurrenceSELECT LOCATE('@', email) FROM users;
LPAD()Left-pad stringSELECT LPAD(id, 6, '0') FROM orders;
RPAD()Right-pad stringSELECT RPAD(name, 20, '.') FROM products;
REVERSE()Reverse stringSELECT REVERSE(name) FROM users;
REPEAT()Repeat string N timesSELECT REPEAT('*', 5);
FORMAT()Format number as stringSELECT FORMAT(price, 2) FROM products;
STRCMP()Compare two stringsSELECT STRCMP('abc', 'abd');
SOUNDEX()Phonetic encodingSELECT SOUNDEX('Robert');

1.3.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
CONCAT()βœ…βš οΈ Use || operatorβœ…βœ…βœ…βš οΈ & operator
LENGTH()βœ…βœ…βš οΈ CHAR_LENGTH() for chars⚠️ LEN()βœ… bytes only⚠️ LEN()
SUBSTRING()βœ…βœ… SUBSTR()βœ…βœ…βœ… SUBSTR()⚠️ MID()
INSTR()βœ…βœ…βš οΈ POSITION()⚠️ CHARINDEX()βœ…βš οΈ InStr()
LPAD() / RPAD()βœ…βŒβœ…βŒβœ…βŒ
REPLACE()βœ…βœ…βœ…βœ…βœ…βœ…
TRIM()βœ…βœ…βœ…βœ…βœ…βœ…
SOUNDEX()βœ…βŒβœ…βœ…βœ…βœ…
FORMAT()βœ…βŒβš οΈ TO_CHAR()⚠️ FORMAT()⚠️ TO_CHAR()⚠️ Format()

1.4. πŸ”’ Math / Numeric Functions

Perform calculations on numeric data.

FunctionDescriptionSyntax Example
ABS()Absolute valueSELECT ABS(-42); β†’ 42
ROUND()Round to N decimalsSELECT ROUND(3.14159, 2); β†’ 3.14
CEIL() / CEILING()Round upSELECT CEIL(4.1); β†’ 5
FLOOR()Round downSELECT FLOOR(4.9); β†’ 4
TRUNCATE()Truncate decimalsSELECT TRUNCATE(3.999, 1); β†’ 3.9
MOD() / %Modulo (remainder)SELECT MOD(10, 3); β†’ 1
POWER() / POW()Raise to powerSELECT POW(2, 8); β†’ 256
SQRT()Square rootSELECT SQRT(144); β†’ 12
EXP()e raised to powerSELECT EXP(1); β†’ 2.718...
LN()Natural logarithmSELECT LN(2.718);
LOG()Natural log / log base NSELECT LOG(100);
LOG2()Base-2 logarithmSELECT LOG2(8); β†’ 3
LOG10()Base-10 logarithmSELECT LOG10(1000); β†’ 3
PI()Value of Ο€SELECT PI(); β†’ 3.14159...
RAND()Random float 0–1SELECT RAND();
SIGN()Sign of number (-1, 0, 1)SELECT SIGN(-50); β†’ -1
GREATEST()Largest of argumentsSELECT GREATEST(3, 7, 2); β†’ 7
LEAST()Smallest of argumentsSELECT LEAST(3, 7, 2); β†’ 2
DIVInteger divisionSELECT 17 DIV 5; β†’ 3

1.4.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
ABS()βœ…βœ…βœ…βœ…βœ…βœ…
ROUND()βœ…βœ…βœ…βœ…βœ…βœ…
CEIL()βœ…βŒβœ…βš οΈ CEILING()βœ…βŒ
FLOOR()βœ…βŒβœ…βœ…βœ…βŒ
TRUNCATE()βœ…βŒβš οΈ TRUNC()❌⚠️ TRUNC()❌
MOD()βœ…βš οΈ % onlyβœ…βš οΈ % onlyβœ…βš οΈ MOD()
RAND()βœ…βŒβš οΈ RANDOM()βœ…βš οΈ DBMS_RANDOM.VALUE⚠️ Rnd()
GREATEST()βœ…βŒβœ…βŒβœ…βŒ
LEAST()βœ…βŒβœ…βŒβœ…βŒ
LOG()βœ…βœ…βœ…βš οΈ base-10 defaultβœ…βŒ

1.5. πŸ“… Date & Time Functions

Work with date and time values.

FunctionDescriptionSyntax Example
NOW()Current date and timeSELECT NOW(); β†’ 2025-02-26 14:30:00
CURDATE()Current date onlySELECT CURDATE(); β†’ 2025-02-26
CURTIME()Current time onlySELECT CURTIME(); β†’ 14:30:00
DATE()Extract date from datetimeSELECT DATE(created_at) FROM orders;
TIME()Extract time from datetimeSELECT TIME(created_at) FROM orders;
YEAR()Extract yearSELECT YEAR(birth_date) FROM users;
MONTH()Extract month (1–12)SELECT MONTH(order_date) FROM orders;
DAY()Extract day of monthSELECT DAY(invoice_date) FROM invoices;
HOUR()Extract hourSELECT HOUR(login_time) FROM sessions;
MINUTE()Extract minuteSELECT MINUTE(login_time) FROM sessions;
SECOND()Extract secondSELECT SECOND(login_time) FROM sessions;
DAYNAME()Day name (Monday…)SELECT DAYNAME(order_date) FROM orders;
MONTHNAME()Month name (January…)SELECT MONTHNAME(order_date) FROM orders;
DAYOFWEEK()Day index (1=Sun)SELECT DAYOFWEEK(order_date) FROM orders;
WEEK()Week numberSELECT WEEK(order_date) FROM orders;
DATE_FORMAT()Format a dateSELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
DATE_ADD()Add interval to dateSELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
DATE_SUB()Subtract interval from dateSELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
DATEDIFF()Days between two datesSELECT DATEDIFF('2025-12-31', '2025-01-01'); β†’ 364
TIMESTAMPDIFF()Difference in specified unitSELECT TIMESTAMPDIFF(YEAR, birth_date, NOW()) AS age FROM users;
STR_TO_DATE()Parse string to dateSELECT STR_TO_DATE('26/02/2025', '%d/%m/%Y');
UNIX_TIMESTAMP()Date to Unix epochSELECT UNIX_TIMESTAMP(NOW());
FROM_UNIXTIME()Unix epoch to datetimeSELECT FROM_UNIXTIME(1708905600);
LAST_DAY()Last day of the monthSELECT LAST_DAY('2025-02-01'); β†’ 2025-02-28

1.5.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
NOW()βœ…βš οΈ datetime('now')βœ…βš οΈ GETDATE()⚠️ SYSDATE⚠️ Now()
CURDATE()βœ…βš οΈ date('now')⚠️ CURRENT_DATE⚠️ CAST(GETDATE() AS DATE)⚠️ TRUNC(SYSDATE)⚠️ Date()
DATE_FORMAT()βœ…βš οΈ strftime('%Y-%m-%d', col)⚠️ TO_CHAR(col, 'YYYY-MM-DD')⚠️ FORMAT(col, 'yyyy-MM-dd')⚠️ TO_CHAR()⚠️ Format()
DATEDIFF()βœ…βš οΈ julianday(d1) - julianday(d2)⚠️ col1 - col2 (returns interval)βœ… different arg order⚠️ col1 - col2⚠️ DateDiff()
DATE_ADD()βœ…βš οΈ datetime(col, '+7 days')⚠️ col + INTERVAL '7 days'⚠️ DATEADD(day, 7, col)⚠️ col + 7⚠️ DateAdd()
YEAR() / MONTH() / DAY()βœ…βš οΈ strftime('%Y', col)⚠️ EXTRACT(YEAR FROM col)βœ…βš οΈ EXTRACT(YEAR FROM col)⚠️ Year()
UNIX_TIMESTAMP()βœ…βš οΈ strftime('%s', col)⚠️ EXTRACT(EPOCH FROM col)⚠️ DATEDIFF(s,'1970-01-01',col)❌ complex❌

1.6. βš–οΈ Comparison & Logical Operators

Filter and evaluate conditions.

Operator / FunctionDescriptionSyntax Example
=EqualWHERE status = 'active'
<> / !=Not equalWHERE status <> 'deleted'
>, <, >=, <=Numeric comparisonsWHERE salary >= 50000
<=>NULL-safe equalWHERE col1 <=> col2
BETWEEN ... AND ...Range checkWHERE price BETWEEN 10 AND 50
IN()Value in a listWHERE country IN ('US', 'UK', 'CA')
NOT IN()Value not in a listWHERE status NOT IN ('deleted', 'banned')
LIKEPattern match (% wildcard)WHERE name LIKE 'John%'
NOT LIKEPattern non-matchWHERE email NOT LIKE '%@spam.com'
IS NULLNULL checkWHERE phone IS NULL
IS NOT NULLNon-NULL checkWHERE email IS NOT NULL
AND / &&Logical ANDWHERE age > 18 AND active = 1
ORLogical ORWHERE role = 'admin' OR role = 'mod'
NOT / !Logical NOTWHERE NOT deleted
COALESCE()First non-NULL valueSELECT COALESCE(phone, email, 'N/A') FROM users;
NULLIF()Returns NULL if equalSELECT NULLIF(score, 0) FROM results;
IF()Inline if/elseSELECT IF(score >= 50, 'Pass', 'Fail') FROM results;
IFNULL()Replace NULLSELECT IFNULL(phone, 'Unknown') FROM users;
CASEMulti-condition logicSee below

CASE example:

1
2
3
4
5
6
7
8
SELECT name,
  CASE
    WHEN score >= 90 THEN 'A'
    WHEN score >= 75 THEN 'B'
    WHEN score >= 60 THEN 'C'
    ELSE 'F'
  END AS grade
FROM students;

1.6.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
BETWEEN / IN / LIKEβœ…βœ…βœ…βœ…βœ…βœ…
COALESCE()βœ…βœ…βœ…βœ…βœ…βœ…
CASEβœ…βœ…βœ…βœ…βœ…βœ…
IF()βœ…βŒβŒ use CASE❌❌⚠️ IIF()
IFNULL()βœ…βœ…βš οΈ COALESCE()⚠️ ISNULL()⚠️ NVL()⚠️ Nz()
NULLIF()βœ…βœ…βœ…βœ…βœ…βŒ
<=> NULL-safe equalβœ…βŒβš οΈ IS NOT DISTINCT FROM❌❌❌

1.7. πŸͺŸ Window Functions

Calculations across a set of rows related to the current row β€” no GROUP BY collapse.

FunctionDescriptionSyntax Example
ROW_NUMBER()Sequential row numberSELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn FROM employees;
RANK()Rank with gapsSELECT RANK() OVER (PARTITION BY dept ORDER BY salary DESC) FROM employees;
DENSE_RANK()Rank without gapsSELECT DENSE_RANK() OVER (ORDER BY score DESC) FROM results;
NTILE(n)Divide into N bucketsSELECT NTILE(4) OVER (ORDER BY salary) AS quartile FROM employees;
LAG()Previous row valueSELECT LAG(sales, 1) OVER (ORDER BY month) AS prev_sales FROM revenue;
LEAD()Next row valueSELECT LEAD(sales, 1) OVER (ORDER BY month) AS next_sales FROM revenue;
FIRST_VALUE()First value in windowSELECT FIRST_VALUE(name) OVER (PARTITION BY dept ORDER BY salary DESC) FROM employees;
LAST_VALUE()Last value in windowSELECT LAST_VALUE(name) OVER (PARTITION BY dept ORDER BY salary) FROM employees;
CUME_DIST()Cumulative distributionSELECT CUME_DIST() OVER (ORDER BY salary) FROM employees;
PERCENT_RANK()Relative rank 0–1SELECT PERCENT_RANK() OVER (ORDER BY score) FROM results;

Full example:

1
2
3
4
5
6
7
8
SELECT
  name,
  dept,
  salary,
  RANK()       OVER (PARTITION BY dept ORDER BY salary DESC) AS dept_rank,
  SUM(salary)  OVER (PARTITION BY dept)                      AS dept_total,
  LAG(salary)  OVER (PARTITION BY dept ORDER BY salary DESC) AS prev_salary
FROM employees;

1.7.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
ROW_NUMBER()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ
RANK()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ
DENSE_RANK()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ
LAG() / LEAD()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ
FIRST_VALUE()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ
NTILE()βœ… 8.0+βœ… 3.25+βœ…βœ…βœ…βŒ

1.8. πŸ” Conversion & Type Functions

Cast or convert between data types.

FunctionDescriptionSyntax Example
CAST()Convert to typeSELECT CAST('42' AS UNSIGNED);
CONVERT()Convert value/charsetSELECT CONVERT(price, CHAR);
HEX()To hexadecimalSELECT HEX(255); β†’ FF
UNHEX()From hexadecimalSELECT UNHEX('FF');
BIN()To binary stringSELECT BIN(10); β†’ 1010
OCT()To octal stringSELECT OCT(8); β†’ 10
ASCII()ASCII code of charSELECT ASCII('A'); β†’ 65
CHAR()Char from ASCII codeSELECT CHAR(65); β†’ A
TO_BASE64()Encode base64SELECT TO_BASE64('hello');
FROM_BASE64()Decode base64SELECT FROM_BASE64('aGVsbG8=');

1.8.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracleMS Access
CAST()βœ…βœ…βœ…βœ…βœ…βœ…
CONVERT()βœ…βŒβš οΈ CAST preferredβœ…βŒβŒ
HEX()βœ…βœ…βš οΈ TO_HEX()⚠️ CONVERT(VARBINARY...)⚠️ RAWTOHEX()❌
ASCII()βœ…βœ…βœ…βœ…βœ…βœ…
TO_BASE64()βœ…βŒβš οΈ encode(col,'base64')❌❌❌

1.9. πŸ” Security & Hash Functions

FunctionDescriptionSyntax Example
MD5()MD5 hashSELECT MD5('password');
SHA1()SHA-1 hashSELECT SHA1('password');
SHA2()SHA-2 (224/256/384/512)SELECT SHA2('password', 256);
AES_ENCRYPT()AES encryptionSELECT AES_ENCRYPT('secret', 'key');
AES_DECRYPT()AES decryptionSELECT AES_DECRYPT(ciphertext, 'key');
UUID()Generate UUIDSELECT UUID(); β†’ 550e8400-e29b-41d4-a716...

1.9.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracle
MD5()βœ…βŒβœ…βš οΈ HASHBYTES('MD5', col)❌
SHA2()βœ…βŒβš οΈ digest(col,'sha256') pgcrypto⚠️ HASHBYTES('SHA2_256', col)❌
UUID()βœ…βŒβš οΈ gen_random_uuid()⚠️ NEWID()⚠️ SYS_GUID()

1.10. πŸ“‹ JSON Functions (MySQL 5.7+)

FunctionDescriptionSyntax Example
JSON_EXTRACT()Extract value by pathSELECT JSON_EXTRACT(data, '$.name') FROM users;
->Shorthand for JSON_EXTRACTSELECT data->'$.name' FROM users;
->>Extract + unquote resultSELECT data->>'$.name' FROM users;
JSON_OBJECT()Create JSON objectSELECT JSON_OBJECT('name', name, 'age', age) FROM users;
JSON_ARRAY()Create JSON arraySELECT JSON_ARRAY(1, 2, 3);
JSON_SET()Insert or update pathUPDATE t SET data = JSON_SET(data, '$.age', 30);
JSON_REMOVE()Remove a pathUPDATE t SET data = JSON_REMOVE(data, '$.temp');
JSON_CONTAINS()Check if value exists at pathSELECT JSON_CONTAINS(data, '"admin"', '$.role') FROM users;
JSON_ARRAYAGG()Aggregate rows as JSON arraySELECT JSON_ARRAYAGG(name) FROM employees GROUP BY dept;
JSON_VALID()Validate JSONSELECT JSON_VALID('{"a":1}'); β†’ 1

1.10.1. Cross-Engine Compatibility

FunctionMySQLSQLitePostgreSQLSQL ServerOracle
JSON_EXTRACT()βœ…βœ… json_extract()⚠️ ->> operator⚠️ JSON_VALUE()⚠️ JSON_VALUE()
JSON_OBJECT()βœ…βœ… json_object()⚠️ json_build_object()⚠️ FOR JSON PATHβœ…
JSON_ARRAYAGG()βœ… 8.0+❌⚠️ JSON_AGG()⚠️ FOR JSON PATHβœ… 12c+
JSON_VALID()βœ…βœ… json_valid()⚠️ try casting⚠️ ISJSON()βœ… 12c+

1.11. ⚑ NULL Handling β€” Quick Reference

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Replace NULL with a default value
SELECT COALESCE(phone, 'N/A')    FROM users;   -- All engines βœ…
SELECT IFNULL(phone, 'N/A')      FROM users;   -- MySQL, SQLite
SELECT ISNULL(phone, 'N/A')      FROM users;   -- SQL Server
SELECT NVL(phone, 'N/A')         FROM users;   -- Oracle
SELECT IIF(phone IS NULL, 'N/A', phone) FROM users; -- MS Access

-- Return NULL when two values are equal (avoid division by zero etc.)
SELECT NULLIF(score, 0) FROM results;   -- MySQL, PostgreSQL, SQL Server, SQLite

-- NULL-safe equality (never use = with NULLs!)
WHERE col IS NULL                        -- All engines βœ…
WHERE col <=> NULL                       -- MySQL only
WHERE col IS NOT DISTINCT FROM NULL      -- PostgreSQL

1.12. πŸ“ Useful Patterns

1.12.1. Age Calculation

1
2
3
4
5
6
7
8
9
10
11
-- MySQL
SELECT TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM users;

-- SQL Server
SELECT DATEDIFF(YEAR, birth_date, GETDATE()) AS age FROM users;

-- PostgreSQL
SELECT DATE_PART('year', AGE(birth_date)) AS age FROM users;

-- SQLite
SELECT (strftime('%Y','now') - strftime('%Y', birth_date)) AS age FROM users;

1.12.2. Running Total

1
2
3
4
5
6
7
8
SELECT
  order_date,
  amount,
  SUM(amount) OVER (
    ORDER BY order_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM orders;

1.12.3. Top N Per Group

1
2
3
4
5
6
SELECT * FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
  FROM employees
) ranked
WHERE rn <= 3;

1.12.4. Conditional Aggregation (Pivot-style)

1
2
3
4
5
6
SELECT
  dept,
  SUM(CASE WHEN gender = 'M' THEN salary END) AS male_total,
  SUM(CASE WHEN gender = 'F' THEN salary END) AS female_total
FROM employees
GROUP BY dept;

1.12.5. Deduplicate β€” Keep Latest Row

1
2
3
4
DELETE FROM orders
WHERE id NOT IN (
  SELECT MAX(id) FROM orders GROUP BY order_ref
);

Based on MySQL 8.x built-in function reference. Version requirements noted where applicable.

This post is licensed under CC BY 4.0 by the author.