今天在写一个简单的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 TABLESALES.STUDENT

(

ID NUMBER,

NAME VARCHAR2(20BYTE),

SEX CHAR(1BYTE),

BIRTHDAY DATE,

HOBBY VARCHAR2(20 CHAR)

)

2)测试使用的若干条测试数据

3)列名的最大长度为30个字节

SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE--30个英文大写字符,正常执行

FROMSTUDENT

SELECT ID ABCDEABCDEABCDEABCDEABCDEABCDE1--多加另一个1就会报ORA-00972:identifier is to long

FROMSTUDENT

SELECT ID 我们学校的好学生学号--10个中文汉字字符,正常执行

FROMSTUDENT

SELECT ID 我们学校的好学生学号1--多加另一个1就会报ORA-00972:identifier is to long

FROM STUDENT

4)可以使用AS关键字定义列名,也可以不适用AS,列名后直接指定别名,以空格分开即可

SELECT ID AS 学号 FROMSTUDENT

--使用AS的情况,正常执行

SELECT ID 学号 FROM STUDENT

--不使用AS也可以正常执行,而且代码更简洁,建议使用方式

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

SELECT ID 123学号 FROMSTUDENT

--执行时报"ORA-00923: FROM keyword not found where expected"

SELECT ID "123学号"--正常执行

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

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

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

SELECT ID 学号 FROMSTUDENT

--正常执行

SELECT ID "学号" FROMSTUDENT

--正常执行

SELECT ID '学号' FROMSTUDENT

--执行时报"ORA-00923: FROM keyword not found where expected"

SELECT ID StudentId FROMSTUDENT

--正常执行

SELECT ID "StudentId" FROMSTUDENT

--正常执行

SELECT ID 'StudentId' FROM STUDENT

--执行时报"ORA-00923: FROM keyword not found where expected"

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

SELECT ID AS (学号) FROMSTUDENT

--英文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected"

SELECT ID (学号) FROMSTUDENT

--英文小括号,执行时报"ORA-00904: "ID": invalid identifier"

SELECT ID AS "(学号)" FROMSTUDENT

--正常执行

SELECT ID AS(学号)FROMSTUDENT

--中文小括号且使用AS的情形,执行时报"ORA-00923: FROM keyword not found where expected"

SELECT ID(学号)FROMSTUDENT

--中文小括号,执行时报"ORA-00904: "ID": invalid identifier"

SELECT ID "(学号)" FROM STUDENT

--正常执行

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

FROMSTUDENT

SELECT ID "学 号"--正常执行

FROMSTUDENT

SELECT ID XUE HAO--执行时报"ORA-00923: FROM keyword not found where expected"

FROMSTUDENT

SELECT ID "XUE HAO"--正常执行

FROM STUDENT

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

SELECT ID "学 号" FROMSTUDENT 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

SELECTID ID_

FROMSTUDENT

WHERE ID_=11--执行时报"ORA-00904: "ID_": invalid identifier"

SELECTID ID_

FROMSTUDENT

WHERE ID=11--正常执行

SELECTID ID_

FROMSTUDENT

WHERE ID='11'--正常执行,注意:ID是NUMBER类型的数据

SELECTID ID_

FROMSTUDENT

WHERE ID="11"--执行时报"ORA-00904: "11": invalid identifier",注意:ID是NUMBER类型的数据

SELECT ID,COUNT(*) C

FROMSTUDENT

GROUP BYID

HAVING C>0--执行时报"ORA-00904: "C": invalid identifier"

SELECT ID,COUNT(*) C

FROMSTUDENT

GROUP BYID

HAVING Count(*)>0--正常执行

SELECT ID,COUNT(*)C

FROMSTUDENT

GROUP BYID

HAVING COUNT(*)>0

ORDER BY C--正常执行

SELECTID ID_

FROMSTUDENT

ORDER BY ID_--正常执行

SELECTID ID_

FROMSTUDENT

ORDER BY 1--正常执行

10)别名是否区分大小写——区分大小写(注意:当不用双引号括起来的时候英文字符大小写不敏感)

SELECTXUEHAO

FROM (SELECT ID XUEHAO FROMSTUDENT)

WHERE XUEHAO > 1--正常执行

SELECTXUEHAO

FROM (SELECT ID xuehao FROMSTUDENT)

WHERE XUEHAO > 1--正常执行

SELECTXUEHAO

FROM (SELECT ID "XUEHAO" FROMSTUDENT)

WHERE XUEHAO > 1--正常执行

SELECTXUEHAO

FROM (SELECT ID "xuehao" FROMSTUDENT)

WHERE XUEHAO > 1--执行时报"ORA-00904: "XUEHAO": invalid identifier"

