Oracle使用别名的好处


Posted in Oracle onApril 19, 2022

今天在写一个简单的SQL语句并执行时抛出了如下图所示的一个错误提示信息!

Oracle使用别名的好处

恩,此异常信息很明显,在SQL语句中标示符的长度过长了,简短一些就应该没问题了,我查看了一下我的SQL语句发现是我的查询字段的列别名过长,实际测试的结果为列字段别名的最大长度为30个字节!

注意:我的测试数据库是ORACLE 11.2.0.4.0(如下图所示)

Oracle使用别名的好处

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)测试使用的若干条测试数据

Oracle使用别名的好处

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 相关文章推荐
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
Oracle使用别名的好处
Apr 19 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
Oracle中DBLink的详细介绍
Apr 29 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
oracle数据库去除重复数据
May 20 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
Oracle 多表查询基本语法实例
Apr 18 #Oracle
Lakehouse数据湖并发控制陷阱分析
Oracle数据库中通用的函数实例详解
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 #Oracle
oracle删除超过N天数据脚本的方法
Feb 28 #Oracle
oracle重置序列从0开始递增1
Feb 28 #Oracle
Oracle 触发器trigger使用案例
Feb 24 #Oracle
You might like
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
php实现倒计时效果
2015/12/19 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
php-fpm中max_children的配置
2019/03/15 PHP
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
pandas的相关系数与协方差实例
2019/12/27 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
最新英语专业学生求职信范文
2013/09/21 职场文书
小学生自我评价范文
2014/01/25 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
环卫工人慰问信
2015/02/15 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
PyTorch中的torch.cat简单介绍
2022/03/17 Python
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