昨天缺少的UD:
SQL 查詢與排序(ResultSet、ORDER BY)
目的:讓搜尋、列表與排序由SQL來處理
一、為什麼要讓 SQL 處理查詢與排序
在前幾天我已經學會用 SQL CRUD 操作(新增、修改、刪除)。但在那時,我仍然是把資料取出後,用 Java for 迴圈或 sort() 排序。這樣做雖然能動,但效率不高。當資料變多時讓資料庫自己處理排序會更快、更準、更方便。
二、SQL 查詢的核心:SELECT
SELECT 是用來「讀取資料」的指令,可以選出要顯示的欄位、條件,並搭配排序。
最基本格式:
SELECT 欄位1, 欄位2 FROM 表格名稱 WHERE 條件 ORDER BY 欄位 ASC|DESC;
例子:
SELECT name, age FROM students;
SELECT name, age FROM students WHERE age > 18;
SELECT name, age FROM students ORDER BY age DESC;
三、關鍵字說明
關鍵字 功能
SELECT 選擇要顯示的欄位
FROM 指定要查詢的資料表
WHERE 設定查詢條件(例如年齡 > 18)
ORDER BY 設定排序欄位與方向(ASC = 升冪、DESC = 降冪)
LIKE 模糊搜尋(例如找出名字中含有 “Li” 的學生)
四、ResultSet:Java 如何接收查詢結果
在 JDBC 中,執行 SELECT 查詢後會回傳一個 ResultSet 物件。
這個物件就像「查詢結果的游標」,可以逐列(row)讀出資料。
邏輯流程:
1.送出查詢語句(例如 SELECT * FROM students)
2.資料庫回傳結果集(ResultSet)
3.Java 透過 while (rs.next()) 逐筆取出欄位值(例如 rs.getString("name")rs.getInt("age"))
五、查詢、搜尋與排序三種常見操作
列出所有學生(List Students)
讓 SQL 一次選出全部學生並依 id 排序:
SELECT name, age FROM students ORDER BY id;
搜尋學生(Search)
找出名字中包含 「Li」 的學生:
SELECT name, age FROM students WHERE name LIKE '%Li%';
代表任意字串。
這樣可以搜尋 “Li”、 “Lily”、 “William” 等。
排序(Order By)
按名字排序:
SELECT * FROM students ORDER BY name ASC;
按年齡降序排序:
SELECT * FROM students ORDER BY age DESC, name ASC;
多欄排序可以用「逗號」連接,例如先比年齡、再比名字。
六、為什麼要交給資料庫處理?
做法 優點 缺點
用 Java 排序 實作簡單、控制自由 效能差、要把整份資料拉回來
用 SQL ORDER BY 效率高、可直接限制筆數、減少傳輸 要會寫 SQL 語法
資料庫的排序與搜尋在底層是經過索引優化的。
對於幾百、幾千筆資料,速度通常是 Java 手動排序的數十倍以上。
八、學習重點整理
SELECT 用來查詢資料
WHERE 限制條件(篩選資料)
ORDER BY 排序(ASC 升冪、DESC 降冪)
LIKE 模糊搜尋
ResultSet Java 端讀取查詢結果的容器
分層架構 查詢邏輯寫在 SqliteStudentRepository,而非 StudentManager