SELECTXUEHAO

FROM (SELECT ID "xuehao" FROMSTUDENT)

WHERE xuehao > 1--执行时报"ORA-00904: "XUEHAO": invalid identifier"

SELECTXUEHAO

FROM (SELECT ID "xuehao" FROMSTUDENT)

WHERE "xuehao" > 1--执行时报"ORA-00904: "XUEHAO": invalid identifier"

SELECT"xuehao"

FROM (SELECT ID "xuehao" FROMSTUDENT)

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个部分连接在一起。

mysql表别名不加as_数据库别名AS区别相关推荐

  1. day27 MySQL 表的约束与数据库设计

    day27  MySQL 表的约束与数据库设计 第1节 回顾 1.1  数据库入门 1.1.1 SQL 语句的分类: 1) DDL 数据定义语言 2) DML 数据操作语言 3) DQL 数据查询语言 ...

  2. java MySQL表的约束与数据库设计 详解

    1.DQL 数据查询语言 在上一篇博文中,我们已经讲述了部分数据查询语句,在此我们再次对其进行补充. 1.1 排序 通过ORDAR BY 语句,可以将查询出来的结果进行排序.(排除只是一种现实的方式, ...

  3. php如何查询数据库的表,php如何查询mysql表名字,php查询数据库并输出

    php如何查询mysql表名字PHP如何查询mysql表名字,php查询mysql表名字的方法:首先连接服务器,代码为[模具('连接失败:英尺.mysql.]:然后选择数据库,代码为[while($ ...

  4. mysql 表名规范_MYSQL数据库命名及设计规范

    1.设计原则 1) 标准化和规范化 数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡. ...

  5. mysql表设计原子性_数据库表设计-原子性

    好的数据结构会影响速度.好的数据库表设计会影响数据库操作效率.特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂. SQL是关系数据库中用到的一种语言.所以,为 ...

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

    [转自]:https://blog.csdn.net/CatStarXcode/article/details/79513425 NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数 ...

  7. jdbc 获取mysql表注释_jdbc读取数据库,表相关信息(含注释)

    读取数据库中的所有的表名 private Set getTableNameByCon(Connection con) { Set set = new HashSet(); try { Database ...

  8. mysql 表大小_MySQL查看数据库表容量大小的方法示例

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用. 1.查看所有数据库容量大小 select table_schema as '数据库', sum(table ...

  9. mysql+表复制+效率_MySQL数据库复制表的几种方式讲解

    一.MySQL复制表的几种方式 我们首先创建表stuents_score,利用SQL语句查看创建表的结构与列名字段. 之后查看students_score表数据,便于之后观察对比. 1.CREATE ...

最新文章

  1. 在ubuntu10.04上安装永中office2010
  2. acwing yxc总结时间算法复杂度
  3. 静态链接和动态链接优缺点
  4. MySQL中数据库的操作
  5. 老板说“我们要做个性化推荐”时,你该怎么办......
  6. java cuba_CUBA平台–用于快速应用程序开发的开源Java框架
  7. 软件工程专插本_2021年专插本部分招生专业(拟),广科/广东理工/华商/培正/松田/工商大!...
  8. ubuntu系统debootstrap的再三实验
  9. linux下u盘的使用
  10. OVF虚拟镜像的导出方法
  11. VS2010 部署程序在安装完成后自动启动外部程序
  12. Ubuntu安装nagios步骤
  13. Spring_02 注入类型值、利用引用注入类型值、spring表达式、与类相关的注解、与依赖注入相关的注解、注解扫描...
  14. Bus Hound总线分析工具的使用
  15. 链接脚本(Linker Script)用法解析(二) clear_table copy_table
  16. 【HZNUOJ】【C系列3.16】征战的Loy
  17. 【Labview机器视觉】- USB摄像头识别一维码(条形码)- 学习记录
  18. 2020年春运买票中对“候补购票”的理解和看法。
  19. 飞行(Mcool) 13.0.03106 简体中文绿色版
  20. 按照日期:蓝桥杯真题、洛谷题单、力扣题单汇总

热门文章

  1. 深入GetMessage,PeekMessage以及Windows消息机制
  2. c语言二级字符指针运用(字符串)
  3. Svchost.exe是病毒的两种情况
  4. Java基础知识提炼与总结
  5. 无线网络攻击类型及防范
  6. Win10 1809美化
  7. 阐述免费增值游戏的设计特点及注意事项
  8. 单片机程序跑飞死机的几种原因
  9. 运维工程师主要做什么_弱电工程IT运维工作到底是做什么的?
  10. 在 Windows Server 2003 企业服务器中如何配置 IPv6 协议