mysql查詢模型

緣起

從"燕十八"接觸到 "MySQL 查詢模型",對 SQL 語句的理解有醍醐灌頂之感.
贈人玫瑰, 手有餘香, 分享本身對這一模型的理解.mysql

先說結論

把數據庫表的"列"當作"變量",把" SQL 查詢語句"理解成編程語言中的"流程控制語句".sql

4 個要點:數據庫

  1. 把"列"當作"變量", "變量"是能夠計算的;
  2. WHERE是"布爾表達式/判斷條件", 它的值爲"true/false";
  3. FROM是指定"循環遍歷"的範圍
  4. WHERE爲true時, 就將這一行的數據提取出來;

查詢模型

好比對於下面的數據:編程

id name age
1 ober 89
2 lucy 17
3 lilei 19

SQL 查詢語句 SELECT name, age FROM user WHERE id = 2
能夠理解成"編程中的循環判斷控制語句":數組

  1. 把"列" (id/name/age) 當作"變量", 程序會循環歷遍每行數據;
  2. WHERE是表達式, id = 2是判斷條件(布爾表達式), 它的值爲"true/false";
  3. 若是判斷id = 2爲true時, 就執行SELECT name, age,把變量name和age取出來;
  4. 若是判斷id = 2爲false, 則完成此次判斷, 讀取下一行, 更新變量爲下一行的值, 繼續判斷;
  5. 因此這句 SQL 語句能夠理解成**"在 user 中遍歷檢索, 當WHRER uid = 2爲真時, 執行SELECT name, age:
for (i = 0; i < count(*), i++){
    if (uid = 2){
      SELECT name, age;
  }
}
複製代碼

延伸

理解"計算字段"

既然將"列"理解成"變量",而"變量"是能夠計算的, 就很容易理解"計算字段"的概念:bash

  • "拼接字段"就是字符串運算符, 或者說格式化輸出
  • 算數計算:
SELECT name, age+1 FROM user WHERE uid=2    /* 輸出時age+1 */
複製代碼

理解"別名"

"別名",也是"變量", 好比編程語言

SELECT AVG(prod_price) AS avg_price FROM Products;
複製代碼

表示檢索出Products表中全部產品的平均價格, 該平均價格賦給別名avg_price (相似於變量)fetch

理解"OFFSET"

數據庫表的數據相似用"數組"形式組織, 就像mysqli_fetch_assoc提取的數組, 數組的索引位置就是從0開始算起. 若是SELECT查詢時添加OFFSET 1條件,將會檢索第2行, 而不是第1行, 由於第1個被檢索的行是第0行, 而不是第1行;ui

理解 where 1

提問:
SQL 查詢語句 SELECT * FROM user WHERE 1 將會如何執行?spa

解答:
由於 WHERE 是表達式/判斷條件, 而 1 表示 true , 因此判斷條件永遠爲 true,所以前面的 SQL 語句會遍歷檢索出全部的數據.
若是換成 SELECT * FROM user WHERE 0 或者 SELECT * FROM user WHERE false, 就不執行 SELECT, 不返回數據.

PS. 不光是 1 表示 true, "2, 3, 4..."也能夠.

相關文章
相關標籤/搜索