程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql技術內幕-筆記-第三章 查詢處理

Mysql技術內幕-筆記-第三章 查詢處理

編輯:MySQL綜合教程

第三章 查詢處理

邏輯查詢處理:(8) SELECT (9) DISTINCT <select_list>

                   (1) FROM <left_table>

                   (3) <join_type> JOIN <right_table>

SELECT一共有3個過濾過程,WHERE,ON,HAVING, ON是最先執行的過濾過程。

WHERE過濾器中:

  1.由於數據還沒有分組,因此現在還不能在WHERE過濾器中使用where_condition=MIN(col)這類對攻擊的過濾

  2.由於還沒有進行列的選取操作,因此在SELECT中使用列的別名也是不被允許的,如SELECT city AS c FROM t WHERE c='ShangHai'是不允許出現的。

在WHERE過濾器中進行的過濾和在ON過濾器中進行的過濾是有所不同的。對於OUTERJOIN中的過濾,在ON過濾器過濾完之後還會添加保留表中被ON條件過濾掉的記錄,而WHERE條件中被過濾掉的記錄則是永久的過濾。在INNER JOIN中兩者是沒有差別的,因為沒有添加外部行的操作。

  3. HAVING是對分組條件進行過濾的篩選器,子查詢不能用作分組的聚合函數,如HAVING COUNT(SELECT ...)<2是不合法的。

  4. SELECT:列的別名不能在SELECT中的其他別名表達式中使用,如:

  mysql>SELECT order_id AS o, o+1 AS n FROM orders;

  

  5. DISTINCT: 如果在查詢中指定了DISTINCT子句,則會創建一張內存臨時表(如果內存中存放不下就放到磁盤上)。這張內存臨時表的表結構和上一步產生的虛擬表一樣,不同的是對進行DISTINCT操作的列增加了一個唯一索引,以此來去除重復數據。另外,對於使用了GROUP BY的查詢,在使用DISTINCT是多余的,因為已經進行分組了,不會移除任何行。

  6. 大多數DBA和開發人員都錯誤的認為在選取表中的數據時,記錄會按照表中主鍵的大小順序的取出,即結果像進行了ORDER BY一樣。導致這個經典錯誤的原因主要是沒有理解什麼才是真正的關系數據庫。數據庫中常見的查詢操作其實對應的是集合的某些運算:選擇、投影、連接、並、交、差、除。最終的結果雖然是以一張二維表的方式呈現在用戶面前,但是從數據庫內部來看是一系列的集合操作。因此,對於表中的記錄,用戶需要以集合的思想來理解。沒有ORDER BY子句的查詢只代表從集合中查詢數據,而集合是沒有順序概念的。因此要牢記,不用為表中的行假設任何特定的順序。

  7. LIMIT:從上一步驟的虛擬表中選出從指定位置開始的指定行數據。對應沒有應用ORDER BY的LIMIT字句,結果同樣可能是無序的,因此LIMIT子句通常和ORDER BY一起使用。

  LIMIT n,m

      表示從第n條記錄開始選擇m條記錄。而大多數開發人員喜歡使用這類語句來解決web中經典的分頁問題。對於小規模的數據,這並不會有太大的問題。但是對於大規模數據來說,LIMIT n,m效率是十分低的。因為每次都需要對數據進行選取。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved