Oracle别名使用要点小结

目录
  • 一:使用别名的好处
  • 二:测试小结
  • 总结

今天在写一个简单的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关键字——可以使用

SELECT ID AS 学号--使用AS的情况,正常执行
FROM STUDENT

SELECT ID 学号--不适用AS也可以正常执行,而且代码更简洁,建议使用方式
FROM STUDENT

5)是否可以以数字开头——可以以数字开头但必须使用双引号括起来

SELECT ID 123学号--执行时报"ORA-00923: FROM keyword not found where expected"
FROM STUDENT

SELECT ID "123学号"--正常执行

6)对于中文别名双引号、单引号、不使用引号的区别(注意:全是英文的单引或双引符号)——使用单引符号时报错

SELECT ID 学号--正常执行
FROM STUDENT

SELECT ID "学号"--正常执行
FROM STUDENT

SELECT ID '学号'--执行时报"ORA-00923: FROM keyword not found where expected"
FROM STUDENT

SELECT ID StudentId--正常执行
FROM STUDENT

SELECT ID "StudentId"--正常执行
FROM STUDENT

SELECT 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 STUDENT

SELECT ID (学号)--英文小括号,执行时报"ORA-00904: "ID": invalid identifier"
FROM STUDENT

SELECT ID AS "(学号)"--正常执行
FROM STUDENT

SELECT ID AS(学号)--中文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected"
FROM STUDENT

SELECT ID(学号)--中文小括号,执行时报"ORA-00904: "ID": invalid identifier"
FROM STUDENT

SELECT ID "(学号)"--正常执行
FROM STUDENT

8)是否可以保留别名中的空格——可以,但必须使用双引号括起来

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

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别名使用要点小结的文章就介绍到这了,更多相关Oracle别名使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • sqlserver中delete、update中使用表别名和oracle的区别

    昨天发现程序中数据分析的结果不对,重新进行分析后,原数据仍在,有值的字段被累计.心说,不对啊,是重新生成记录后才分析的啊.难道忘了DELETE了?查代码,发现有删除语句.于是在查询分析器中执行,报错.反复试几次,明白了,Delete From不认表名别名!回头想下,当初程序改完后主要是在Oracle中测的,SQLServer一直没细测. 之所以要用别名,是因为where条件中需要用到子查询写一些条件,下面不写那么复杂,仅说明一下问题. 结论: (ORACLE适用)    DELETE FROM

  • Oracle别名使用要点小结

    目录 一:使用别名的好处 二:测试小结 总结 今天在写一个简单的SQL语句并执行时抛出了如下图所示的一个错误提示信息! 恩,此异常信息很明显,在SQL语句中标示符的长度过长了,简短一些就应该没问题了,我查看了一下我的SQL语句发现是我的查询字段的列别名过长,实际测试的结果为列字段别名的最大长度为30个字节! 注意:我的测试数据库是ORACLE 11.2.0.4.0(如下图所示) ok,问题搞定了,对应的更多的错误信息及解决方案,也可以从ORACLE的错误信息手册中查询比如(针对此问题): Err

  • sql查询给表起别名要点小结(涉及嵌套查询)

    目录 可以通过空格或者as给表起别名 简单查询中使用别名 复杂查询中使用别名 总结 可以通过空格或者as给表起别名 但是注意如果操作的数据库是Oracle的话,只能使用空格,as不符合Oracle的语法. 举个栗子 简单查询中使用别名 select * from student s where s.id = '10'; 在简单的查询中使用别名,一般没有特别需要注意的地方,要做的操作少 复杂查询中使用别名 题目概要:有三个表格,student(sno,sname,ssex,sbirthday,cl

  • oracle误删数据恢复方法小结

    如果用户误删/更新了数据后,作为用户并没有什么直接的方法来进行恢复,他们必须求助DBA来对数据库进行恢复,到了Oracle9i,这一个难堪局面有所改善.Or(www.jb51.net)acle 9i中提供了一项新的技术手段--闪回查询,用户使用闪回查询可以及时取得误操作前的数据,并可以针对错误进行相应的恢复措施,而这一切都无需DBA干预 因为一时手贱,生产上的数据被我给delete掉了. 用的是delete语句,然后很迅速的还给commit了 下面这两个语句: ALTER TABLE table

  • oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 尤其是"主键ID=?"这样的条件. 原则二: SELECT子句中避免使用 ' * ': ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 . 简单地讲,语句执行的时间越短越好(尤其对于系统的终端用

  • Oracle时间日期操作方法小结第1/2页

    sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟5小时 sysdate+5 在系统时间基础上延迟5天 add_months(sysdate,-5) 在系统时间基础上延迟5月 add_months(sysdate,-5*12) 在系统时间基础上延迟5年 上月末的日期:select last_day(add_months(sysdate, -1)) from dual; 本月

  • Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件可以使用调试用的debug.keystore,签名可以直接在eclipse上面查看,或者用工具查看 ,安装打开输入包名即可查看. 发布的时候一定需要在微信支付平台上面设置成发布用的签名值. 官方的Demo里面的内容并不是全是必须的,甚至只需要有libammsdk.jar就够了,AndroidMani

  • Oracle 触发器的使用小结

    --建递增序列 CREATE SEQUENCE LZEAM_SP_LOOP_EQ_SEQ MINVALUE 1 INCREMENT BY 1 START WITH 1 测试: SELECT LZEAM_SP_LOOP_EQ_SEQ.NEXTVAL FROM DUAL --建触发器 CREATE OR REPLACE TRIGGER LZEAM.LZEAM_SP_LOOP_EQ_TRIGGER BEFORE INSERT ON SP_LOOP_EQ FOR EACH ROW BEGIN SELEC

  • oracle SQL解析步骤小结

    1 The syntax of the SQL statement is verified. SQL的语法检查 2 The data dictionary is searched to verify table and column definitions. 从数据字典检查表名和字段名 3 The data dictionary is searched to verify security privileges on relevant objects. 从数据字典中检查权限 4 Parse lo

  • C#日期格式化的几个要点小结

    日期格式化 标准 DateTime 格式字符串 如果格式字符串只包含下表列出的某个单个格式说明符,则它们被解释为标准格式说明符.如果指定的格式字符是单个字符并且不包含在下表中,则引发异常.如果格式字符串在长度上比单个字符长(即使多余的字符是空白),则格式字符串被解释为自定义格式字符串.请注意,这些格式说明符产生的模式受"区域选项"控制面板中的设置的影响.具有不同区域性或不同日期与时间设置的计算机将显示不同的模式. 格式字符串显示的时间和日期分隔符由与当前区域性的 DateTimeFor

  • DB2和 Oracle的并发控制(锁)的比较

    1 引言 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复和交易单位为一个事务(Transactions),事务具有ACID(原子性,一致性,隔离性和永久性)特征.关系数据库为了确保并发用户在存取同一数据库对象时的正确性(即无丢失更新.可重复读.不读"脏"数据,无"幻像"读),数据库中引入了并发(锁)机制.基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)

随机推荐