【MySQL】SQL语句生成连续的序号
MySQL的SQL语句还是非常有特点的,虽然都是支持标准的SQL99语法,但是,还是有一些比较牛的写法(比如:SQL中使用变量),当然了,也许是因为有一些不方便的地方而创造的(我猜的)
比如:通过SQL生成从1-10的连续的序号,如果是Oracle的话,那么非常简单select rownum from dual connect by rownum<=10,如果是mysql就没有这么简单了。
MySQL实现从1-10连续的序号
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> SELECT @seq := @seq + 1 AS seq FROM (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1) r1, (SELECT 1 UNION ALL SELECT 1) r2, (SELECT @seq := 0) r0; +-----+ | seq | +-----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +-----+ 10 rows in set mysql> |
知识点:
1:笛卡尔积
2:union all 与union 的区别 (如果上述SQL中union all 改为 union的话,那么就需要写不同的数字了,因为union去重、排序,union all只是单纯的叠加)
3:变量的使用。
再来个例子,对比上面的例子,看看区别,便于更深入的理解:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> SELECT @seq := @seq + 1 AS seq FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3) r1, (SELECT 1 UNION SELECT 2 UNION SELECT 3) r2, (SELECT @seq := 0) r0; +-----+ | seq | +-----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | +-----+ 9 rows in set mysql> |
可以猜测一下,下面SQL的结果是多少条记录?
|
1 2 3 4 5 6 |
SELECT @seq:=@seq + 1 as seq FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) r1, (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) r2, (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) r3, (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) r4, (SELECT @seq:=0) r0 |