oracle学习 第二章 限制性查询和数据的排序 ——03

这里,我们接着上一小节2.6留下的问题:如果要查询的字符串中含有“_”或“%”,又该怎样处理呢? 开始今天的学习。

2.7  如何使用转义(escape)操作符

可以是用个转义(escape)关键字来完成此任务。为了进行练习,我们必须先创建一个临时的表,之后再往该表中插入1行记录,其包含通配符。可能您现在还可能十分不理解例2-13和例2-14的SQL语句。没有问题,您只要照着输入就可以了。

例 2-13

SQL> CREATE TABLE dept_temp
  2  AS
  3  SELECT *
  4  FROM dept;

例 2-13 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第1张图片

例 2-14

SQL> INSERT INTO dept_temp
  2  VALUES (88,'IT_RESEARCH','BEIJING');

例 2-14 结果


现在就可以输入例2-15的查询语句来显示其部门名(dname)意IT_开始的所有数据行。

例 2-15

SQL> SELECT *
  2  FROM dept_temp
  3  WHERE dname LIKE 'IT\_%' escape'\';

例 2-15 结果


在例2-15的查询中,您定义‘\'为转义(escape)符,即在'\'之后的'_'字符已经不是通配符了,而是他本来的含义,即下划线。因此,该查询语句的结果为:开头两个字符为IT,第三个字符为’_‘,后跟任意自负。

没有必要一定使用'\'字符作为转义(escape)符,完全可以使用任何您感兴趣的字符作为转义(escape)符。许多Oracle的专业人员之所以经常使用'\'字符作为转义(escape)符,是因为该字符在Unix操作系统和C语言中就是转义(escape)符

为了验证以上的论述,您可以输入列2-16的查询语句。

例 2-16

SQL> SELECT *
  2  FROM dept_temp
  3  WHERE dname LIKE 'IT@_%' escape'@';

例 2-16 结果


在例2-16的查询语句中,将’@‘定义为转义(escape)字符,但是例2-16的显示结果与例2-15完全相同。

建议:您最好不要将在SQL和SQL*PLUS中还有特殊含义的字符定义为转义(escape)符,这样会使您的SQL语句变得很难理解。

2.8 ORDER BY 子句

宁还记得第二章开始时的例子吗?如果忘记了,请您翻回到本章开始的地方,重新阅读一下。现在您的老板要您重新打印那份工资清单,但是要按工资数额由大到小排序。您翻一翻SQL手册,发现ORDER BY 子句是用来排序的。于是您试着发出了例2-17的查询语句。

例 2-17

SQL> SELECT empno,ename,sal
  2  FROM emp
  3  WHERE sal >=1500
  4  ORDER BY sal;

例 2-17 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第2张图片

其显示结果虽然是排好了序的,但是排序是由小到大。设想一下您所在的公司可能是一个大型的企业,可能有几十万名员工,在这汇总情况下这个清单可能为几百或者几千页,因此老板更希望先看到高薪员工。于是您有一次的重写了例2-18的查询语句。

例 2-18

SQL> SELECT empno,ename,sal
  2  FROM emp
  3  WHERE sal >= 1500
  4  ORDER BY sal DESC;

例 2-18 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第3张图片

例 2-18 的结果正式老板所需要的清单。在这个查询语句中,使用了DESC关键字。

利用ORDER BY子句对查询的结果进行排。ASC(ascending order)为升序排序(默认),因ASC在实际的SQL语句中很少见到。您可以对数字型,日期型,字符型数据进行排序。默认时,数字型和日期型数据的顺序为从小到大。字符型数据的顺序是按ASCII码的次序,即从A到Z。DESC(descending order)为降序排序。

如果在查询语句中不实用ORDER BY子句,查询结果的次序是不确定,即您发了两个完全相同的查询语句。其结果的次序可能是不一样的。

如果使用了ODER BY子句,该子句一定是SQL语句的最后一个子句。

2.9 在ORDER BY自剧中使用别名或表达式

还记得在第一章中的例1-11到1-14吗?

现在我们将第一章的例1-14重写,如例2-19.

例 2-19

SQL> SELECT empno AS "Employee Number",ename name,(500+sal)*12 "Annual Salary"
  2  FROM emp;
这一SQL语句显示的结果没有什么规律,而老板更喜欢把高薪者排在前面。由于年薪一列是表达式,应该用别名来排序。您可以使用例2-20的SQL语句来满足老板的要求。

