Oracle別名使用要點(diǎn)小結(jié)
今天在寫一個簡單的SQL語句并執(zhí)行時(shí)拋出了如下圖所示的一個錯誤提示信息!
恩,此異常信息很明顯,在SQL語句中標(biāo)示符的長度過長了,簡短一些就應(yīng)該沒問題了,我查看了一下我的SQL語句發(fā)現(xiàn)是我的查詢字段的列別名過長,實(shí)際測試的結(jié)果為列字段別名的最大長度為30個字節(jié)!
注意:我的測試數(shù)據(jù)庫是ORACLE 11.2.0.4.0(如下圖所示)
ok,問題搞定了,對應(yīng)的更多的錯誤信息及解決方案,也可以從ORACLE的錯誤信息手冊中查詢比如(針對此問題):
Error:
ORA-00972: identifier is too long
Cause:
You tried to reference a table, cluster, view, index, synonym, tablespace, or username with a value that was longer than 30 characters.
Action:
The options to resolve this Oracle error are:
Names for tables, clusters, views, indexes, synonyms, tablespaces, and usernames must be 30 characters or less. You must shorten the name to no more than 30 characters for these objects.
以上內(nèi)容是我分析和解決我的SQL語句中,查詢時(shí)列的別名過長問題的過程,也是我分享這篇小博文的引子!
下面是我針對別名的一個小結(jié)(注意:我的測試數(shù)據(jù)庫是ORACLE 11.2.0.4.0 字符集是AMERICAN_AMERICA.AL32UTF8)
一:使用別名的好處
1)簡化SQL語句的書寫,特別是多表關(guān)聯(lián)查詢且表名較長時(shí)
2)增強(qiáng)SQL語句的可讀性,特別是當(dāng)查詢出來的列字段較為復(fù)雜時(shí)效果更為明顯
二:測試小結(jié)
1)測試時(shí)使用的簡單表結(jié)構(gòu)
CREATE TABLE SALES.STUDENT ( ID NUMBER, NAME VARCHAR2(20 BYTE), SEX CHAR(1 BYTE), BIRTHDAY DATE, HOBBY VARCHAR2(20 CHAR) )
2)測試使用的若干條測試數(shù)據(jù)
3)列名的最大長度——30個字節(jié)
SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE--30個英文大寫字符,正常執(zhí)行 FROM STUDENT SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE1--多加另一個1就會報(bào)ORA-00972:identifier is to long FROM STUDENT SELECT ID 我們學(xué)校的好學(xué)生學(xué)號--10個中文漢字字符,正常執(zhí)行 FROM STUDENT SELECT ID 我們學(xué)校的好學(xué)生學(xué)號1--多加另一個1就會報(bào)ORA-00972:identifier is to long FROM STUDENT
4)是否可以使用AS關(guān)鍵字——可以使用
SELECT ID AS 學(xué)號--使用AS的情況,正常執(zhí)行 FROM STUDENT SELECT ID 學(xué)號--不適用AS也可以正常執(zhí)行,而且代碼更簡潔,建議使用方式 FROM STUDENT
5)是否可以以數(shù)字開頭——可以以數(shù)字開頭但必須使用雙引號括起來
SELECT ID 123學(xué)號--執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID "123學(xué)號"--正常執(zhí)行
6)對于中文別名雙引號、單引號、不使用引號的區(qū)別(注意:全是英文的單引或雙引符號)——使用單引符號時(shí)報(bào)錯
SELECT ID 學(xué)號--正常執(zhí)行 FROM STUDENT SELECT ID "學(xué)號"--正常執(zhí)行 FROM STUDENT SELECT ID '學(xué)號'--執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID StudentId--正常執(zhí)行 FROM STUDENT SELECT ID "StudentId"--正常執(zhí)行 FROM STUDENT SELECT ID 'StudentId'--執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT
7)是否可以使用其他的特殊符號比如:小括號——可以使用但必須使用雙引號括起來(注意:其他的特殊符號可能類似,這里以小括號為例做了測試,其他情況如果感興趣可以自己動手試試)
SELECT ID AS (學(xué)號)--英文小括號且使用AS的情形,執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID (學(xué)號)--英文小括號,執(zhí)行時(shí)報(bào)"ORA-00904: "ID": invalid identifier" FROM STUDENT SELECT ID AS "(學(xué)號)"--正常執(zhí)行 FROM STUDENT SELECT ID AS(學(xué)號)--中文小括號且使用AS的情形,執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID(學(xué)號)--中文小括號,執(zhí)行時(shí)報(bào)"ORA-00904: "ID": invalid identifier" FROM STUDENT SELECT ID "(學(xué)號)"--正常執(zhí)行 FROM STUDENT
8)是否可以保留別名中的空格——可以,但必須使用雙引號括起來
SELECT ID 學(xué) 號--執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID "學(xué) 號"--正常執(zhí)行 FROM STUDENT SELECT ID XUE HAO--執(zhí)行時(shí)報(bào)"ORA-00923: FROM keyword not found where expected" FROM STUDENT SELECT ID "XUE HAO"--正常執(zhí)行 FROM STUDENT
9)使用別名時(shí)因SQL語句各子句的執(zhí)行順序引起的問題
ORACLE中的SQL語句,
1.WHERE/GROUP BY/HAVING子句中只能直接使用欄位或者常量,而不能使用欄位的別名,除非這個別名來自 子查詢之中,如:SELECT .... FROM (SELECT COLUMN_NAME C FROM TABLE_NAME) WHERE C > 1
2.而ORDER BY 則可以直接使用別名,如SELECT COLUMN_NAME C FROM TABLE_NAME ORDER BY C
這和SQL的執(zhí)行順序是有關(guān)的,SQL語句的執(zhí)行順序大致如下所示:
1. FROM語句
2. WHERE語句(結(jié)合條件)
3. START WITH語句
4. CONNECT BY語句
5. WHERE語句
6. GROUP BY語句
7. HAVING語句
8. MODEL語句
9. SELECT語句
10. UNION、MINUS、INTERSECT等集合演算演算
11. ORDER BY語句
我們可以看到SELECT子句是在WHERE子句執(zhí)行后才執(zhí)行的,當(dāng)SELECT子句執(zhí)行時(shí)查詢列的別名才生成,所以在 WHERE子句中根本看不到列的別名,當(dāng)然,自然也就無法引用列的別名了。 所以字段、表達(dá)式的別名在WHERE子 句和GROUP BY子句都是不能使用的,而在ORDER BY中不僅可以使用別名,甚至可以直接使用欄位的下標(biāo)來進(jìn)行 排序,如:ORDER BY ID或者ORDER BY 1
SELECT ID ID_ FROM STUDENT WHERE ID_=11--執(zhí)行時(shí)報(bào)"ORA-00904: "ID_": invalid identifier" SELECT ID ID_ FROM STUDENT WHERE ID=11--正常執(zhí)行 SELECT ID ID_ FROM STUDENT WHERE ID='11'--正常執(zhí)行,注意:ID是NUMBER類型的數(shù)據(jù) SELECT ID ID_ FROM STUDENT WHERE ID="11"--執(zhí)行時(shí)報(bào)"ORA-00904: "11": invalid identifier",注意:ID是NUMBER類型的數(shù)據(jù) SELECT ID,COUNT(*) C FROM STUDENT GROUP BY ID HAVING C>0--執(zhí)行時(shí)報(bào)"ORA-00904: "C": invalid identifier" SELECT ID,COUNT(*) C FROM STUDENT GROUP BY ID HAVING Count(*)>0--正常執(zhí)行 SELECT ID,COUNT(*)C FROM STUDENT GROUP BY ID HAVING COUNT(*)>0 ORDER BY C--正常執(zhí)行 SELECT ID ID_ FROM STUDENT ORDER BY ID_--正常執(zhí)行 SELECT ID ID_ FROM STUDENT ORDER BY 1--正常執(zhí)行
10)別名是否區(qū)分大小寫——區(qū)分大小寫(注意:當(dāng)不用雙引號括起來的時(shí)候英文字符大小寫不敏感)
SELECT XUEHAO FROM (SELECT ID XUEHAO FROM STUDENT) WHERE XUEHAO > 1--正常執(zhí)行 SELECT XUEHAO FROM (SELECT ID xuehao FROM STUDENT) WHERE XUEHAO > 1--正常執(zhí)行 SELECT XUEHAO FROM (SELECT ID "XUEHAO" FROM STUDENT) WHERE XUEHAO > 1--正常執(zhí)行 SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE XUEHAO > 1--執(zhí)行時(shí)報(bào)"ORA-00904: "XUEHAO": invalid identifier" SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE xuehao > 1--執(zhí)行時(shí)報(bào)"ORA-00904: "XUEHAO": invalid identifier" SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE "xuehao" > 1--執(zhí)行時(shí)報(bào)"ORA-00904: "XUEHAO": invalid identifier" SELECT "xuehao" FROM (SELECT ID "xuehao" FROM STUDENT) WHERE "xuehao" > 1--正常執(zhí)行
這個小例子也可以看到SQL語句是先執(zhí)行WHERE子句然后才執(zhí)行SELECT子句的!
總結(jié)
到此這篇關(guān)于Oracle別名使用要點(diǎn)小結(jié)的文章就介紹到這了,更多相關(guān)Oracle別名使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle查看執(zhí)行計(jì)劃的實(shí)現(xiàn)
查看Oracle 的執(zhí)行計(jì)劃的目的是為了了解 SQL 查詢或語句在數(shù)據(jù)庫中的執(zhí)行方式和性能表現(xiàn),本文主要介紹了Oracle查看執(zhí)行計(jì)劃的實(shí)現(xiàn),感興趣的可以了解一下2024-02-02將mysql轉(zhuǎn)換到oracle必須了解的50件事
我其實(shí)是同一天看到Robert Treat幾人整理的”Mysql 遷移到Oracle前需要了解的50件事“與Baron Schwartz的”O(jiān)racle遷移到Mysql之前需要了解的50件事“的,只是Baron Schwartz的這個列表可能對大家更加有用處,也就先將其整出來了.2010-06-06WMware redhat 5 oracle 11g 安裝方法
本文將詳細(xì)介紹WMware中redhat 5 安裝oracle 11g方法,需要的朋友可以參考下2012-12-12