关闭

SQL语句杂记3

809人阅读 评论(0) 收藏 举报
分类:

一、执行select rowid from (select * from test group id,name)语句时,提示ORA-01446错误。具体如下所示:

   SQL>select rowid from (select * from test group id,name);

   ORA-01446:cannotselectROWID from,orsample,aview with DISTINCT , GROUPBY, etc.

  ORA-01446: 无法使用distinct, group by 等子句从视图中选择rowid或采样 。

  注释:

   1、ora-01446的意思是说如果一个视图的创建语句中带有distinct, group by 等子句,则一个SQL语句中使用了该视图时,该SQL语句中不能出现ROWID或是采样。例如下面的例子:

  SQL>create view tv as select * from test;

 SQL>select rowid from tv;//此时是执行成功的

 SQL>create view tvd as select distinct  * from test;

  SQL>select rowid from tv;//此时执行不成功的

  ORA-01446: 无法使用distinct, group by 等子句从视图中选择rowid或采样 。

    2、select rowid from (select * from test group id,name)语句中的子查询(select * from test group id,name)所获得的结果集其实就是一个匿名的或说oracle系统自动为其命名的视图。应该说视图的实质就是存在于内存上的一个结果集,而不是存在于磁盘上数据文件中的一个表(段)。


二、

1、关于group by的一个特点

假设表test的内容如下:

select   *  from test;

ID   NAME        COUNTRY

---          ------------     ----------------

1            tone            china

2             lily             america

1            tone            america

则执行select  id,name  from test group by id,name语句的结果如下:

  SQL>select  id,name  from test group by id,name;

ID   NAME

---          ------------

1            tone

2             lily

这个说明,虽然一组有多个行,但是显示出来的只是一条。比如,1,tone这一行有两条成员实际上。




2、关于group by的一个特点

select count(*)from test group by id,name;

count(*)

----------------

2

1

说明这里count(*)统计的每一组各自有几个行。


3、关于使用count(X) 函数的说明

count(X) 函数用于计算一个查询所返回的行数,但是和其他的聚合函数AVG(X), SUM(X), MAX(X), MIN(X)一样,它在统计的时候都会简单的忽略含有空记录的查询。

例如,假设表test的内容如下:

select   *  from test;

ID   NAME        COUNTRY

---          ------------     ----------------

1            tone            china

2             lily             america

1            tone            america

null         null             null

null         null             null

3            null             china

SQL>select t.* ,count(name)from test t group by id,name;

ID   NAME        COUNT(NAME)

---          ------------     ----------------

1            tone           2

2             lily             america

null         null             0

3            null             0

虽然(id,name)=(3 , null  )这一组有一行,(id,name)=(null , null  )这一组有两行,但是由于他们在name这一列值都是为null,所以count(name)的值就是0。同时,也说明(id,name)=(null , null  )这一组id和name值都是null,但是group by不会空记录的。

SQL>select t.* ,count(*)from test t group by id,name;

ID   NAME        COUNT(NAME)

---          ------------     ----------------

1            tone           2

2             lily             america

null         null             2

3            null             1

我们发现,使用count(*)时,(id,name)=(null , null  )这一组的count(name)的值就=为2,说明此时count(*)里的*不为null,也就是说*不等价于表里的所有列的连接字符串,具体到表test上,就是*不等价于id||name||country。


count(X) 函数里的参数个数只有一个,所以类似count(id,name) 时,就会提示“参数个数无效”。参数值为null时就不统计该值的。若想在count(X) 函数里出现表的多个字段,则使用如下方式:

例如,表test有字段ID,NAME ,COUNTRY,我们想在count(X) 函数里出现表test的ID,NAME 字段,则用count(id||name)的形式。其中,id||name就是一个参数,若id和name同时为null,则id||name也为null,故而被count(X) 函数统计。||是字符串连接符,连接多个字符串组成一个新的字符串。具体结果如下:

SQL>select t.* ,count(id||name) from test t group by id,name;

ID   NAME        COUNT(ID||NAME)

---          ------------     ----------------

1            tone           2

2             lily             america

null         null             0

3            null             1


附加:

1、count(*)查询所消耗的时间比count(rowid) 长吗?count(*) 没有类似的问题,不会只统计非空记录。count(*)也并不比count(rowid)慢,某些情况下比count(rowid)还要快得多,这个要看具体的执行计划。

2、count(column)不统计null。也可以用例如count(1),即count(数字或是字符常量或是字符串常量),不过還是用rowid快。







0
0

猜你在找
【直播】计算机视觉原理及实战—屈教授
【套餐】深度学习入门视频课程—唐宇迪
【套餐】Hadoop生态系统零基础入门--侯勇蛟
【套餐】嵌入式Linux C编程基础--朱有鹏
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4120065次
    • 积分:34138
    • 等级:
    • 排名:第136名
    • 原创:357篇
    • 转载:1190篇
    • 译文:0篇
    • 评论:92条
    最新评论