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更换为MySQL遇到的问题及解决
May 21 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
DBCA命令行搭建Oracle ADG的流程
Jun 11 Oracle
ORACLE查看当前账号的相关信息
Jun 18 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
详解SQL的窗口函数
Apr 21 Oracle
SQL试题 使用窗口函数选出连续3天登录的用户
Apr 24 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 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
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php fread读取文件注意事项
2016/09/24 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
培训讲师岗位职责
2014/04/13 职场文书
学校就业推荐信范文
2014/05/19 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书