1 | SELECT * |
1 | SELECT * |
1 | SELECT * |
1 | SELECT * FROM users |
1 | SELECT * |
UNION 会去重,UNION ALL 不会,性能更高,适合递归查询。
将两个或多个查询的结果拼接在一起(不去重)。
例子:把 employees 和 managers 中的所有 name 合并(包括重复项)。
id | name |
---|---|
1 | Bob |
2 | David |
id | name |
---|---|
1 | Bob |
2 | David |
结果
name | |
---|---|
Alice | |
Bob | |
Charlie | |
Bob | ← 重复出现 |
David |
1 | SELECT name FROM employees |
将结果按照某个字段“分组”,通常配合聚合函数使用(如 COUNT()、SUM() 等)。
例子
id | user_id | org_id |
---|---|---|
a1 | u1 | o1 |
a2 | u1 | o2 |
a3 | u2 | o1 |
a4 | u3 | o3 |
a5 | u1 | o3 |
结果
user_id | org_count |
---|---|
u1 | 3 |
u2 | 1 |
u3 | 1 |
1 | SELECT user_id, COUNT(*) as org_count |
1 | SELECT id AS userId FROM user; |
用于 递归查询 的关键语法,主要用于处理 树状结构 或 图状结构 数据, 可以从某个节点往下找子节点,或从某个节点往上找父节点,直到找完为止。
例子
id | name | parent_id |
---|---|---|
1 | 总公司 | NULL |
2 | 技术部 | 1 |
3 | 前端组 | 2 |
4 | 后端组 | 2 |
5 | 产品部 | 1 |
6 | 设计组 | 5 |
7 | 交互组 | 5 |
结果:从 技术部(id=2) 向下,查出其所有子部门(包括子孙)
id | name | parent_id |
---|---|---|
2 | 技术部 | 1 |
3 | 前端组 | 2 |
4 | 后端组 | 2 |
1 | WITH RECURSIVE org_tree AS ( |
id | name | parent_id |
---|---|---|
3 | 前端组 | 2 |
2 | 技术部 | 1 |
1 | 总公司 | NULL |
1 | WITH RECURSIVE parent_chain AS ( |
1 | ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time DESC) |
1 | -- 聚合(GROUP BY 后只保留一条记录) |