最近在做一個數據庫的大作業,算是複習了下MySql裏面比較複雜的一些語句的用法,如Left Join之類的。在這裏就不對具體語法進行記錄了,希望能在以後經常用到,而不是隔好長時間用一次。在這裏就記錄下MySql語句的執行順序就好了。
首先,SELECT語句的基本語法如下:
SELECT selection_list # What columns to select
FROM table_list # Which tables to select rows from
WHERE primary_constraint # What conditions rows must satisfy
GROUP BY grouping_columns # How to group results
HAVING secondary_constraint # Secondary conditions rows must satisfy
ORDER BY sorting_columns # How to sort results
LIMIT from, count; # Limiting row count on results
對於MySQL,除了第一行,其他部分都是可選的,有的DBMS要求FROM從句也是必須的。
SQL Select語句完整的執行順序【從DBMS使用者角度】:
1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將數據劃分爲多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序。
SQL Select語句的執行步驟【從DBMS實現者角度,這個對我們用戶意義不大】:
1)語法分析,分析語句的語法是否符合規範,衡量語句中各表達式的意義。
2) 語義分析,檢查語句中涉及的所有數據庫對象是否存在,且用戶有相應的權限。
3)視圖轉換,將涉及視圖的查詢語句轉換爲相應的對基表查詢語句。
4)表達式轉換, 將複雜的 SQL 表達式轉換爲較簡單的等效連接表達式。
5)選擇優化器,不同的優化器一般產生不同的“執行計劃”
6)選擇連接方式, ORACLE 有三種連接方式,對多表連接 ORACLE 可選擇適當的連接方式。
7)選擇連接順序, 對多表連接 ORACLE 選擇哪一對錶先連接,選擇這兩表中哪個表做爲源數據表。
8)選擇數據的搜索路徑,根據以上條件選擇合適的數據搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。
9)運行“執行計劃”。
舉例說明:
SELECTstate AS State,AVG((TO_DAYS(death)-TO_DAYS(birth))/365) AS Age
FROM president
WHERE death IS NOT NULL
GROUP BY state
ORDER BY Age;
這句SQL查詢的意思是:
從總統表中查詢已經死亡的總統,然後按州分組,然後針對每個組計算總統的平均壽命【AVG((TO_DAYS(death)-TO_DAYS(birth))/365)】,然後按壽命升序排列。
最後的結果就是類似這個樣子:
+-------+-----------+
| State | Age |
+-------+-----------+
| KY | 56.208219 |
| VT | 58.852055 |
| NC | 60.141096 |
| OH | 62.866145 |
| NH | 64.917808 |
| NY | 69.342466 |
| NJ | 71.315068 |
| TX | 71.476712 |
| MA | 72.642009 |
| VA | 72.822945 |
| PA | 77.158904 |
| SC | 78.284932 |
| CA | 81.336986 |
| MO | 88.693151 |
| IA | 90.254795 |
| IL | 93.391781 |
+-------+-----------+