赞
踩
- SELECT member, team, age ,
-
- RANK() OVER(PARTITION BY team ORDER BY age DESC) rn,
- DENSE_RANK() OVER(PARTITION BY team ORDER BY age DESC) dense_rn,
- ROW_NUMBER() OVER(PARTITION BY team ORDER BY age DESC) row_num
- FROM Members
- ORDER BY team, rn;
1.3.1.1. 还有一种只包含NULL的集合
1.4.1.1. 通过对3取余给自然数集合N分类后
1.4.1.1.1. “模3剩余类”
1.4.1.2. 模在SQL中也有实现,就是取模函数MOD
1.4.1.2.1. --对从1到10的整数以3为模求剩余类
- SELECT MOD(num, 3) AS modulo,
- num
- FROM Natural
- ORDER BY modulo, num;
1.4.1.3. --从原来的表中抽出(大约)五分之一行的数据
- SELECT *
- FROM SomeTbl
- WHERE MOD(seq, 5) = 0;
- --表中没有连续编号的列时,使用ROW_NUMBER函数就可以了
- SELECT *
- FROM (SELECT col,
- ROW_NUMBER() OVER(ORDER BY col) AS seq
- FROM SomeTbl)
- WHERE MOD(seq, 5) = 0;
1.4.2.1. 数学理论并不是脱离实际的游戏,它其实隐藏了大量能够用于日常工作的技巧
- SELECT team, AVG(age)
- FROM Teams
- GROUP BY team;
2.5.1.1. 年龄只是每个人的属性,而不是小组的属性
2.5.1.2. 小组指的是由多个人组成的集合
2.5.1.2.1. 小组的属性只能是平均或者总和等统计性质的属性
- SELECT team, AVG(age), age
- FROM Teams
- GROUP BY team;
2.5.2.1. 违反了标准SQL的规定,因此不具有可移植性
2.5.2.2. MySQL数据库支持这样的查询语句
2.5.2.3. 强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误
- SELECT team, AVG(age), member
- FROM Teams
- GROUP BY team;
2.5.3.1. --正确
- SELECT team, AVG(age), MAX(member)
- FROM Teams
- GROUP BY team;
- SELECT team, MAX(age),
- (SELECT MAX(member)
- FROM Teams T2
- WHERE T2.team = T1.team
- AND T2.age = MAX(T1.age)) AS oldest
- FROM Teams T1
- GROUP BY team;
2.5.4.1. 子查询中的WHERE子句里使用了MAX(T1.age)这样的聚合函数作为条件
2.5.4.2. 这里对外层的表T1也进行了聚合,这样一来我们就可以在SELECT子句中通过聚合函数来引用“age”列了
2.5.4.3. 不能反过来在子查询中直接引用“age”列
2.6.2.1. 这两个层级的区别分别对应着SQL中的WHERE子句和HAVING子句的区别
2.6.2.2. WHERE子句用于处理“行”这种0阶的对象
2.6.2.3. HAVING子句用来处理“集合”这种1阶的对象
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。