SQLite - ORDER BY RAND()

SqlMysqlDatabaseSqliteRandom Access

Sql Problem Overview


In MySQL I can use the RAND() function, is there any alternative in SQLite 3?

Sql Solutions


Solution 1 - Sql

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

Solution 2 - Sql

using random():

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

EDIT (by QOP): Since the docs on SQLite Autoincremented columns states that:

> The normal ROWID selection algorithm described above will generate > monotonically increasing unique ROWIDs as long as you never use the > maximum ROWID value and you never delete the entry in the table with > the largest ROWID. If you ever delete rows, then ROWIDs from > previously deleted rows might be reused when creating new rows.

The above is only true if you don't have a INTEGER PRIMARY KEY AUTOINCREMENT column (it will still work fine with INTEGER PRIMARY KEY columns). Anyway, this should be more portable / reliable:

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID, _ROWID_ and OID are all aliases for the SQLite internal row id.

Solution 3 - Sql

Solved:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

Solution 4 - Sql

For a much better performance use this in SQLite:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

This is also applicable to MySQL. This runs faster because SQL engines first load projected fields of rows to memory then sort them, here we just load and random sort the id field of rows, then we get X of them, and find the whole rows of these X ids which is by default indexed.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlix AxelView Question on Stackoverflow
Solution 1 - SqlavnicView Answer on Stackoverflow
Solution 2 - SqldfaView Answer on Stackoverflow
Solution 3 - SqlAlix AxelView Answer on Stackoverflow
Solution 4 - SqlAliView Answer on Stackoverflow