sql个人笔记-notice

notice

  1. 要用临时表必须一层一层的来,不能脱离

  2. having是对分组后的数据进行过滤,如果不加聚合函数,分组得到的数据默认取的是第一条数据

    • having 子句用于筛选已分组的结果集
    • having 后面的字段如果是表中现有的列,则这个列必须出现在select后面,否则会报错
  3. 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

  1. 要用临时表必须一层一层的来,不能脱离

  2. having是对分组后的数据进行过滤,如果不加聚合函数,分组得到的数据默认取的是第一条数据

    • having 子句用于筛选已分组的结果集
    • having 后面的字段如果是表中现有的列,则这个列必须出现在select后面,否则会报错
  3. 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;

例子:

  1. Mysql使用两个反斜杠(\),而很多语言使用一个反斜杠转义呢,因为mysql自己解释一个,正则表达式库解释一个。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值