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

6 條高效實用的 MySQL 進階查詢語句,告別 PHP 層繁瑣邏輯

     編輯:MySQL 綜合教學

前言

許多開發者習慣在應用層(如 PHP)處理複雜的數據邏輯,實則 MySQL 內建函數與進階語法完全能勝任,且性能更優、代碼更簡潔。本文精選 6 條高頻實用的 SQL 技巧,涵蓋年齡計算、時間差、去重統計、工作日計算、主鍵查詢與庫大小監控,助你將邏輯下沉至數據層。

1. 精確計算年齡(按出生日期)

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(@dateofbirth)), '%Y') + 0;

原理: `TO_DAYS` 將日期轉為天數 -> 相減得天數差 -> `FROM_DAYS` 轉回日期 -> `DATE_FORMAT` 取年份部分 -> `+0` 隱式轉為整數。此法自動處理閏年與月份邊界,比簡單的 `YEAR(NOW()) - YEAR(birth)` 精確。

2. 靈活計算兩個 DATETIME 的時間差

-- 秒差
UNIX_TIMESTAMP(dt2) - UNIX_TIMESTAMP(dt1)
-- 分鐘差
(UNIX_TIMESTAMP(dt2) - UNIX_TIMESTAMP(dt1)) / 60
-- 小時差
... / 3600
-- 天數差
... / 86400

優勢: 利用 Unix 時間戳(秒級整數)做減法,避開 `TIMEDIFF`/`DATEDIFF` 的格式限制,任意精度隨意轉換。

3. 查詢某列值出現恰好 N 次的記錄

SELECT id
FROM tbl
GROUP BY id
HAVING COUNT(*) = N;

場景: 找出重複 N 次的訂單號、登錄 IP、設備 ID 等。`HAVING` 過濾聚合後結果,比子查詢更直觀高效。

4. 計算兩日期間的工作日數(排除周末/假期)

SELECT COUNT(*)
FROM calendar
WHERE d BETWEEN @Start AND @Stop
  AND DAYOFWEEK(d) NOT IN (1, 7)  -- 1=周日, 7=周六
  AND holiday = 0;                -- 假期表標記

前置條件: 需一張 `calendar` 維度表(含全量日期 `d`、是否假期 `holiday` 欄位)。這是數據倉庫維度建模的典型應用,極大簡化業務邏輯。

5. 快速查詢指定表的主鍵欄位名

SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
  USING (constraint_name, table_schema, table_name)
WHERE t.constraint_type = 'PRIMARY KEY'
  AND t.table_schema = 'your_db'
  AND t.table_name = 'your_table';

用途: 動態生成代碼、元數據同步、自動化遷移腳本中獲取主鍵名,無需硬編碼。

6. 監控各數據庫佔用磁盤空間大小(含碎片空間)

SELECT
  table_schema AS `Db Name`,
  ROUND(SUM(data_length + index_length) / 1024 / 1024, 3) AS `Db Size (MB)`,
  ROUND(SUM(data_free) / 1024 / 1024, 3) AS `Free Space (MB)`
FROM information_schema.tables
GROUP BY table_schema;

指標說明:

  • data_length + index_length:實際數據+索引大小。
  • data_free:已分配但未使用的碎片空間(InnoDB 表常見),`OPTIMIZE TABLE` 可回收。

定時跑此查詢可及時發現膨脹庫、碎片率高的表,指導維護策略。

結語

將計算邏輯下推到 MySQL 層,不僅減少網絡傳輸與應用層 CPU 開銷,更能利用數據庫優化器與索引優勢。這 6 條語句覆蓋了業務開發中高頻的「時間、統計、元數據、資源」四大維度,建議收藏備查,逐步替換應用層同類邏輯。

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