🔍 數據庫查詢
數據庫查詢是從數據庫中提取特定信息的強大工具。它們允許用戶根據各種條件過濾、排序和分析數據,將原始數據轉化為有意義的信息。
🧩 理解數據庫查詢
📊 什麼是查詢?
- 從數據庫請求數據或信息
- 提取符合特定條件的記錄的方法
- 對數據庫數據執行計算的工具
- 同時查看多個相關表格數據的方法
🎯 查詢的目的
- 從大型數據集中僅檢索所需的數據
- 回答關於數據的特定問題
- 執行計算和分析
- 為報表和表單準備數據
- 批量更新、添加或刪除記錄
🛠️ 數據庫查詢類型
🔎 選擇查詢
- 最常見的查詢類型
- 從一個或多個表格中檢索數據
- 允許過濾、排序和計算
- 返回可以查看、打印或導出的記錄集
- 不改變底層數據
選擇查詢示例:
SELECT FirstName, LastName, Grade
FROM Students
WHERE Grade > 80
ORDER BY LastName ASC;
🔄 動作查詢
📝 更新查詢
- 批量修改現有記錄
- 根據指定條件更改字段值
- 同時影響多個記錄
更新查詢示例:
UPDATE Students
SET Grade = Grade * 1.05
WHERE CourseID = 101;
➕ 追加查詢
- 將一個表格中的記錄添加到另一個表格
- 用於合併來自多個來源的數據
- 可以過濾要追加的記錄
追加查詢示例:
INSERT INTO ArchivedStudents
SELECT * FROM CurrentStudents
WHERE GraduationYear = 2024;
❌ 刪除查詢
- 刪除符合指定條件的記錄
- 永久刪除數據(謹慎使用)
- 通常用於數據清理或歸檔
刪除查詢示例:
DELETE FROM OrderDetails
WHERE OrderDate < '2023-01-01';
🏗️ 創建表格查詢
- 從查詢結果創建新表格
- 用於創建數據快照
- 有助於數據分析和報告
創建表格查詢示例:
SELECT StudentID, FirstName, LastName, AVG(Grade) AS AverageGrade
INTO StudentAverages
FROM Grades
GROUP BY StudentID, FirstName, LastName;
🔄 交叉表查詢
- 以類似電子表格的格式匯總數據
- 在行和列的交叉處顯示值
- 用於數據分析和比較
交叉表查詢示例:
TRANSFORM AVG(Grade)
SELECT StudentName
FROM Grades
GROUP BY StudentName
PIVOT Subject;
📋 查詢創建方法
🖌️ 使用查詢嚮導
- 打開數據庫應用程序(例如Microsoft Access)
- 選擇「創建查詢」或「查詢嚮導」
- 選擇查詢類型(簡單選擇、交叉表等)
- 選擇要包含的表格和字段
- 指定排序順序和過濾條件
- 命名並保存查詢
💻 使用查詢設計視圖
- 在設計視圖中創建新查詢
- 將表格添加到查詢
- 選擇要包含的字段
- 設置過濾條件
- 指定排序順序
- 運行並保存查詢
📝 使用SQL視圖
- 創建新查詢
- 切換到SQL視圖
- 直接編寫SQL語句
- 運行並保存查詢
🔍 查詢組件和條件
📊 字段和表格
- 選擇要包含在結果中的特定字段
- 使用關係連接多個表格
- 使用表達式創建計算字段
🔢 條件和運算符
- 比較運算符:=, <, >, <=, >=, <>
- 邏輯運算符:AND, OR, NOT
- 通配符:* (多個字符), ? (單個字符)
- 範圍運算符:BETWEEN
- 列表運算符:IN
- 空值:IS NULL, IS NOT NULL
條件示例:
-- 姓氏以'L'開頭的學生
WHERE LastName LIKE 'L*'
-- 價格在$10到$20之間的產品
WHERE Price BETWEEN 10 AND 20
-- 來自特定城市的訂單
WHERE City IN ('香港', '九龍', '新界')
-- 缺少電話號碼的記錄
WHERE PhoneNumber IS NULL
🔄 排序和分組
- 排序順序:升序或降序
- 多級排序:主要、次要等
- 分組:按共同值聚合記錄
- HAVING:基於聚合值過濾組
排序和分組示例:
-- 按姓氏然後名字排序
ORDER BY LastName ASC, FirstName ASC
-- 按產品分組銷售並計算總數
SELECT ProductName, SUM(Quantity) AS TotalSold
FROM Sales
GROUP BY ProductName
HAVING SUM(Quantity) > 100
🧮 高級查詢技術
🔄 連接
- 內部連接:返回兩個表格中具有匹配值的記錄
- 左連接:返回左表的所有記錄和右表的匹配記錄
- 右連接:返回右表的所有記錄和左表的匹配記錄
- 完全連接:當任一表格中有匹配時返回所有記錄
連接查詢示例:
SELECT Students.Name, Classes.ClassName
FROM Students
INNER JOIN Classes ON Students.ClassID = Classes.ClassID;
📊 聚合函數
- COUNT:記錄數量
- SUM:值的總和
- AVG:值的平均值
- MIN:最小值
- MAX:最大值
聚合查詢示例:
SELECT Subject, AVG(Grade) AS AverageGrade,
MIN(Grade) AS LowestGrade,
MAX(Grade) AS HighestGrade
FROM Grades
GROUP BY Subject;
🔄 子查詢
- 嵌套在其他查詢中的查詢
- 用於執行需要多個步驟的操作
- 可以出現在SELECT、FROM或WHERE子句中
子查詢示例:
SELECT StudentName
FROM Students
WHERE StudentID IN
(SELECT StudentID
FROM Grades
WHERE Grade > 90);
🔄 聯合查詢
- 合併來自多個SELECT語句的結果
- 默認情況下刪除重複記錄
- 要求所有SELECT語句中的列兼容
聯合查詢示例:
SELECT Name, 'Student' AS Type FROM Students
UNION
SELECT Name, 'Teacher' AS Type FROM Teachers
ORDER BY Name;
💼 實用查詢示例
📚 學術數據庫
-- 查找數學成績優異的學生
SELECT s.FirstName, s.LastName, g.Grade
FROM Students s
JOIN Grades g ON s.StudentID = g.StudentID
JOIN Subjects sub ON g.SubjectID = sub.SubjectID
WHERE sub.SubjectName = 'Mathematics' AND g.Grade >= 90
ORDER BY g.Grade DESC;
-- 按班級計算平均成績
SELECT c.ClassName, AVG(g.Grade) AS AverageGrade
FROM Classes c
JOIN Students s ON c.ClassID = s.ClassID
JOIN Grades g ON s.StudentID = g.StudentID
GROUP BY c.ClassName
ORDER BY AverageGrade DESC;
🛒 零售數據庫
-- 查找銷量最高的產品
SELECT p.ProductName, SUM(od.Quantity) AS TotalSold
FROM Products p
JOIN OrderDetails od ON p.ProductID = od.ProductID
GROUP BY p.ProductName
ORDER BY TotalSold DESC
LIMIT 10;
-- 計算月度銷售額
SELECT
YEAR(OrderDate) AS Year,
MONTH(OrderDate) AS Month,
SUM(TotalAmount) AS MonthlySales
FROM Orders
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
ORDER BY Year, Month;
🚀 查詢優化提示
⚡ 性能考慮
- 只選擇必要的字段
- 對用於過濾和排序的字段使用索引
- 限制通配符的使用,特別是在搜索詞的開頭
- 使用特定條件減少結果集
- 避免不必要的連接
🔍 常見問題故障排除
- 檢查SQL語句中的語法錯誤
- 驗證表格和字段名稱
- 確保正確的連接條件
- 分部測試複雜查詢
- 使用查詢分析工具解決性能問題
數據庫查詢是將數據轉化為可操作信息的強大工具。掌握查詢技術可以讓您從數據庫中精確提取所需的信息,支持更好的決策和數據分析。