Oracle之別名小結
MySQL表別名、字段別名注意事項
字段別名:可加 as ,也可以不加,可以加單|雙引號,也可以不加;
表別名:可加 as ,也可以不加,但是一定不能加單|雙引號!
Oracle:在oracle中,數據表別名不能加as
別名的使用原則
- 區別同名列的名稱
- 非法的表達式合法化
- 按照你的意願顯示列的名稱
- 特殊的別名要雙引
- 直接寫列的后面
- 使用as增加可讀性
- select sal as salary , hiredate "上班日期",sal*12 total_salary from emp;
- select sal as salary , hiredate as 日期 from emp;
今天在寫一個簡單的SQL語句並執行時拋出了如下圖所示的一個錯誤提示信息!
恩,此異常信息很明顯,在SQL語句中標示符的長度過長了,簡短一些就應該沒問題了,我查看了一下我的SQL語句發現是我的查詢字段的列別名過長,實際測試的結果為列字段別名的最大長度為30個字節!
注意:我的測試數據庫是ORACLE 11.2.0.4.0(如下圖所示)
ok,問題搞定了,對應的更多的錯誤信息及解決方案,也可以從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.
以上內容是我分析和解決我的SQL語句中,查詢時列的別名過長問題的過程,也是我分享這篇小博文的引子! 下面是我針對別名的一個小結(注意:我的測試數據庫是ORACLE 11.2.0.4.0 字符集是AMERICAN_AMERICA.AL32UTF8) 一:使用別名的好處 1)簡化SQL語句的書寫,特別是多表關聯查詢且表名較長時 2)增強SQL語句的可讀性,特別是當查詢出來的列字段較為復雜時效果更為明顯
二:測試小結
1)測試時使用的簡單表結構
CREATE TABLE SALES.STUDENT ( ID NUMBER, NAME VARCHAR2(20 BYTE), SEX CHAR(1 BYTE), BIRTHDAY DATE, HOBBY VARCHAR2(20 CHAR) )
2)測試使用的若干條測試數據
3)列名的最大長度為30個字節
SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE--30個英文大寫字符,正常執行 FROM STUDENT SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE1--多加另一個1就會報ORA-00972:identifier is to long FROM STUDENT SELECT ID 我們學校的好學生學號--10個中文漢字字符,正常執行 FROM STUDENT SELECT ID 我們學校的好學生學號1--多加另一個1就會報ORA-00972:identifier is to long FROM STUDENT
4)可以使用AS關鍵字定義列名,也可以不適用AS,列名后直接指定別名,以空格分開即可
SELECT ID AS 學號 FROM STUDENT
--使用AS的情況,正常執行 SELECT ID 學號 FROM STUDENT
--不使用AS也可以正常執行,而且代碼更簡潔,建議使用方式
5)以數字開頭的別名必須使用雙引號括起來
SELECT ID 123學號 FROM STUDENT
--執行時報"ORA-00923: FROM keyword not found where expected" SELECT ID "123學號"--正常執行
6)別名可以使用雙引號和不使用任何引號。(注意:全是英文的單引或雙引符號)
中文別名可以使用雙引號和不使用任何引號的
但是使用單引符號時報錯(任何列別名不能用單引號)
SELECT ID 學號 FROM STUDENT
--正常執行 SELECT ID "學號" FROM STUDENT
--正常執行 SELECT ID '學號' FROM STUDENT
--執行時報"ORA-00923: FROM keyword not found where expected" SELECT ID StudentId FROM STUDENT
--正常執行 SELECT ID "StudentId" FROM STUDENT
--正常執行 SELECT ID 'StudentId' FROM STUDENT
--執行時報"ORA-00923: FROM keyword not found where expected"
7)別名中使用了其他的特殊符號比如:別名中包含空格或者小括號(),則必須使用雙引號括起來(注意:其他的特殊符號可能類似,這里以小括號為例做了測試,其他情況如果感興趣可以自己動手試試)
SELECT ID AS (學號) FROM STUDENT
--英文小括號且使用AS的情形,執行時報"ORA-00923: FROM keyword not found where expected" SELECT ID (學號) FROM STUDENT
--英文小括號,執行時報"ORA-00904: "ID": invalid identifier" SELECT ID AS "(學號)" FROM STUDENT
--正常執行 SELECT ID AS(學號)FROM STUDENT
--中文小括號且使用AS的情形,執行時報"ORA-00923: FROM keyword not found where expected" SELECT ID(學號)FROM STUDENT
--中文小括號,執行時報"ORA-00904: "ID": invalid identifier" SELECT ID "(學號)" FROM STUDENT
--正常執行
SELECT ID 學 號--執行時報"ORA-00923: FROM keyword not found where expected"
FROM STUDENT
SELECT ID "學 號"--正常執行
FROM STUDENT
SELECT ID XUE HAO--執行時報"ORA-00923: FROM keyword not found where expected"
FROM STUDENT
SELECT ID "XUE HAO"--正常執行
FROM STUDENT
8)是否可以保留別名中的空格——可以,但必須使用雙引號括起來,如果指定的別名帶有雙引號,則子句中使用別名的時候必須帶雙引號,保持一致
SELECT ID "學 號" FROM STUDENT ORDER BY "學 號" DESC
--正常執行
9)使用別名時因SQL語句各子句的執行順序引起的問題
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的執行順序是有關的,SQL語句的執行順序大致如下所示:
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語句
我們可以看到SELECT子句是在WHERE子句執行后才執行的,當SELECT子句執行時查詢列的別名才生成,所以在 WHERE子句中根本看不到列的別名,當然,自然也就無法引用列的別名了。 所以字段、表達式的別名在WHERE子 句和GROUP BY子句都是不能使用的,而在ORDER BY中不僅可以使用別名,甚至可以直接使用欄位的下標來進行 排序,如:ORDER BY ID或者ORDER BY 1
SELECT ID ID_ FROM STUDENT WHERE ID_=11--執行時報"ORA-00904: "ID_": invalid identifier" SELECT ID ID_ FROM STUDENT WHERE ID=11--正常執行 SELECT ID ID_ FROM STUDENT WHERE ID='11'--正常執行,注意:ID是NUMBER類型的數據 SELECT ID ID_ FROM STUDENT WHERE ID="11"--執行時報"ORA-00904: "11": invalid identifier",注意:ID是NUMBER類型的數據 SELECT ID,COUNT(*) C FROM STUDENT GROUP BY ID HAVING C>0--執行時報"ORA-00904: "C": invalid identifier" SELECT ID,COUNT(*) C FROM STUDENT GROUP BY ID HAVING Count(*)>0--正常執行 SELECT ID,COUNT(*)C FROM STUDENT GROUP BY ID HAVING COUNT(*)>0 ORDER BY C--正常執行 SELECT ID ID_ FROM STUDENT ORDER BY ID_--正常執行 SELECT ID ID_ FROM STUDENT ORDER BY 1--正常執行
10)別名是否區分大小寫——區分大小寫(注意:當不用雙引號括起來的時候英文字符大小寫不敏感)
SELECT XUEHAO FROM (SELECT ID XUEHAO FROM STUDENT) WHERE XUEHAO > 1--正常執行 SELECT XUEHAO FROM (SELECT ID xuehao FROM STUDENT) WHERE XUEHAO > 1--正常執行 SELECT XUEHAO FROM (SELECT ID "XUEHAO" FROM STUDENT) WHERE XUEHAO > 1--正常執行 SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE XUEHAO > 1--執行時報"ORA-00904: "XUEHAO": invalid identifier" SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE xuehao > 1--執行時報"ORA-00904: "XUEHAO": invalid identifier" SELECT XUEHAO FROM (SELECT ID "xuehao" FROM STUDENT) WHERE "xuehao" > 1--執行時報"ORA-00904: "XUEHAO": invalid identifier" SELECT "xuehao" FROM (SELECT ID "xuehao" FROM STUDENT) WHERE "xuehao" > 1--正常執行
這個小例子也可以看到SQL語句是先執行WHERE子句然后才執行SELECT子句的!
ORACLE 在WHERE子句中引用列別名的問題
SQL> select sal,comm from emp 2 where sal<2000; SAL COMM --------- ---------- 800 1600 300 1250 500 1250 1400 1500 0 1100 950 1300 8 rows selected. SQL> select sal as salary,comm as commission from emp 2 where salary<2000; where salary<2000 * ERROR at line 2: ORA-00904: "SALARY": invalid identifier SQL> select * from 2 ( 3 select sal as salary,comm as commission from emp 4 ) x 5 where salary<2000; SALARY COMMISSION ---------- ---------- 800 1600 300 1250 500 1250 1400 1500 0 1100 950 1300 8 rows selected.
將取別名的查詢作為內聯視圖,便可以在外部查詢中引用其中的別名列。為什么要這么做呢?WHERE子句是在SELECT之前進行處理的,這樣,在處理求解“問題”查詢的WHERE子句之前,SALARY和COMMISSION並不存在,要到WHERE子句處理完成之后,別名才生效。然而,FROM子句是在WHERE之前處理的。將原查詢放在FROM子句中,那么,在最外層的WHERE子句之前,以及最外層的WHERE子句“看到”別名之前,就已經生成了查詢結果。
oracle 連接運算符,連接字符串,||雙豎線,在列別名上使用雙引號,使用帶有特殊字符的列別名 在列別名上使用雙引號 輸入並執行查詢: 1.SELECT ename AS "Name", sal*12+5000 AS "年度工資(加年終獎)" FROM emp; 1.SELECT ename AS "Name", sal*12+5000 AS "年度工資(加年終獎)" FROM emp; 顯示結果為:
1.Name 年度工資(加年終獎) 2. --------------- ---------------------------- 3. SMITH 14600 4. ALLEN 24200 1.Name 年度工資(加年終獎) 2. --------------- ---------------------------- 3. SMITH 14600 4. ALLEN 24200 說明:其中別名“Name”有大小寫的區別,別名“年度工資(加年終獎) ”中出現括號,屬於特殊符號,所以都需要使用雙引號將別名引起。
連接運算符 sql語句可以使用包含數值運算的計算列,顯示結果也是數值型的。我們也可以使用字符型的計算列,方法是在查詢中使用連接運算。連接運算符是雙豎線“||”。通過連接運算可以將兩個字符串連接在一起。 在查詢中使用連接運算。 輸入並執行查詢: 1.SELECT ename||job AS "雇員和職務表" FROM emp; 1.SELECT ename||job AS "雇員和職務表" FROM emp; 輸出結果為: 1.雇員和職務表 2. ------------------- 3. SMITHCLERK 4. ALLENSALESMAN 1.雇員和職務表 2. ------------------- 3. SMITHCLERK 4. ALLENSALESMAN 說明:在本例中,雇員名稱和職務列被連接成為一個列顯示。 在查詢中可以使用字符和日期的常量,表示固定的字符串或固定日期。字符和日期的常量需要用單引號引起。下一個訓練是作為上一個訓練的改進。 在查詢中使用字符串常量。 輸入並執行查詢: 1.SELECT ename|| ' IS '||job AS "雇員和職務表" FROM emp; 1.SELECT ename|| ' IS '||job AS "雇員和職務表" FROM emp; 輸出結果為: 1.雇員和職務表 2. ----------------------- 3. SMITH IS CLERK 4. ALLEN IS SALESMAN 1.雇員和職務表 2. ----------------------- 3. SMITH IS CLERK 4. ALLEN IS SALESMAN 說明:本練習中將雇員名稱、字符串常量“ IS ”和雇員職務3個部分連接在一起。