当前位置:   article > 正文

《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之三:rownum和聚合函数_pgsql的rownum

pgsql的rownum

作者:瀚高PG实验室 (Highgo PG Lab)- 瀚高大李

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用。随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL、存储过程、序列等程序中不同的数据库中数据的使用方式的转换。下面根据自己的理解和测试,写了一些SQL以及数据库对象转换方面的文章,不足之处,尚请多多指教。

rownum

rownum是Oracle内部的一个伪列,用来表示数据在结果集中的行数。它是在同一层SQL中结果集查询出来以后,排序以前进行的操作。Oracle的rownum必须从1开始。如果使用>1这样的条件,将一条数据都取不到。Oracle中,把检索结果取出来后,在画面上分页显示的功能,都是使用rownum,并且使用多层子查询来实现的。
PostgreSQL中,没有rownum这样的伪列,但是提供了 limit 和 offset 两个关键字来实现类似的功能。limit表示取得记录的条数。而 offset 是指偏移位置,也就是表示从第几条开始取数据(offset从0开始)。

Oracle rownum

  1. SQL> select rownum, id, name from student;
  2. ROWNUM ID NAME
  3. ---------- ---------- ----------
  4. 1 1 张一
  5. 2 2 王二
  6. 3 3 李三
  7. 4 4 赵四
  8. SQL> select rownum ,id,name from student order by name;
  9. ROWNUM ID NAME
  10. ---------- ---------- ----------
  11. 3 3 李三
  12. 2 2 王二
  13. 1 1 张一
  14. 4 4 赵四
  15. SQL> select rownum ,id,name from (select * from student order by name);
  16. ROWNUM ID NAME
  17. ---------- ---------- ----------
  18. 1 3 李三
  19. 2 2 王二
  20. 3 1 张一
  21. 4 4 赵四
  22. SQL> select rownum, id, name from student where rownum >1 order by name;
  23. 未选定行
  24. SQL> select * from
  25. 2 (
  26. 3 select a.*, rownum rn
  27. 4 from (select * from student)a
  28. 5 where rownum <=3
  29. 6 )
  30. 7 where rn >2;
  31. ID NAME RN
  32. ---------- ---------- ----------
  33. 3 李三 3

PostgreSQL limit 和 offset

  1. postgres=# select * from student;
  2. id | name
  3. ----+------
  4. 1 | 张一
  5. 2 | 王二
  6. 3 | 李三
  7. 4 | 赵四
  8. (4 行记录)
  9. postgres=# select * from student order by name;
  10. id | name
  11. ----+------
  12. 3 | 李三
  13. 2 | 王二
  14. 1 | 张一
  15. 4 | 赵四
  16. (4 行记录)
  17. postgres=# select * from student limit 2;
  18. id | name
  19. ----+------
  20. 1 | 张一
  21. 2 | 王二
  22. (2 行记录)
  23. postgres=# select * from student offset 2;
  24. id | name
  25. ----+------
  26. 3 | 李三
  27. 4 | 赵四
  28. (2 行记录)
  29. postgres=# select * from student limit 1 offset 2;
  30. id | name
  31. ----+------
  32. 3 | 李三
  33. (1 行记录)

聚合函数

聚合函数是标准SQL语言中的函数,主要包括求计数(count),求最大值(max),求最小值(min),求和(sum)和求平均数(avg)等几个。Oracle和PostgreSQL都支持聚合函数。但是对求和(sum)和求平均数(avg)而言,Oracle和PostgreSQL有一些不同。

对求和(sum)和求平均数(avg)而言,Oracle由于内部有自动类型转换,所以对于字符型数字(数据类型是字符,但是里面的数据都是数字)可以直接使用。而PostgreSQL内部没有自动类型转换,所以对于字符型数字而言,必须先使用类型转换,转换成数字后再使用函数进行计算。

Oracle 聚合函数

  1. SQL> desc achieve;
  2. 名称 是否为空? 类型
  3. ----------------------------------------- -------- ----------------------------
  4. ID NOT NULL NUMBER(38)
  5. NAME VARCHAR2(10)
  6. ACHIEVE VARCHAR2(10)
  7. SQL> select * from achieve;
  8. ID NAME ACHIEVE
  9. ---------- ---------- ----------
  10. 1 赵大 5200
  11. 2 钱二 4500
  12. 3 孙三 6000
  13. 4 李四 8000
  14. 5 周五
  15. SQL> select min(achieve) from achieve;
  16. MIN(ACHIEV
  17. ----------
  18. 4500
  19. SQL> select max(achieve) from achieve;
  20. MAX(ACHIEV
  21. ----------
  22. 8000
  23. SQL> select count(achieve) from achieve;
  24. COUNT(ACHIEVE)
  25. --------------
  26. 4
  27. SQL> select sum(achieve) from achieve;
  28. SUM(ACHIEVE)
  29. ------------
  30. 23700
  31. SQL> select avg(achieve) from achieve;
  32. AVG(ACHIEVE)
  33. ------------
  34. 5925

PostgreSQL 聚合函数

  1. postgres=# \d achieve;
  2. 数据表 "public.achieve"
  3. 栏位 | 类型 | 修饰词
  4. ---------+-----------------------+--------
  5. id | integer | 非空
  6. name | character varying(10) |
  7. achieve | character varying(10) |
  8. 索引:
  9. "achieve_pkey" PRIMARY KEY, btree (id)
  10. postgres=# select * from achieve;
  11. id | name | achieve
  12. ----+------+---------
  13. 1 | 赵大 | 5200
  14. 2 | 钱二 | 4500
  15. 3 | 孙三 | 6000
  16. 4 | 李四 | 8000
  17. 5 | 周五 |
  18. (5 行记录)
  19. postgres=# select min(achieve) from achieve;
  20. min
  21. ------
  22. 4500
  23. (1 行记录)
  24. postgres=# select max(achieve) from achieve;
  25. max
  26. ------
  27. 8000
  28. (1 行记录)
  29. postgres=# select count(achieve) from achieve;
  30. count
  31. -------
  32. 4
  33. (1 行记录)
  34. postgres=# select sum(achieve) from achieve;
  35. 错误: 函数 sum(character varying) 不存在
  36. 1select sum(achieve) from achieve;
  37. ^
  38. 提示: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
  39. postgres=# select avg(achieve) from achieve;
  40. 错误: 函数 avg(character varying) 不存在
  41. 1select avg(achieve) from achieve;
  42. ^
  43. 提示: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
  44. postgres=# select sum(achieve::int) from achieve;
  45. sum
  46. -------
  47. 23700
  48. (1 行记录)
  49. postgres=# select avg(cast(achieve as int)) from achieve;
  50. avg
  51. -----------------------
  52. 5925.0000000000000000
  53. (1 行记录)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/872965
推荐阅读
相关标签
  

闽ICP备14008679号