例 2-20

SQL> SELECT empno AS "Employee Number",ename name,(500+sal)*12 "Annual Salary"
  2  FROM emp
  3  ORDER BY "Annual Salary" DESC;

例 2-20 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第4张图片

除了像例2-20那样在ORDER BY子句后面使用别名外,还可以在ORDER BY子句后面跟表达式。你可以输入例2-21的SQL语句。

例 2-21

SQL> SELECT empno AS "Employee Number",ename name,(500+sal)*12 "Annual Salary"
  2  FROM emp
  3  ORDER BY (500+sal)*12 DESC;

例 2-21 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第5张图片

您得到了与例2-20完全相同的结果。只是例2-21查询语句中的ORDER BY子句看起来不如上一个例子容易理解。

2.10 在ORDER BY 自剧中使用列号

此外我们也可以使用例2-22的查询语句来完成相同的工作,只是看上去更加令人费解。这里”3“表示第三列,所以ORDER BY 3就是按第3列排序。

例 2-22

SQL> SELECT empno AS "Employee Number",ename name,(500+sal)*12 "Annual Salary"
  2  FROM emp
  3  ORDER BY 3 DESC;

例 2-22 结果


应该在SQL语句中尽可能的不实用ORDER BY 子句这种用法,因为这种用法的易读性实在太差了。在不收啊有关Oracle SQL的书中根本就没有介绍ORDER BY这一用法。尽管如此,由于该用法可以减少输入,特别当放在ORDER BY子句之后的列名或者表达式很长的时候,所以还是有人使用这种用法。本篇文章介绍这一用法的目的是:当看到SQL语句中包含了这一用法时,您可以理解它,但是并不是鼓励使用这种方法。

2.11 在ORDER BY 自剧中使用多列

您也可以对多列进行排序,这些列的排序既可以按升序也可以按降序。假设以这样的方式来显示员工的名字、职位和工资:首先按职位由A到Z排序,之后再按工资由高到低排序。于是可以用例2-23的查询语句来达到这一目的。

例 2-23

SQL> SELECT ename,job,sal
  2  FROM emp
  3  ORDER BY job,sal DESC;

例 2-23 结果



2.12 在ORDER  BY 子句中使用在SELECT列表中没有的列

您还可以用在不在SELECT列表中没有的列来排序。如可以输入例2-24的查询语句。

例 2-24

SQL> SELECT ename,job,sal
  2  FROM emp
  3  ORDER BY empno;

例 2-24 结果

oracle学习 第二章 限制性查询和数据的排序 ——03_第6张图片

但是,您应该尽可能避免使用这种排序的方法。因为用这种排序的方法得到的结果,其他人很难看得懂。我想信随着时间的流逝,您自己也会看不懂的。

2.13 扩充后的查询语句的格式

这一章我们对基本的查询语句进行了扩充,加入了WHERE子句和ORDER BY子句。它的格式如下:

SELECT *|{[DISCTINCT]列表,...}

FROM   表名

[WHERE 条件]

[ORDER BY {列名|别名|表达式,...}[ASC|DESC]];

其中条件由以下部分组成

列名

文字串

算术表达式

   常量

比较运算符

ORDER BY 子句一定放在SQL语句的最后。

2.14 应该掌握的内容

在学习下一章之前,请检查一下是否已经掌握了一下的内容:

1、什么是关系数据库重点选择(selection)操作。

2、如何利用WHERE子句来限定所选的数据行。

3、6个常用的比较运算符(Operators)。

4、怎样构造WHERE子句中的条件。

5、BETWEEN AND 和IN 比较运算符(Operators)。

6、NOt运算符的使用

7、字符串和日起数据在SQL语句中的表示。

8、LIkE比较运算符(operators)和通配符(wildcard)。

9、转意字符(escape)的应用。

10、ORDER BY 子句的简单使用。

11、使用别名或表达式进行排序。

12、使用列号进行排序。

13、使用多列来排序。

14、使用不再SELECT列表中的列来排序。


-----------------------------------------------------

第二章的学习结束,感觉自己又忘得差不多了。

感谢csdn编辑器差不多实时保存的功能,让我保留住了我的文章,不然按错了一个删除建,网页自动返回上一页,我哭的心都有了。


你可能感兴趣的:(oracle,oracle,数据库,dba,教程,11g)