SQL SELECT语句是如何工作的?

SQL SELECT语句是如何工作的?,sql,Sql,我创建了一个表,id作为主键,firstname,lastname,email作为字段。我提出了以下问题: "SELECT email,COUNT(email) FROM mytable;" 结果具有电子邮件的第一个值,即来自第一条记录的值和来自“电子邮件”列的值总数。为什么它没有显示来自不同记录的电子邮件的所有不同值 如果没有GROUP BY,则只有一个组,为该组选择哪个名称值是不确定的 与任何分组查询一样,COUNT(*)返回组中的行数,并将结果减少到每组一行 但是由于没有任何GROUP

我创建了一个表,id作为主键,firstname,lastname,email作为字段。我提出了以下问题:

 "SELECT email,COUNT(email) FROM mytable;"
结果具有电子邮件的第一个值,即来自第一条记录的值和来自“电子邮件”列的值总数。为什么它没有显示来自不同记录的电子邮件的所有不同值

如果没有GROUP BY,则只有一个组,为该组选择哪个名称值是不确定的

与任何分组查询一样,
COUNT(*)
返回组中的行数,并将结果减少到每组一行

但是由于没有任何GROUPBY子句,整个表被视为一个大的组,结果只返回一行

email
列返回组中的一个电子邮件值。从技术上讲,此值是从组中的一行中任意选择的

实际上,MySQL的实现从组中读取的第一行中选择值,其顺序取决于用于扫描表的索引。虽然没有文档记录拾取第一行的行为,并且它们也不能保证在不同版本之间保持相同的行为

最好避免依赖于返回任意、依赖于实现的值的查询。这使您的代码更难维护,因为如果您升级MySQL,并且他们更改其未记录的行为,代码可能会发生更改


为了防止您进行此类任意查询,较新版本的MySQL强制执行一种称为ONLY_FULL_GROUP_BY的SQL模式。该选项使运行类似于您显示的查询成为错误。值得一提的是,在大多数其他品牌的SQL数据库中,该查询已经是一个错误。

Count()方法返回一个值。您可以显示示例数据和预期输出吗?我为电子邮件输入了3个不同的值。”abc@gmai.com', def@gmail.com', 'ghi@gmail.com'. 我希望结果显示我在查询中使用的计数函数中沿“3”的所有这些值。相反,它显示了abc@gmail.com,结果中的3。“计数”是聚合函数。您应该使用SELECT email,COUNT(电子邮件)FROM mytable Group by email您需要查看
Group by