Oracle之别名小结

MySQL表别名、字段别名注意事项

字段别名:可加 as  ,也可以不加,可以加单|双引号,也可以不加;

表别名:可加 as ,也可以不加,但是一定不能加单|双引号!

Oracle:在oracle中,数据表别名不能加as

别名的使用原则

  • 区别同名列的名称
  • 非法的表达式合法化
  • 按照你的意愿显示列的名称
  • 特殊的别名要双引
  • 直接写列的后面
  • 使用as增加可读性
  • select sal as salary , hiredate "上班日期",sal*12 total_salary from emp;
  • select sal as salary , hiredate as 日期 from emp;

今天在写一个简单的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关键字定义列名,也可以不适用AS,列名后直接指定别名,以空格分开即可

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

5)以数字开头的别名必须使用双引号括起来

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

6)别名可以使用双引号和不使用任何引号。(注意:全是英文的单引或双引符号)

中文别名可以使用双引号和不使用任何引号的

但是使用单引符号时报错(任何列别名不能用单引号)

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

7)别名中使用了其他的特殊符号比如:别名中包含空格或者小括号(),则必须使用双引号括起来(注意:其他的特殊符号可能类似,这里以小括号为例做了测试,其他情况如果感兴趣可以自己动手试试)

SELECT ID AS (学号) FROM STUDENT
--英文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected" SELECT ID (学号) FROM STUDENT
--英文小括号,执行时报"ORA-00904: "ID": invalid identifier" SELECT ID AS "(学号)" FROM STUDENT
--正常执行 SELECT ID AS(学号)FROM STUDENT
--中文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected" SELECT ID(学号)FROM STUDENT
--中文小括号,执行时报"ORA-00904: "ID": invalid identifier" SELECT ID "(学号)" FROM STUDENT
--正常执行 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

8)是否可以保留别名中的空格——可以,但必须使用双引号括起来,如果指定的别名带有双引号,则子句中使用别名的时候必须带双引号,保持一致

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

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 在WHERE子句中引用列别名的问题

SQL> select sal,comm from emp
2 where sal<2000; SAL COMM
--------- ----------
800
1600 300
1250 500
1250 1400
1500 0
1100
950
1300 8 rows selected. SQL> select sal as salary,comm as commission from emp
2 where salary<2000;
where salary<2000
*
ERROR at line 2:
ORA-00904: "SALARY": invalid identifier SQL> select * from
2 (
3 select sal as salary,comm as commission from emp
4 ) x
5 where salary<2000; SALARY COMMISSION
---------- ----------
800
1600 300
1250 500
1250 1400
1500 0
1100
950
1300 8 rows selected.

将取别名的查询作为内联视图,便可以在外部查询中引用其中的别名列。为什么要这么做呢?WHERE子句是在SELECT之前进行处理的,这样,在处理求解“问题”查询的WHERE子句之前,SALARY和COMMISSION并不存在,要到WHERE子句处理完成之后,别名才生效。然而,FROM子句是在WHERE之前处理的。将原查询放在FROM子句中,那么,在最外层的WHERE子句之前,以及最外层的WHERE子句“看到”别名之前,就已经生成了查询结果。

oracle 连接运算符,连接字符串,||双竖线,在列别名上使用双引号,使用带有特殊字符的列别名        

在列别名上使用双引号
输入并执行查询:
1.SELECT ename AS "Name", sal*12+5000 AS "年度工资(加年终奖)" FROM emp; 1.SELECT ename AS "Name", sal*12+5000 AS "年度工资(加年终奖)" FROM emp; 显示结果为:
1.Name 年度工资(加年终奖)
2. --------------- ----------------------------
3. SMITH 14600
4. ALLEN 24200 1.Name 年度工资(加年终奖)
2. --------------- ----------------------------
3. SMITH 14600
4. ALLEN 24200 说明:其中别名“Name”有大小写的区别,别名“年度工资(加年终奖) ”中出现括号,属于特殊符号,所以都需要使用双引号将别名引起。
连接运算符
sql语句可以使用包含数值运算的计算列,显示结果也是数值型的。我们也可以使用字符型的计算列,方法是在查询中使用连接运算。连接运算符是双竖线“||”。通过连接运算可以将两个字符串连接在一起。
在查询中使用连接运算。
输入并执行查询: 1.SELECT ename||job AS "雇员和职务表" FROM emp; 1.SELECT ename||job AS "雇员和职务表" FROM emp; 输出结果为: 1.雇员和职务表
2. -------------------
3. SMITHCLERK
4. ALLENSALESMAN 1.雇员和职务表
2. -------------------
3. SMITHCLERK
4. ALLENSALESMAN 说明:在本例中,雇员名称和职务列被连接成为一个列显示。
在查询中可以使用字符和日期的常量,表示固定的字符串或固定日期。字符和日期的常量需要用单引号引起。下一个训练是作为上一个训练的改进。
在查询中使用字符串常量。
输入并执行查询: 1.SELECT ename|| ' IS '||job AS "雇员和职务表" FROM emp; 1.SELECT ename|| ' IS '||job AS "雇员和职务表" FROM emp; 输出结果为: 1.雇员和职务表
2. -----------------------
3. SMITH IS CLERK
4. ALLEN IS SALESMAN 1.雇员和职务表
2. -----------------------
3. SMITH IS CLERK
4. ALLEN IS SALESMAN 说明:本练习中将雇员名称、字符串常量“ IS ”和雇员职务3个部分连接在一起。

