MySQL - 选择随机记录
- MySQL 中选择随机记录
- MySQL RAND() 函数
- LIMIT 与 RAND() 函数
- 使用客户端程序获取随机记录
你参加过在线考试吗?如果是,你有没有想过这些题目显示的顺序是如何随机化的?这些题目通常存储在测试应用的数据库中,并逐一随机显示。
在为应用使用数据库时,经常会出现需要从表对象中随机选择记录的情况。MySQL 没有为此内置的直接方法。
MySQL 中选择随机记录
要在 MySQL 中选择随机记录,可以使用 ORDER BY RAND() 子句。RAND() 函数与 SELECT 查询一起使用,以逐条或集体检索存储的数据。
MySQL RAND() 函数
MySQL RAND() 函数返回一个结果集,其中包含原始表的所有记录,但以完全随机的顺序。通常与 SELECT 语句的 ORDER BY 子句一起使用。
语法
以下是 RAND() 函数与 ORDER BY 子句的基本语法 −
SELECT column_name(s) FROM table_name ORDER BY RAND();
示例
以下示例演示了 RAND() 函数与 ORDER BY 子句一起使用的情况。首先创建一个名为 'CUSTOMERS' 的表,并向其中插入一些值。
CREATE TABLE CUSTOMERS( ID int NOT NULL AUTO_INCREMENT, NAME varchar(20), AGE int, PRIMARY KEY(Id) );
现在,使用 INSERT 语句向该表插入值,如下所示 −
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('John',23);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('Larry',21);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('David',21);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('Carol',24);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('Bob',27);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('Mike',29);
INSERT INTO CUSTOMERS (NAME, AGE) VALUES ('Sam',26);
得到如下 CUSTOMERS 表 −
| ID | NAME | AGE |
|---|---|---|
| 1 | John | 23 |
| 2 | Larry | 21 |
| 3 | David | 21 |
| 4 | Carol | 24 |
| 5 | Bob | 27 |
| 6 | Mike | 29 |
| 7 | Sam | 26 |
现在,使用 RAND() 函数与 SELECT 语句,以随机顺序检索 CUSTOMERS 表的记录 −
SELECT * FROM CUSTOMERS ORDER BY RAND();
输出
以上查询的输出如下 −
| ID | NAME | AGE |
|---|---|---|
| 6 | Mike | 29 |
| 4 | Carol | 24 |
| 3 | David | 21 |
| 1 | John | 23 |
| 5 | Bob | 27 |
| 7 | Sam | 26 |
| 2 | Larry | 21 |
LIMIT 与 RAND() 函数
您还可以结合 RAND() 函数使用 LIMIT 子句来限制随机检索的记录数量
语法
以下是使用 LIMIT 与 RAND() 函数的语法 −
SELECT column_name(s) FROM table_name ORDER BY RAND() LIMIT int_value;
示例
在本示例中,我们使用以下查询从 'CUSTOMERS' 表中随机检索有限数量的记录 −
SELECT * FROM CUSTOMERS ORDER BY RAND() LIMIT 1;
以上代码的输出如下所示 −
| ID | NAME | AGE |
|---|---|---|
| 7 | Sam | 26 |
每次执行此查询时,都会得到不同的随机记录 −
SELECT * FROM CUSTOMERS ORDER BY RAND() LIMIT 1;
产生的结果如下 −
| ID | NAME | AGE |
|---|---|---|
| 6 | Mike | 29 |
您还可以通过修改 LIMIT 值来增加要显示的记录限制,如下所示 −
SELECT * FROM CUSTOMERS ORDER BY RAND() LIMIT 2;
我们得到的输出如下 −
| ID | NAME | AGE |
|---|---|---|
| 1 | John | 23 |
| 3 | David | 21 |
使用客户端程序获取随机记录
我们也可以使用客户端程序来选择随机记录。
语法
通过 PHP 程序选择随机记录,我们需要使用 mysqli 函数 query() 执行 RAND() 函数,如下所示 −
$sql = "SELECT * FROM CUSTOMERS ORDER BY RAND()"; $mysqli->query($sql);
通过 JavaScript 程序选择随机记录,我们需要使用 mysql2 库的 query() 函数执行 RAND() 函数,如下所示 −
sql = "SELECT * FROM CUSTOMERS ORDER BY RAND()"; con.query(sql)
通过 Java 程序选择随机记录,我们需要使用 JDBC 函数 executeQuery() 执行 RAND() 函数,如下所示 −
String sql = "SELECT * FROM CUSTOMERS ORDER BY RAND()"; statement.executeQuery(sql);
通过 Python 程序选择随机记录,我们需要使用 MySQL Connector/Python 的 execute() 函数执行 RAND() 函数,如下所示 −
random_query = "SELECT * FROM CUSTOMERS ORDER BY RAND()" cursorObj.execute(random_query)
示例
以下是相应的程序 −
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
if ($mysqli->connect_errno) {
printf("Connect failed: %s
", $mysqli->connect_error);
exit();
}
//printf('Connected successfully.
');
//让我们创建一个表
$sql = "create table CUSTOMERS ( Id int NOT NULL AUTO_INCREMENT, Name varchar(20), Age int, PRIMARY KEY(Id) )";
if($mysqli->query($sql)){
printf("CUSTOMERS table created successfully...!\n");
}
//现在插入一些记录
$sql = "insert into CUSTOMERS(Name,Age) values('John',23)";
if($mysqli->query($sql)){
printf("First record inserted successfully....!\n");
}
$sql = "insert into CUSTOMERS(Name,Age) values('Larry',21)";
if($mysqli->query($sql)){
printf("Second record inserted successfully....!\n");
}
$sql = "insert into CUSTOMERS(Name,Age) values('David',21)";
if($mysqli->query($sql)){
printf("Third record inserted successfully....!\n");
}
$sql = "insert into CUSTOMERS(Name,Age) values('Carol',24)";
if($mysqli->query($sql)){
printf("Fourth record inserted successfully....!\n");
}
$sql = "insert into CUSTOMERS(Name,Age) values('Bob',27)";
if($mysqli->query($sql)){
printf("Fifth record inserted successfully....!\n");
}
//显示表记录
$sql = "SELECT * FROM CUSTOMERS";
if($result = $mysqli->query($sql)){
printf("Table records: \n");
while($row = mysqli_fetch_array($result)){
printf("Id: %d, Name: %s, Age: %d",
$row['Id'],
$row['Name'],
$row['Age']);
printf("\n");
}
}
//查找随机记录
$sql = "SELECT * FROM CUSTOMERS ORDER BY RAND()";
if($result = $mysqli->query($sql)){
printf("Table records(random record): \n");
while($row = mysqli_fetch_array($result)){
printf("Id: %d, Name: %s, Age: %d",
$row['Id'],
$row['Name'],
$row['Age']);
printf("\n");
}
}
if($mysqli->error){
printf("Error message: ", $mysqli->error);
}
$mysqli->close();
输出
得到的输出如下所示 −
CUSTOMERS table created successfully...! First record inserted successfully....! Second record inserted successfully....! Third record inserted successfully....! Fourth record inserted successfully....! Fifth record inserted successfully....! Table records: Id: 1, Name: John, Age: 23 Id: 2, Name: Larry, Age: 21 Id: 3, Name: David, Age: 21 Id: 4, Name: Carol, Age: 24 Id: 5, Name: Bob, Age: 27 Table records(random record): Id: 3, Name: David, Age: 21 Id: 1, Name: John, Age: 23 Id: 2, Name: