SQL语句中,为什么where子句不能使用列别名,而order by却可以?
? 例如下面的SQL語句: select?id,?(c1?+?c2)?as?s?from?t1??where?s?>?100?
? SQL Server 報錯: ?"列名 s 無效"?
??
? 當然,寫成?
??? select?id,?(c1?+?c2)?as?s?from?t1??where?(c1?+?c2)?>?100
? 就沒問題了.?
? 可是當表達式復雜時就很繁瑣了.?
??
? 有沒有可以在Where中使用這樣的列名的辦法??
? 或者有什么其他辦法可以解決這類問題呢??
解決方法:
SQL code 復制代碼
?????????????????????? 由于在Where語句不能直接使用列別名,因此我們需要將Sql語句給包裝一下
?????????????????????? 在ORACLE中,在WHERE子句中引用列別名會出錯,這是為什么呢?
?????????????????????? 因為:SELECT 語句的執行順序
?????????????????????? 1. from語句
?????????????????????? 2. where語句(結合條件)
?????????????????????? 3. start with語句
?????????????????????? 4. connect by語句
?????????????????????? 5. where語句
?????????????????????? 6. group by語句
?????????????????????? 7. having語句
?????????????????????? 8. model語句
?????????????????????? 9. select語句
?????????????????????? 10. union、minus、intersect等集合演算演算
?????????????????????? 11. order by語句
sqlserver查詢的執行順序是: (1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> (2)WHERE <where_predicate> (3)GROUP BY <group_by_specification> (4)HAVING <having_predicate> (5)SELECT DISTINCT TOP(<top_specification>) <select_list> (6)ORDER BY <order_by_list> 所以在where執行的時候,別名還不存在,而order by的時候已經存在
因為sql是在where后order by前加別名,即生成結果集后加別名,where是在生成結果集前的操作,order by是生成結果集后的操作,因為where要生成結果集,而order by是對結果集的操作。如果非要用別名,那么只能用派生表,即先生成別名再where select * from ( select 字段1 as A,字段2 as B.... from tablename ) aaa where A=1
order by A
----------------------------------------------------------------------------------------------------------------------------------------------------------------
當select的表達式很長時,我們經常會用as子句為該表達式指定別名,然而卻發現無法在Where條件中直接使用該別名作為判斷條件.?
例如下面的SQL語句:?
select id, (c1 + c2) as s from t1 where s > 100?
運行會報錯: “列名 s 無效”?
當然,寫成?
select id, (c1 + c2) as s from t1 where (c1 + c2) > 100?
就可以。
SQL語句中,為什么where子句不能使用列別名,而order by卻可以??
在ORACLE中,select 語句的執行順序是:?
1. from語句?
2. where語句(結合條件)?
3. start with語句?
4. connect by語句?
5. where語句?
6. group by語句?
7. having語句?
8. model語句?
9. select語句?
10. union、minus、intersect等集合演算演算?
11. order by語句
在SQLServer中,select語句的執行順序是:?
(1)FROM JOIN ON?
(2)WHERE?
(3)GROUP BY?
(4)HAVING?
(5)SELECT DISTINCT TOP()?
(6)ORDER BY
由select語句的執行順序,我們可以發現在where子句執行的時候,取別名的語句還沒執行,即該別名不存在,自然就不能使用了,而order by的時候別名就已經命名好了。
我們還可以知道:如果在from子句中指定了表別名,那么它所在的select 語句中其他子句都必須使用表別名來代替原始的表名,因為from子句是select語句中最先被執行的。
總結
以上是生活随笔為你收集整理的SQL语句中,为什么where子句不能使用列别名,而order by却可以?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机中imb二进制数,计算机基础知识总
- 下一篇: Pyecharts 1.7.0制作图表,