目录

Mysql Samples

CASE function

Syntax

1
2
3
4
5
6
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

COALESCE function

Definition and Usage

The COALESCE() function returns the first non-null value in a list.

Syntax

COALESCE(val1, val2, …., val_n)

WITH (Common Table Expressions)

公用表表达式 (CTE) 是一个命名的临时结果集,它存在于单个语句的范围内,稍后可以在该语句中引用,可能会多次引用。

对于逻辑复杂的sql,with可以大大减少临时表的数量,提升代码的可读性、可维护性

Common Table Expressions

1
2
3
4
5
WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;

Recursive Common Table Expressions

A recursive common table expression is one having a subquery that refers to its own name. For example:

1
2
3
4
5
6
7
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;

递归公用表表达式 (CTE) 经常用于序列生成和遍历分层或树结构数据。

递归CTE示例

斐波那契数列生成

1
2
3
4
5
6
7
8
WITH RECURSIVE fibonacci (n, fib_n, next_fib_n) AS
(
  SELECT 1, 0, 1
  UNION ALL
  SELECT n + 1, next_fib_n, fib_n + next_fib_n
    FROM fibonacci WHERE n < 10
)
SELECT * FROM fibonacci;

连续日期

1
2
3
4
5
6
7
8
WITH RECURSIVE dates (date) AS
(
  SELECT MIN(date) FROM sales
  UNION ALL
  SELECT date + INTERVAL 1 DAY FROM dates
  WHERE date + INTERVAL 1 DAY <= (SELECT MAX(date) FROM sales)
)
SELECT * FROM dates;

分层数据遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
WITH RECURSIVE employee_paths (id, name, path) AS
(
  SELECT id, name, CAST(id AS CHAR(200))
    FROM employees
    WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, CONCAT(ep.path, ',', e.id)
    FROM employee_paths AS ep JOIN employees AS e
      ON ep.id = e.manager_id
)
SELECT * FROM employee_paths ORDER BY path;

行列转换

name course grade
zhangsan 语文 80
zhangsan 数学 90
name 语文 数学
zhangsan 80 90
1
2
3
4
select name, 
(case when course = '语文' then grade else 0 end) as 语文,
(case when course = '数学' then grade else 0 end) as 数学
from  test group by name;

如果记录中需要求和可以 sum(case ... end) as xxx

1
2
3
4
select name, 
if(course = '语文', grade, 0) as 语文,
if(course = '数学', grade, 0) as 数学
from  test group by name;