notice
-
要用临时表必须一层一层的来,不能脱离
-
having是对分组后的数据进行过滤,如果不加聚合函数,分组得到的数据默认取的是第一条数据
- having 子句用于筛选已分组的结果集
- having 后面的字段如果是表中现有的列,则这个列必须出现在select后面,否则会报错
-
case when的原理 当一个单元格中有多个数据时,case when只会提取当中的第一个数据
4 单独地使用group by的实际意义并不大,它只能显示出每组记录的第一条记录
在MySQL中,允许下面这样的写法
select id, revenue
from Department
group by id
即在select子句中出现了group by子句中没有出现的列名revenue,而这种写法在SQL标准中是没有的,在MySQL以外的大部分数据库中也是不支持的,因为逻辑上没有意义。
要理解为什么这种写法没有意义,我们来看一看题目本身提供的样例数据。(注意,其中的id并不是真正的id,只是部门编号)
+------+---------+-------+
| id | revenue | month |
+------+---------+-------+
| 1 | 8000 | Jan |
| 2 | 9000 | Jan |
| 3 | 10000 | Feb |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
通过group by id
,该表中的数据被分为三组,即
+------+---------+-------+
| 1 | 8000 | Jan |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
+------+---------+-------+
| 2 | 9000 | Jan |
+------+---------+-------+
+------+---------+-------+
| 3 | 10000 | Feb |
+------+---------+-------+
此时在第一组中,有三条记录,也就是说有三个revenue,那么此时select id, revenue就无法判定应该取哪一个revenue,所以这样的操作在标准SQL中是不允许的,只能通过聚合函数来处理。而MySQL在这里提供了一种便利的方式,却让理解它的工作方式变得更加困难
6.SQL中的递归查询
递归查询原理
SQL Server中的递归查询是通过CTE(表表达式)来实现。至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。
递归查询的终止条件
递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。
递归的常见形式
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
WITH RECURSIVE cte_name (column1, column2, ...) AS (
-- Anchor member (初始查询)
SELECT column1, column2, ...
FROM table_name
WHERE condition
UNION ALL
-- Recursive member (递归查询)
SELECT column1, column2, ...
FROM table_name
JOIN cte_name ON <join_condition>
WHERE condition_for_recursive_member
)
-- Final query on the recursive CTE
SELECT *
FROM cte_name;
例子:
notice
-
要用临时表必须一层一层的来,不能脱离
-
having是对分组后的数据进行过滤,如果不加聚合函数,分组得到的数据默认取的是第一条数据
- having 子句用于筛选已分组的结果集
- having 后面的字段如果是表中现有的列,则这个列必须出现在select后面,否则会报错
-
case when的原理 当一个单元格中有多个数据时,case when只会提取当中的第一个数据
4 单独地使用group by的实际意义并不大,它只能显示出每组记录的第一条记录
在MySQL中,允许下面这样的写法
select id, revenue
from Department
group by id
即在select子句中出现了group by子句中没有出现的列名revenue,而这种写法在SQL标准中是没有的,在MySQL以外的大部分数据库中也是不支持的,因为逻辑上没有意义。
要理解为什么这种写法没有意义,我们来看一看题目本身提供的样例数据。(注意,其中的id并不是真正的id,只是部门编号)
+------+---------+-------+
| id | revenue | month |
+------+---------+-------+
| 1 | 8000 | Jan |
| 2 | 9000 | Jan |
| 3 | 10000 | Feb |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
通过group by id
,该表中的数据被分为三组,即
+------+---------+-------+
| 1 | 8000 | Jan |
| 1 | 7000 | Feb |
| 1 | 6000 | Mar |
+------+---------+-------+
+------+---------+-------+
| 2 | 9000 | Jan |
+------+---------+-------+
+------+---------+-------+
| 3 | 10000 | Feb |
+------+---------+-------+
此时在第一组中,有三条记录,也就是说有三个revenue,那么此时select id, revenue就无法判定应该取哪一个revenue,所以这样的操作在标准SQL中是不允许的,只能通过聚合函数来处理。而MySQL在这里提供了一种便利的方式,却让理解它的工作方式变得更加困难
6.SQL中的递归查询
递归查询原理
SQL Server中的递归查询是通过CTE(表表达式)来实现。至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。
递归查询的终止条件
递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。
递归的常见形式
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
WITH RECURSIVE cte_name (column1, column2, ...) AS (
-- Anchor member (初始查询)
SELECT column1, column2, ...
FROM table_name
WHERE condition
UNION ALL
-- Recursive member (递归查询)
SELECT column1, column2, ...
FROM table_name
JOIN cte_name ON <join_condition>
WHERE condition_for_recursive_member
)
-- Final query on the recursive CTE
SELECT *
FROM cte_name;
例子:
- Mysql使用两个反斜杠(\),而很多语言使用一个反斜杠转义呢,因为mysql自己解释一个,正则表达式库解释一个。