Navicat使用教程:获取MySQL中的行数(第1部分)

时间:2022-03-19 07:07:41

  下载Navicat Premium最新版本
  
  Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。
  
  在MySQL中有几种获取行数的方法。一些数据库管理产品提供数据库统计信息,如表大小,但也可以使用直接的SQL来完成。在这篇文章中,我们将使用本机COUNT()函数来检索MySQL数据库中一个表或视图中的行数。在第2部分中,我们将学习如何从多个表甚至从数据库中的所有表中获取行计数。
  
  COUNT()函数的多种形式
  
  您可能已经知道COUNT()函数返回表中的行数。但是还有一点要比这个多,因为COUNT()函数可以用来计算表中的所有行,或者只计算那些符合特定条件的行。秘密在函数签名中,它有几种形式:COUNT(*)、COUNT(expression)和COUNT(DISTINCT expression)。
  
  在每种情况下,COUNT()都返回一个BIGINT,该BIGINT包含匹配行的数量,如果未找到匹配行,则返回零。
  
  对表中的所有行进行计数
  
  要对表中的所有行进行计数,无论它们是否包含空值,请使用COUNT(*)。该形式的COUNT()函数基本上返回由SELECT语句返回的结果集中的行数。
  
  1
  
  SELECT COUNT(*) FROM cities;
  
  像上面这样的语句,在没有WHERE子句或附加列的情况下调用COUNT(*)函数,将在MyISAM表上执行得非常快,因为行数存储在information_schema数据库的Tables表的Table_Rows列中。
  
  对于事务性存储引擎(如InnoDB),存储精确的行计数是有问题的,因为InnoDB不在表中保留行的内部计数。如果是这样,并发事务可能会同时“看到”不同数量的行。因此,SELECT COUNT(*)语句只对当前事务可见的行进行计数。这意味着,在繁重的工作负载期间使用COUNT(*) 运行查询可能会导致数字稍微不准确。
  
  只对具有COUNT(expr)的非空行进行计数
  
  不向COUNT()传递任何内容将执行函数的COUNT(expr)版本,但sans参数除外。这样调用COUNT()只返回不包含空值的行。例如,假设我们有一个名为code_values的简单表:
  
 
public ushort TransactionIdentifier { get; set; }
public ushort ProtocolIdentifier { get; set; }
public ushort Length { get; set; }
public short UnitIdentifier { get; set; }

public ModbusHeader(IByteBuffer buffer)
{
TransactionIdentifier = buffer.ReadUnsignedShort();
ProtocolIdentifier = buffer.ReadUnsignedShort();
Length = buffer.ReadUnsignedShort();
UnitIdentifier = buffer.ReadByte();
}

public ModbusHeader(www.fengshen157.com/ ushort transactionIdentifier, short unitIdentifier)
: this(transactionIdentifier, 0x0000,www.gcyL157.com unitIdentifier) // for modbus protocol:www.michenggw.com Protocol Identifier = 0x00
{

}

private ModbusHeader(www.dasheng178.com ushort www.mcyllpt.com transactionIdentifier, ushort protocolIdentifier, short unitIdentifier)
{
TransactionIdentifier = transactionIdentifier;
ProtocolIdentifier = protocolIdentifier;
UnitIdentifier = unitIdentifier;
}

public IByteBuffer Encode()
{
IByteBuffer buffer = Unpooled.Buffer();

buffer.WriteUnsignedShort(TransactionIdentifier);
buffer.WriteUnsignedShort(ProtocolIdentifier);
buffer.WriteUnsignedShort(Length);
buffer.WriteByte(UnitIdentifier);

  
  code_values
  
  +-------+
  
  | code |
  
  +-------+
  
  | 1 |
  
  +-------+
  
  | |
  
  +-------+
  
  | |
  
  +-------+
  
  | 4 |
  
  +-------+
  
  从表中选择COUNT()将返回2,即使有4行:
 
  SELECT COUNT(*) FROM code_values;
  
  +---------+
  
  | COUNT() |
  
  +---------+
  
  | 2 |
  
  +---------+
  
  请注意,很少使用此版本的COUNT()函数,因为在规范化的数据库中,空行不应该是问题,这种情况只有在表没有主键时才会发生。在大多数情况下,COUNT(*)都可以正常工作。
  
  当然,COUNT(expr)确实接受正确的表达式。下面是另一个同样获取空行和非空行的查询:
  
  1
  
  SELECT COUNT(IFNULL(code, 1)) FROM code_values;
  
  计算非空值
  
  COUNT函数的COUNT(expr)版本还接受单个列名,其效果是COUNT(column_name)将返回column_name不为空的记录数。因此,以下SELECT查询将获取描述列包含非空值的行数:
  
  1
  
  SELECT COUNT(description) FROM widgets;
  
  在第2部分中,我们将学习如何使用COUNT(DISTINCT expression)签名以及如何从多个表中获取行计数。