1.5 如何在SQL语句中使用算数表达式
可以在SQL语句中使用表达式。在表达式中可以使用一下4种运算符:+,-,*,/
它们分别代表加、减、乘、除。
设想一下,在某一天,有个社会团体和工会团体参观你们的公司,您的老板为了树立公司的光辉形象,它要求您把午餐和茶水的费用加到员工的工资里并打印一张工资清单。于是您大概算了一下,其费用约合500元/月。之后您用例1-11的查询得到了老板索要的员工的工资清单。
例 1-11
SQL> SELECT empno,ename,sal,500+sal 2 FROM emp;
例 1-11结果
小提示:如果你发现你查询的结果每10行分页一次,你可以使用语句
SQL>SET PAGESIZE X --X表示显示的行数,你可以设置一个大的值比如2000
当您把例1-11显示的结果拿给老板时,老板认为应该用年薪并且不能列出原工资。因此您将例1-11的查询语句做了一些修改并产生了例1-12的SQL语句。
例 1-12
SQL> SELECT empno,ename,500+sal*12 2 FROM emp;
例 1-12结果
看到例1-12显示的结果会让您大吃一惊。很显然这并不是老板索要的结果。其原因是运算符的优先级在作怪。
运算符的优先级是:
丶 先乘除后加减;
丶 在表达式中同一优先级运算符计算次序是从左到右;
丶 如果使用了括号,括号中的运算优先;
丶 如果有多重括号嵌套,内层括号中的运算优先。
因此您不得不再次重新书写例1-13的SQL语句如下。
例 1-13
SQL> SELECT empno,ename,(500+sal)*12 2 FROM emp;
例 1-13结果
毫无疑问,例1-13显示的结果就是老板所要的员工的工资清单。虽然你得到了正确的结果,但是显示的列标确实令人费解,特别是对您的老板和那些团体的头头们,因为他们对Oracle数据库一窍不通。
1.6 怎样在SQL语句中使用列的别名
为了让老板们明白,您不辞幸苦的再次修改了例1-13中的查询语句,这次,您使用了列的别名,发出了例1-14的SQL语句
例 1-14
SQL> SELECT empno AS "Employee Number", 2 ename name,(500+sal)*12 "Annual Salary" 3 FROM emp;
例 1-14结果
上面例1-14显示的结果正是您老板想要的结果。
Oracle有许多Unix和C的影子,在为列命名时,大量使用缩写方式,例如salary(工资)---sal。这些以缩写方式表示列明的好出之一就是它减少了输入量,但对非计算机专业的人来说,这些缩写方式的列明如同天数一般。有没有一种方法既能满足Oracle专业人员习惯于使用缩写的癖好,又使非计算机专业人员看到显示的结果一目了然呢?为列起一个别名就解决了这一难题。
给一列起一个别名的方法很简单。您只需要在列明和别名之间放上AS
或者空格就可以了。虽然从语句的易读性角度来说应该使用
AS 关键字,但是使用这一关键字要多输入两个字符,所以您会发现许多的Oracle专业人员很少使用 AS 这一关键字。
别名对处理表达式表示的列非常有用。您可能已经注意到了,当别名没有被双引号括起来时,别名的显示结果为大写。如果别名中包含了特殊字符,或想别名原样显示,您举要使用双引号把别名括起来。
1.7 连接运算符
您的老板对您为他做的员工的工资清单很满意,但他iang显示的结果是一个完整的英文句子,而且表达式的列标(就是表头)为:Employee’s Salary。这样,那些团体的头头们更容易理解。为此,您不得不再次修改查询语句,写下了例1-15的SQL语句:(可怜的程序员,就是不断的该改改!)
例 1-15
SQL> SELECT ename||'annual salary is '||(500+sal)*12 "Employee's Salary" 2 FROM emp;
例 1-15结果
当您把这份报告呈交给老板的时候,老板灿烂的微笑告诉您,这正是他所期望的报告,如果您使用的是中文系统,您也可以使用例1-16的带有中文的查询语句。
例 1-16
SQL> SELECT ename||'年薪为'||(500+sal)*12 "员工的年薪" 2 FROM emp;
例 1-16 结果
在这一查询语句中,我们使用了文本字符串(liteal)和连接运算符。
文本字符串是包含在SELECT子句中的字符、数字或表达式,而不是任何的列明或者列的别名。如文本字符是日起类型和字符型,您必须将他们用单引号括起来。每个字符串在每行输出结果中都输出一次。
连接运算符由两个竖线(||)表示,它把一个或多个列或字符串连接在一起。
1.8 DISTINCT 运算符
设想您刚刚被公司聘为Oracle(DBA)管理员,您想知道您的公司究竟有多少个部门,您可能发出例1-17的查询语句。
例 1-17
SQL> SELECT deptno 2 FROM emp;
例1-17 结果
Oracle显示了全部的记录,这是Oracle的默认显示方式。如果您所在的公司是一家大型跨国公司,它拥有一百多万名员工,您可以想象出这一查询会造成什么样的后果。
您可以使用DISTINCT帮助您去掉重复的行。请看例1-18语句的查询。
例 1-18
SQL> SELECT DISTINCT deptno 2 FROM emp;
例1-18结果
很显然,例1-18的结果要比例1-17的结果清楚多了。
注意:当查询比较大的表时应尽可能的避免使用DISTINCT,因为Oracle系统是通过排序的方式来完成DISTINCT这一功能的,所以它会造成Oracle系统的效率降低。通常您可以使用不同的方式来完成同样的工作,例如可以使用例1-19的查询语句来得到所需的部门的信息。
例 1-19
SQL> SELECT deptno 2 FROM dept;
例 1-19 结果
例1-19查询与前面的插叙一样得到了所有的部门号,但对Oracle系统没有什么冲击,因为部门好(deptno)在dept表中本身就是唯一的。
DISTINCT可以作用于多列,此时显示的结果为每一种列组合只显示一行。例如1-20.
例 1-20
SQL> SELECT DISTINCT deptno,job 2 FROM emp;
例 1-20 结果
到此为止,我们已经讨论了最基本的查询语句。下面将给出基本查询语句的格式。
1.9 基本查询语句的格式
在这一章中omen只学习了一个基本的查询语句。它只包含了两个子句SELECT和FRO,其格式如下
SELECT *|{[DISTINCT ]列表,...}
FROM 表名:
其中
列表:
列名|表达式 [别名]
其中,SELECT * FROM
表名; 为从表名所指定的表中选择所有的列;
SELECT DISTINCT
列表, ...
FROM
表名;
为从表名指定的表中选择列表所规定的列,但不显示重复的数据行(记录)。
-----------------------------------↓↓↓下面是本章小结↓↓↓-----------------------------------------
1.10 应该掌握的内容
在学习下一章之前,请检查您是否已经掌握了以下的内容:(貌似又忘得差不多了,汗!)
1、在查询语句中哪两个子句是必须的?
2、什么是投影操作?
3、怎样在查询语句中选择特定的列激烈的顺序。
4、书写查询语句的约定。
5、什么叫语句?
6、什么叫子句?
7、列标题的默认显示格式。
8、字符和日起理性的数据默认显示格式。
9、数字类型数据的默认显示格式。
10、SQL语句中的算术表达式及它们的优先级。
11、SQL语句中列的别名及其使用。
12、怎样使用文本字符串(literal)和连接运算符(||)?
13、怎样使用DISTINCT关键字以及使用它可能产生的问题。