数据库别名AS区别的更多相关文章

  1. 在本地数据库目录或系统数据库目录中已经存在数据库别名""的解决办法

    在创建数据库时遇到数据库别名已存在的问题时,可以: 1. 首先用 db2 list database directory 命令看在系统数据库目录(System Database Directory)中 ...

  2. MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  3. SQL Server数据库和MySQL数据库有什么区别?

    SQL Server数据库和MySQL数据库有什么区别呢?详细很多初入IT行业的朋友对于SQL Server数据库和MySQL数据库经常搞混,认为这两种数据库是同一种,其实不然,今天我们来分析一下这两 ...

  4. Oracle、MySQL和Sqlserver的事务管理、分页和别名的区别

    1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit(commit--rollback回滚) 2.但是在oracle中必须自己commit;不然就只能结 ...

  5. MongoDB与传统数据库的使用区别——批量插入与批量查询

    我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型. 我的回答是:不行,因为MongoDB不是 ...

  6. MySQL、MongoDB、Redis 数据库之间的区别

    NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...

  7. ip辅助和别名的区别

    更流畅 IP 别名和辅助 IP 地址 2017-01-25 12:05             838人阅读             评论(0)             收藏              ...

  8. 02.全文检索和数据库like的区别

    全文检索主要应用领域:搜索引擎(百度,搜狗).站内搜索(微博搜索).电商网站(京东,淘宝) 现在不缺乏做java的人,但是缺乏有互联网背景的做Java的人.具有互联网技术的Java人才.比如说大数据, ...

  9. java.lang.IllegalArgumentException异常 数据库别名问题

    java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expect ...

随机推荐

  1. BFS+二进制状态压缩 hdu-1429

    好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...

  2. 树莓派 CSI摄像头 No data received from sensor. Check all connections, including the Sunny one on the camera board

    不知道为什么摄像头在包里放了两天旧坏了,中间完全没用过摄像头的功能,查了资料,原因大概有两种 1)sunny烧了 2)试摄像头传感器坏了 这两天没有插拔过摄像头,可能是树莓派漏电了,也可能是它被压坏了 ...

  3. git 更新代码到本地

    正规流程 git status(查看本地分支文件信息,确保更新时不产生冲突) git checkout – [file name] (若文件有修改,可以还原到最初状态; 若文件需要更新到服务器上,应该 ...

  4. python记录_day10 动态传参 命名空间 作用域

    一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...

  5. php 求余

    一,异号 1.函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负 结论:两个整数求余时,其值的符号为除数的符号. 2.取值规律 先将两个整数看作是正数,再作除法运算 ①能整除时, ...

  6. 数据结构与算法之PHP查找算法(顺序查找)

    对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没有找到,这种方法称为顺序查找. 一.基本写法 顺序查找的实现很简单.只要从列表 ...

  7. [CodeForces - 197D] D - Infinite Maze

    D - Infinite Maze We've got a rectangular n × m-cell maze. Each cell is either passable, or is a wal ...

  8. Tomcat指定JDK路径(Linux+Windows)

    当系统有多套JDK,不方便在系统配统一的JAVA_HOME时,我们可能想给tomcat指定JDK路径. 1.Linux下Tomcat指定JDK路径 找到$CATALINE_HOME/bin/catal ...

  9. VMware进入BIOS

    在虚拟机关机状态下,点击“虚拟机”--“电源”--“打开电源时进入固件”即自动启动进入bios

  10. react native 入门 (1)- 环境搭建, 创建第一个Hello World

    Create React Native App 是开始构建新的React Native应用程序的最简单方法.它允许您启动项目而无需安装或配置任何工具来构建本机代码 - 无需安装Xcode或Androi ...