2-5 GROUP BY和PARTITION BY
SQL语句中具有分组功能的是GROUP BY和PARTITION BY,他们都可以根据指定的列为表分组。区别仅仅在于,GROUP BY在分组之后把每个分组聚合成一行数据。
下面是存储了几个团队极其成员的信息表。
DROP TABLE if EXISTS Teams;CREATE TABLE Teams(member VARCHAR(32) PRIMARY KEY,team CHAR(1) NOT NULL,age INTEGER NOT NULL);INSERT INTO Teams VALUES('大木', 'A', 28);INSERT INTO Teams VALUES('逸见', 'A', 19);INSERT INTO Teams VALUES('新藤', 'A', 23);INSERT INTO Teams VALUES('山田', 'B', 40);INSERT INTO Teams VALUES('久本', 'B', 29);INSERT INTO Teams VALUES('桥田', 'C', 30);INSERT INTO Teams VALUES('野野宫', 'D', 28);INSERT INTO Teams VALUES('鬼塚', 'D', 28);INSERT INTO Teams VALUES('加藤', 'D', 24);INSERT INTO Teams VALUES('新城', 'D', 22);
mariadb> /* 理解PARTITION BY */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_numFROM TeamsORDER BY team, rn;+--------+------+-----+----+----------+---------+| member | team | age | rn | dense_rn | row_num |+--------+------+-----+----+----------+---------+| 大木 | A | 28 | 1 | 1 | 1 || 新藤 | A | 23 | 2 | 2 | 2 || 逸见 | A | 19 | 3 | 3 | 3 || 山田 | B | 40 | 1 | 1 | 1 || 久本 | B | 29 | 2 | 2 | 2 || 桥田 | C | 30 | 1 | 1 | 1 || 鬼塚 | D | 28 | 1 | 1 | 1 || 野野宫 | D | 28 | 1 | 1 | 2 || 加藤 | D | 24 | 3 | 2 | 3 || 新城 | D | 22 | 4 | 3 | 4 |+--------+------+-----+----+----------+---------+

划分出来的自己,有3个性质
- 它们都是非空集合
- 所有子集的并集等于划分之前的集合
- 任何两个子集之间没有交集。
