首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 入門

MySQL SELECT 查詢完全指南:基礎語法、LIMIT 分頁、三種獲取模式與記憶體釋放

     編輯:MySQL 入門

MySQL SELECT 查詢完全指南:基礎語法、LIMIT 分頁、三種獲取模式與記憶體釋放

SELECT 是 SQL 最核心、使用頻率最高的指令。從簡單的「查所有」到複雜的多表連接、子查詢、窗口函數,掌握 SELECT 的完整語法與 PHP 驅動的三種獲取模式(關聯陣列、數值索引、雙模式),是後端開發的必修課。

核心語法全景

SELECT [DISTINCT] column_list
FROM table_name
[WHERE condition]
[GROUP BY column_list]
[HAVING condition]
[ORDER BY column_list [ASC|DESC]]
[LIMIT [offset,] row_count];
  • column_list:* 代表所有欄位,生產環境建議明確列出所需欄位。
  • DISTINCT:去除重複行。
  • OFFSET M LIMIT N:跳過 M 行,取 N 行(分頁核心)。LIMIT N OFFSET M 同義。

命令列實戰:runoob_tbl 表

查詢所有記錄

mysql> SELECT * FROM runoob_tbl;
+-------------+----------------+-----------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-21 |
| 2 | Learn MySQL | Abdul S | 2007-05-21 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+

PHP 三種獲取模式深度對比

函數/常數 返回結構 索引方式 記憶體佔用 適用場景
mysqli_fetch_assoc()關聯陣列欄位名 $row['col']中等業務代碼可讀性優先、欄位名固定
mysqli_fetch_array($result, MYSQLI_NUM)數值索引陣列位置 $row[0]最低高效能、大量資料、欄位順序固定
mysqli_fetch_array($result, MYSQLI_BOTH)雙模式(預設)兩者皆可最高兼容舊代碼、需同時按名稱/位置存取

模式 1:關聯陣列(推薦)

<?php
$sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl';
$retval = mysqli_query($conn, $sql);

while ($row = mysqli_fetch_assoc($retval)) {
    echo "ID: {$row['runoob_id']} <br>";
    echo "Title: {$row['runoob_title']} <br>";
    echo "Author: {$row['runoob_author']} <br>";
    echo "Date: {$row['submission_date']} <br><hr>";
}
mysqli_free_result($retval); // 釋放記憶體
?>

模式 2:數值索引(高效能)

<?php
while ($row = mysqli_fetch_array($retval, MYSQLI_NUM)) {
    echo "ID: {$row[0]} <br> Title: {$row[1]} <br> Author: {$row[2]} <br> Date: {$row[3]} <br><hr>";
}
?>

模式 3:雙模式(預設)

<?php
while ($row = mysqli_fetch_array($retval)) { // 預設 MYSQLI_BOTH
    echo "ID: {$row['runoob_id']} / {$row[0]} <br>"; // 兩種寫法皆可
}
?>

分頁查詢:LIMIT + OFFSET 實戰

-- 第 1 頁,每頁 10 筆
SELECT * FROM runoob_tbl ORDER BY runoob_id LIMIT 10 OFFSET 0;

-- 第 2 頁
SELECT * FROM runoob_tbl ORDER BY runoob_id LIMIT 10 OFFSET 10;

-- 簡寫:LIMIT offset, count
SELECT * FROM runoob_tbl ORDER BY runoob_id LIMIT 10, 10;

記憶體管理:mysqli_free_result() 必須養成的習慣

結果集佔用客戶端記憶體,大結果集未釋放會導致 PHP 記憶體耗盡。循環讀取結束後立即釋放:

<?php
$retval = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($retval)) { /* ... */ }
mysqli_free_result($retval); // 關鍵!
mysqli_close($conn);
?>

效能優化關鍵點

  1. 避免 SELECT *: 傳輸不需欄位浪費網路/記憶體,且阻礙覆蓋索引。
  2. 覆蓋索引: INDEX (a,b) 可滿足 SELECT a,b FROM t WHERE a=1 無需回表。
  3. 深分頁優化: LIMIT 100000, 10 極慢。改用 WHERE id > last_max_id LIMIT 10(游標分頁)或延遲關聯。
  4. 只讀副本: 讀寫分離,SELECT 落在 Replica 上,減輕 Primary 壓力。

安全提醒:防注入

  • 永遠使用預處理語句(mysqli_prepare / PDO::prepare)。
  • 識別符(表名、欄位名)不可參數化,需白名單驗證後拼接。

SELECT 是讀取資料的起點,也是效能調優的主戰場。熟練掌握語法變體、選對獲取模式、善用 LIMIT 分頁、嚴守記憶體釋放與防注入,讓每一次查詢都精準、高效、安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved