oracle别名小结
来源:互联网 发布:高频交易程序员 编辑:程序博客网 时间:2024/05/22 00:30
今天在写一个简单的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 STUDENTSELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE1--多加另一个1就会报ORA-00972:identifier is to longFROM STUDENTSELECT ID 我们学校的好学生学号--10个中文汉字字符,正常执行FROM STUDENTSELECT ID 我们学校的好学生学号1--多加另一个1就会报ORA-00972:identifier is to longFROM STUDENT
4)是否可以使用AS关键字——可以使用
SELECT ID AS 学号--使用AS的情况,正常执行FROM STUDENTSELECT ID 学号--不适用AS也可以正常执行,而且代码更简洁,建议使用方式FROM STUDENT
5)是否可以以数字开头——可以以数字开头但必须使用双引号括起来
SELECT ID 123学号--执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID "123学号"--正常执行
6)对于中文别名双引号、单引号、不使用引号的区别(注意:全是英文的单引或双引符号)——使用单引符号时报错
SELECT ID 学号--正常执行FROM STUDENTSELECT ID "学号"--正常执行FROM STUDENTSELECT ID '学号'--执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID StudentId--正常执行FROM STUDENTSELECT ID "StudentId"--正常执行FROM STUDENTSELECT ID 'StudentId'--执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENT
7)是否可以使用其他的特殊符号比如:小括号——可以使用但必须使用双引号括起来(注意:其他的特殊符号可能类似,这里以小括号为例做了测试,其他情况如果感兴趣可以自己动手试试)
SELECT ID AS (学号)--英文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID (学号)--英文小括号,执行时报"ORA-00904: "ID": invalid identifier"FROM STUDENTSELECT ID AS "(学号)"--正常执行FROM STUDENTSELECT ID AS(学号)--中文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID(学号)--中文小括号,执行时报"ORA-00904: "ID": invalid identifier"FROM STUDENTSELECT ID "(学号)"--正常执行FROM STUDENT
8)是否可以保留别名中的空格——可以,但必须使用双引号括起来
SELECT ID 学 号--执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID "学 号"--正常执行FROM STUDENTSELECT ID XUE HAO--执行时报"ORA-00923: FROM keyword not found where expected"FROM STUDENTSELECT ID "XUE HAO"--正常执行FROM STUDENT
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(*) CFROM STUDENTGROUP BY ID HAVING C>0--执行时报"ORA-00904: "C": invalid identifier" SELECT ID,COUNT(*) CFROM STUDENTGROUP BY ID HAVING Count(*)>0--正常执行 SELECT ID,COUNT(*)CFROM STUDENTGROUP BY ID HAVING COUNT(*)>0ORDER BY C--正常执行SELECT ID ID_FROM STUDENTORDER BY ID_--正常执行SELECT ID ID_FROM STUDENTORDER BY 1--正常执行
10)别名是否区分大小写——区分大小写(注意:当不用双引号括起来的时候英文字符大小写不敏感)
SELECT XUEHAOFROM (SELECT ID XUEHAO FROM STUDENT) WHERE XUEHAO > 1--正常执行SELECT XUEHAOFROM (SELECT ID xuehao FROM STUDENT) WHERE XUEHAO > 1--正常执行SELECT XUEHAOFROM (SELECT ID "XUEHAO" FROM STUDENT) WHERE XUEHAO > 1--正常执行SELECT XUEHAOFROM (SELECT ID "xuehao" FROM STUDENT) WHERE XUEHAO > 1--执行时报"ORA-00904: "XUEHAO": invalid identifier"SELECT XUEHAOFROM (SELECT ID "xuehao" FROM STUDENT) WHERE xuehao > 1--执行时报"ORA-00904: "XUEHAO": invalid identifier"SELECT XUEHAOFROM (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别名小结
- oracle 中文别名注意事项
- Oracle 表别名
- Oracle--select使用别名
- MySQL Oracle 别名
- Oracle:列别名
- Oracle创建表同义词(别名)
- oracle nvl 的别名问题
- oracle with as 表别名
- Oracle SQL 中文列别名
- SQL别名、Oracle字符串处理
- oracle with as 表别名
- oracle asm alias 文件别名
- oracle删除可以用别名
- Oracle 数据库-别名的使用
- 关于Oracle数据库起别名
- oracle给列取别名、给表取别名
- Oracle 小结
- 使用html2canvas实现浏览器截图
- 理解RESTful架构
- POJ 3415 Life Forms 给定n个字符串,求出现在不小于k个字符串中的最长子串。
- 进程IPC---管道和有名管道
- [数论][莫队][莫比乌斯反演] hdu 4676 Sum Of Gcd
- oracle别名小结
- Flask-sqlalchemy连接数据库
- ubuntu下postgreSQL9.6安装配置
- oracle、mysql、PostgreSQL有关时间查询和时间切割
- 第一章-1.5.1节
- 【软件工程考研】考研准备第一个月tag
- jdbc-jpa
- Map原理分析
- 1040. 有几个PAT(25)