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之别名小结

时间: 2024-08-07 08:39:47

Oracle之别名小结的相关文章

45个非常有用的 Oracle 查询语句小结

 这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧. 原文地址:http://www.jbxue.com/db/19890.html 日期/时间 相关查询 1.获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. 复制代码代码如下: SELECT TRUNC

Oracle 常用命令小结

1.当前数据库中查看建表语句 select dbms_metadata.get_ddl('TABLE','表名') from dual; 2. Oracle 常用命令小结,布布扣,bubuko.com

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

Oracle压缩功能小结1--压缩功能介绍

Oracle数据库的压缩功能 大家听到这个词,一定就想到了节省硬盘空间吧.没错,它就是用来干这个的,但是向外延伸一下,它不仅可以节省硬盘空间,更可以节省带宽以及内存的使用(cpu有一点点损耗因为需要更多的计算取值操作,但是鉴于大多数环境下cpu都有空闲,所以也可以忽略了). Basiccompression这个功能从9i开始就有提供,11gr1开始提供了新的压缩功能,即OLTP compression.Basic compression是包括在EE版本中的,不需要额外收费,但是OLTP comp

Oracle压缩功能小结2—预估表压缩的效果

在使用压缩之前,我们可以估算一下使用压缩能够拥有多大的效果. 11gr2以前可以使用dbms_comp_advisor,具体代码已经在附件中给出.只需要执行两个文件dbmscomp.sql和prvtcomp.plb,然后使用DBMS_COMP_ADVISOR.getratio存储过程即可.不再详细描述. SQL> set serveroutput on SQL> execdbms_comp_advisor.getratio('SH','SALES',10) Sampling table: SH

Oracle 11g RAC小结

1.查看数据库所有实例与状态 unixdev$[/home/grid]srvctl status database -d unixdev Instance unixdev11 is running on node unixdev Instance unixdev12 is running on node unixtest *注:在oracle或grid下执行均可 2.在特定节点上查看节点应用的状态,可以看到:VIP.NETWORK.GSD.ONS的状态 unixdev$[/home/oracle

oracle sql别名

为sql的字段起一个别名,常以为是可有可无的,但是有时候是必要的. 例如在ibatis中 1 <!-- 获取已发或待发送的彩信记录列表 --> 2 <resultMap id="mmsListByRecordTypeMap" class="richinfo.mms.bean.req.MmsRecordReq" > 3 <result column="groupid" property="groupId&qu

.NET EF 访问Oracle之问题小结

由于最近手头上的项目要求使用Oracle数据库,所以我搭建了asp.net mvc + EF + bootstrap + log4Net + unity的三层框架,如下图所示: 其中单元测试使用微软自带的,个人感觉轻便,所以没使用NUnit. 使用EF+Oracle期间,遇到一些问题让我挺纠结,因为之前一直使用EF+SQL SERVER,如下: 1.为了防注入,使用参数的方式过滤,SQL SERVER 是用@,而Oracle使用的是:,如下: /// <summary> /// 测试函数 //

oracle sql 知识小结

Oracle_sql 培训: 第一单元:select 语句: ①:字符串连接操作符: || ②:去除重复行:distinct 第二单元:条件限制和排序 ①:关键字:where ②:比较操作符:=,>,<,between...and...,in,like,is null :使用like做模糊匹配:可使用%或者_作为通配符:%代表0个或多个字符._代表一个单个字符.escape为标识转义字符 escape '/'. ③:排序:order by  asc(升序默认)/desc(倒序) 第三单元:单行