1 問題
SQL是一門需要進行編譯的語言,因此在實際執行過程中是需要數據庫編譯模塊進行編譯的。特別是在查詢的時候,對於別名的使用,不管是表還是列,錯誤的使用會導致查詢的失敗。
2 詳解
查詢語句遵循以下的查詢順序,從執行的順序來看,基本就可以看到select子句中列的別名是無法在group by和having等子句中出現的。
優先級 | 關鍵詞 | 備注 |
1 | FROM | from子句返回初始結果集 |
2 | ON | 排除不滿足join的條件的行 |
3 | JOIN | 多表關聯 |
4 | WHERE | 子句排除不滿足搜索條件的行 |
5 | GROUP BY | 子句將選定的行收集到group by子句中各個唯一值的組中 |
6 | HAVING | 子句排除不滿足搜索條件的行 |
7 | SELECT | 列名,此時可以為列名起別名,列名之間用逗號隔開 |
8 | DISTINCT | 可以在select子句中,找出唯一值 |
9 | ORDER BY | 對結果集進行排序 |
10 | LIMIT | 限定查詢的行數,一般放在查詢語句的最后面 |
簡單記為:from->where->group by->having->select->order by
3 總結
在mysql中,group by中可以使用列別名;where中不能使用列別名;order by中可以使用列別名。其余像oracle,hive中別名的使用都是嚴格遵循sql執行順序的,groupby后面不能用別名。mysql特殊是因為mysql中對查詢做了加強。