栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在SQLite GROUP BY查询的SELECT列表中包括额外的列是否安全?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在SQLite GROUP BY查询的SELECT列表中包括额外的列是否安全?

如果多余的列在 功能上取决于 您分组的列,则可以“安全”地使用这些查询,即不会导致歧义的结果:

SELECt c.parent_id, COUNT(*), p.any_columnFROM child_table c JOIN parent_table p USING (parent_id)GROUP BY c.parent_id;

上面的示例将在SQLite中工作,并产生明确的结果,因为

p.any_column
每个组不可能有多个值。但是,此查询严格违反SQL标准,并且大多数品牌的RDBMS都会引发错误。

但是,编写产生歧义结果的查询太容易了。当命名每个组具有多个值的列时,您将无法控制在结果集中返回哪个值。

实际上,MySQL从物理存储的 第一 行返回该值,而SQLite从 最后
一行返回该值。但这完全依赖于实现且不可靠。如果任一软件的下一版本更改了内部结构,则升级后您可能会获得不同的查询结果。因此,最好不要依赖此行为。


对于您的示例,where

content
应该“直观地”具有
sequence
MAX为行中的值。但这真的很直观吗?考虑以下其他情况:

SELECt MAX(sequence), MIN(sequence), type, contentFROM messageGROUP BY type

那么,现在哪一行提供了价值

content
?行
sequence
是MAX,还是行
sequence
MIN?

如果您使用非唯一列(例如

date
),并且有多行具有相同的MAX值
date
,但具有不同的值
content
怎么办?

SELECt MAX(date), type, contentFROM messageGROUP BY type

其他聚合函数(例如

AVG()
或)
SUM()
呢?汇总的值可能对应于表中没有单独的行。那么,现在应该为哪一行提供值
content

SELECt AVG(sequence), type, contentFROM messageGROUP BY type


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/614524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号