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. linux bash基本特性

    一.bash 基础特性 (1)命令历史的功能 history: 环境变量 HISTSIZE:命令历史记录的条数 HISTFILE: ~/.bash_history 每个用户都有自己独立的命令历史文件 ...

  2. 一篇文章一张思维导图看懂Android学习最佳路线(转载)

    Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级.中级.高级以及资深工程师.只针对Android应用开发,不针对Rom开发和逆向工程等.方便起见虚拟“小 ...

  3. 如何开发mis系统--整理

    1.含义: 所谓MIS(管理信息系统--Management Information System)系统,主要指的是进行日常事务操作的系统.这种系统主要用于管理需要的记录,并对记录数据进行相关处理,将 ...

  4. leetcode-algorithms-19 Remove Nth Node From End of List

    leetcode-algorithms-19 Remove Nth Node From End of List Given a linked list, remove the n-th node fr ...

  5. 《高性能SQL调优精要与案例解析》——10.4_SQL语句改写部分文档

    应各位读者要求,现将<高性能SQL调优精要与案例解析>中<10.4 SQL语句改写>部分整理成电子文档,上传至群共享文件(群号:298176197): 或者通过如下链接下载: ...

  6. 检测用户命令序列异常——使用LSTM分类算法【使用朴素贝叶斯,类似垃圾邮件分类的做法也可以,将命令序列看成是垃圾邮件】

    通过 搜集 Linux 服务器 的 bash 操作 日志, 通过 训练 识别 出 特定 用户 的 操作 习惯, 然后 进一步 识别 出 异常 操作 行为. 使用 SEA 数据 集 涵盖 70 多个 U ...

  7. python3 get/post/使用代理/自定义header/自定义Cookie

    说明:urllib发送http请求并不是很人性化,更推荐使用在urllib基础上封装的.python2和python3都兼容的requests模块,移步查看. 一.get请求 get请求就是在构造Re ...

  8. Ubuntu 下安装Go语言

    https://blog.csdn.net/ceciiiilia/article/details/71483221 (一)从官网安装Go语言 1.对于64位Linux: $ wget https:// ...

  9. python-time,datetime

    1.time模块:time.time() # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)time.localtime([ sec ]) # 接收时间戳(默认为当前时间),返回struct_t ...

  10. python 利用turtle库绘制七段数码管的方式,绘制当前事件(时分秒00:00:00)

    # coding:utf-8# 绘制七段数码管,显示当前时间import timeimport turtle as tt # 绘制间隔def drawGap(): tt.penup() tt.fd(3 ...