您的老板考虑目的销售不景气还要持续一段时间,因此不需要那么多的推销员(salesman)。他让您现在打印一份所有的推销员清单,于是您写下了例2-6的查询语句。
例 2-6
SQL> SELECT empno,ename,job 2 FROM emp 3 WHERE JOB ='salename';
例 2-6 结果
可是没有显示出任何结果。您一定对此感到很惊讶,因为在员工(emp)表中缺失存有推销员的数据,这到底是为什么呢?
这是因为WHERE子句中的字符串是区分大小写的。在WHERE子句中字符和日期型数据要用单引号括起来,但数字型不用。日期型数据默认的格式,在Oracle9i之前的版本中为“DD-MON-YY”,在Oracle9i中为“DD-MON-RR".
当您看完以上的解释后,就已经知道了问题的所在,重新输入例2-7的查询语句。
例 2-7
SQL> SELECT empno,ename,job,sal 2 FROM emp 3 WHERE JOB='SALESMAN';
例 2-7 结果
如果您的老板不但不需要那么多的推销员(salesman),而且也不需要那么多的文员和经理。又该如何打印这份员工的清单的?这时可以使用IN操作符来帮助完成何以工作。您可以使用例2-8的查询语句。
例 2-8
SQL> SELECT empno,ename,sal,job 2 FROM emp 3 WHERE job IN ('SALESMAN','CLERK','MANAGER');
例 2-8 结果
IN是SQL中的有一个很有用的比较运算符。IN用来测试某些值是否在列表中出现。在上面的SQL语句中,只要某一记录的JOB列的值等于IN列表中(即括号中)的任何一个,该记录就会显示出来。
还可以在 IN 只ian加上否定词NOT。NOT IN 用来测试某些值是否不再列中出现。在进一步假设您所在的公司一直没能扭转亏损的势头,老板不得不考虑解雇更多的员工,以进一步的节省开销。他认为公司除了分析员(analyst)以外都可以是要解雇的候选人。他要让您按此要求在为他准备一张员工的清单。于是您发出了例2-9的查询语句。
例 2-9
SQL> SELECT empno,ename,sal,job 2 FROM emp 3 WHERE job NOT IN ('ANALYST','PRESIDENT');
例 2-9 结果
这个例子与前面的例子显示的结果完全相同,但使用了不同的条件。WHERE job NOT IN(‘ANALYST’,‘PRESIDENT’)告诉Oracle只显示那些JOB(职位)既不是ANALYST(分析员)也不是PRESIDENT(老总)的记录。因为在em表中只有5中职位,除了ANALYST和PRESIDENT就是SALESMAN、CLERK和MANAGER了。这一例子也告诉我们可以由不同的查询语句来得到相同的结果。
如果仔细回忆一下老板的观点,即他认为公司中除了分析员(ANALYST)意外都可以是候选人,就会发现例2-9好像与他的要求有点出入,因为他并没有说要解雇的候选人中不好汗总裁(PRESIDENT),即老板自己。
我们知道人的记忆是比较有趣的。我们想记住的事情很难记得住,但我们想忘记的事却永远也忘不掉。假设老板让您打印一份所有的推销员的清单时,您不记得SALESMAN的准确拼写,但还记得它的钱3个字符SAL,此时该怎么办呢?可以在您的查询语句中使用LIKE运算符。例如可以使用例2-10的SQL语句。
例 2-10
SQL> SELECT empno,ename,sal,job 2 FROM emp 3 WHERE job LIKE 'SAL%';
例 2-10 结果
您可以用LIKE预算符进行通配符查询。通配符的英文原文为widcard,这个词的愿意为扑克牌中的2或者王,因为他们可以代替任何其他牌,所以称为wildcard。
LIKE运算符可以使用以下两个通配符“%”和“_”。其中
■ “%”代表零个或者多个字符。
■ “_”代表一个且只能是一个字符。
如果您只记得SALESMAN的第一个字符为S,第三个字符为L,第五个字符为S,那么应该如何处理呢?您可以使用例2-11的查询语句。
例 2-11
SQL> SELECT empno,ename,sal,job 2 FROM emp 3 WHERE job LIKE 'S_L_S%';
例 2-11 结果
另外,LIke运算符可以帮助您简单简化某些WHERE子句。例如要显示在1981年雇用的所有员工清单,可以使用例2-12的查询语句。
例 2-12
SQL> SELECT empno,ename,sal,hiredate 2 FROM emp 3 WHERE hiredate LIKE '%81';
例 2-12 结果
如果要查询的字符串中含有“_”或“%”,又该怎样处理呢?
------分割线-----------
今晚就先学到这了,明天继续。。。^_^