Java SQL ORDER BY子句能否与数据源中的任何列一起使用?

Java SQL ORDER BY子句能否与数据源中的任何列一起使用?,java,mysql,sql,Java,Mysql,Sql,我试图一次从任何数据库读取1000条记录。我假设我们不知道列的名称和列的类型,所以我总是选择表中的第一个来进行排序。选择表中的哪一个用于使用订单有关系吗?我不是很擅长数据库的东西,现在我正在学习。如果选择一个好的列可以加快查询执行以返回结果集,那么我应该寻找什么类型 我的代码: if (SQLServerDatabase) { String query = "SELECT * FROM "+tablename+" ORDER BY "+columnnames.get(0)+" OFFS

我试图一次从任何数据库读取1000条记录。我假设我们不知道列的名称和列的类型,所以我总是选择表中的第一个来进行排序。选择表中的哪一个用于使用订单有关系吗?我不是很擅长数据库的东西,现在我正在学习。如果选择一个好的列可以加快查询执行以返回结果集,那么我应该寻找什么类型

我的代码:

if (SQLServerDatabase) {

    String query = "SELECT * FROM "+tablename+" ORDER BY "+columnnames.get(0)+" OFFSET "+offset+" ROWS FETCH NEXT "+size+" ROWS ONLY;";

    rs = stmt.executeQuery(query);

} else if (MySQLDatabase) {

    String query = "SELECT * FROM "+tablename+" LIMIT "+offset+", "+size+";";

    rs = stmt.executeQuery(query);

}

注意:columnnames是一个列表

我建议首先获取主键的名称,然后按顺序进行操作

这个答案应该为你指明正确的方向


但是,您需要知道,您所做的并不能保证您检索不到重复的记录。例如,如果您根据任何顺序请求记录1-1000,同时将另一条记录插入表中,这将出现在前1000条记录中,那么当您请求记录1001-2000时,您将发现记录1001与记录1000相同。

我建议先获取主键的名称,在那上面按顺序做

这个答案应该为你指明正确的方向


但是,您需要知道,您所做的并不能保证您检索不到重复的记录。例如,如果您根据任何顺序请求记录1-1000,并且同时将另一条记录插入表中,这将出现在前1000条记录中,然后,当您要求记录1001-2000时,您会发现记录1001与记录1000相同。

我认为您可以在ORDER BY子句中使用任何有效的表达式

如果您不关心排序,可以使用
(选择NULL)
作为ORDER BY中的表达式,例如:

 SELECT * FROM mytable ORDER BY (SELECT NULL) OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY


不能保证每次执行查询时都会以相同的顺序返回行。如果您这样做是为了实现“分页”,则可能会遗漏(跳过)某些行,并且在后续执行时也会返回相同的行。

我认为您可以在ORDER BY子句中使用任何有效的表达式

如果您不关心排序,可以使用
(选择NULL)
作为ORDER BY中的表达式,例如:

 SELECT * FROM mytable ORDER BY (SELECT NULL) OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY


不能保证每次执行查询时都会以相同的顺序返回行。如果您这样做是为了实现“分页”,则可能会遗漏(跳过)某些行,并且在后续执行时也会返回相同的行。

我要反驳大家对按您无法事先识别的列进行排序是否有用的怀疑。这一点尤其正确,因为第一列可能允许重复,这意味着结果仍将在第一列的每个不同值中未排序

总而言之,我很惊讶没有人提到这一点:如果您想按查询中的第一列进行排序,您不需要实际标识第一列的名称。您只需按1写入
顺序即可

例如:


我要反驳大家对按列排序是否有用的怀疑,因为您事先无法识别列。这一点尤其正确,因为第一列可能允许重复,这意味着结果仍将在第一列的每个不同值中未排序

总而言之,我很惊讶没有人提到这一点:如果您想按查询中的第一列进行排序,您不需要实际标识第一列的名称。您只需按1写入
顺序即可

例如:


ORDER BY在索引列上速度快,在其他列上速度慢。第一列通常(但并非总是)是主键,而且速度很快。如果使用任意未知列进行排序,除了性能问题之外,这有意义吗?为什么您不知道?问题是,当您不知道排序依据是什么时,对结果进行排序是否有用?向查询中添加更多条件也会显著提高其性能。我知道这很难,因为你的查询是动态的。因此,另一个建议是在java代码中进行更多的自定义sql查询,以准确地涵盖您需要为使用数据的任何内容选择和/或显示的内容。这也会提高查询的性能,也许还会提高安全性(?(请大家纠正我的问题,但动态sql不会为sql注入打开可能性吗?)我知道它完全避免了您的问题,但在我看来,有时动态并不是解决问题的方法。在这里也要小心sql注入。像这样构建字符串可能会导致一些糟糕的情况。ORDER BY在索引列上速度快,在其他列上速度慢。第一列通常(但并非总是)是主键,而且速度很快。如果使用任意未知列进行排序,除了性能问题之外,这有意义吗?为什么您不知道?问题是,当您不知道排序依据是什么时,对结果进行排序是否有用?向查询中添加更多条件也会显著提高其性能。我知道这很难,因为你的查询是动态的。因此,另一个建议是在java代码中进行更多的自定义sql查询,以准确地涵盖您需要为使用数据的任何内容选择和/或显示的内容。这也会提高查询的性能,也许还会提高安全性(?(请大家纠正我的问题,但动态sql不会为sql注入打开可能性吗?)我知道它完全避免了您的问题,但在我看来,有时动态并不是解决问题的方法。在这里也要小心sql注入。像这样构建字符串可能会导致一些糟糕的情况。顺便说一下,我在这里使用setAutoCommit(false)来解决这个问题。不确定这是否是个好主意。顺便说一下,我在这里使用setAutoCommit(false)来解决这个问题。不知道这是不是个好主意。