1.1.2 查询语句中的条件
在前面所列举的查询中,由于没有限制条件,所以查询的结果是将表中的所有行都显示出来。如果希望只查询一部分行,那么可以通过WHERE子句指定条件。WHERE子句的作用是通过指定条件,使SELECT语句仅仅查询符合条件的行,如部门10的员工数据,或者工资大于2000元的员工数据等。在更多情况下,都需要根据指定的条件对数据进行查询。
WHERE子句指定的条件是一个关系表达式,如果关系表达式的结果为真,则条件成立,否则条件不成立。关系表达式用于比较两个表达式的大小,或者进行模糊匹配,或者将一个表达式的值与一个集合中的元素进行匹配。表1.2列出了常用的关系运算符。
例如,要在表dept中查询部门10的员工姓名和工资信息,对应的SELECT语句为:
SQL>SELECT ename, sal FROM emp WHERE deptno=10;
下面的SELECT语句用于查询员工KING的基本情况:
SQL>SELECT empno, ename, sal, comm FROM emp WHERE ename='KING';
LIKE运算符通常用来进行字符串的模糊匹配,而“=”运算符只能对字符串进行精确比较。在LIKE指定的关系表达式中可以使用两个通配符:%和,其中%可以代替多个字符,可以代替一个字符。例如,要查询包含字符串“AR”的员工姓名,构造的SELECT语句为:
SQL>SELECT ename FROM emp WHERE ename LIKE'%AR%';
又如要查询这样的员工,姓名中第一个字符是任意字符,第二个是“A”,然后是若干任意字符,这时构造的SELECT语句为:
SQL>SELECT ename FROM emp WHERE ename LIKE'_A%';
注意,%用来代替多个连续的字符,包括空字符串,而_只能用来代替一个字符,不包括空字符。
IN运算符用来与一个集合中的元素进行比较。SELECT语句将指定的表达式与集合中的元素一一比较,只要与其中一个相等,则条件成立。如果没有任何一个元素与表达式的值相等,则条件不成立。例如,下面的SELECT语句用于查询其姓名在指定集合之中的员工:
SQL>SELECT ename FROM emp WHERE ename IN('SMITH','FORD','HELLO');
BETWEEN运算符用于将表达式的值与两个指定数据进行比较,如果表达式的值在这两个数据之间,则条件成立。这两个数据和表达式必须能够比较大小,而且后一个数据必须大于前一个数据。例如,下面的SELECT语句用于查询工资在1000到2000之间的员工:
SQL>SELECT ename FROM emp WHERE sal BETWEEN 1000 AND 2000;
如果用包含“>”等运算符的表达式改写上述SQL语句,则对应的SELECT语句为:
SQL>SELECT ename FROM emp
WHERE sal>=1000 AND sal<=2000;
在复杂的查询语句中,可能需要多个条件,这些条件通过AND或OR运算符连接。多个条件表达式连接起来以后,就构成一个逻辑表达式。逻辑表达式的结果要么为真,要么为假,它是与两个关系表达式的值和所使用的连接运算有关的。假设X和Y是两个关系表达式,表1.3列出了两个关系表达式的运算规则。
例如,要查询在部门10工作,且工资在1000和2000之间的员工姓名,相应的SELECT语句为:
SQL>SELECT ename FROM emp
WHERE deptno=10 AND sal BETWEEN 1000 AND 2000;
NOT运算符的作用是对关系表达式的值取反。它的用法是在关系表达式之前加上NOT运算符。例如,要查询工资不大于1000的员工姓名,相应的SELECT语句为:
SQL>SELECT ename FROM emp WHERE NOT sal<1000;
这条语句等价于:
SQL>SELECT ename FROM emp WHERE sal>=1000;
在默认情况下,NOT运算符只对最近的一个关系表达式取反,如果要对已经通过AND或OR连接的多个关系表达式同时取反,则要用一对圆括号将多个关系表达式限定。例如,要对下列SELECT语句中的两个条件同时取反:
SELECT ename FROM emp WHERE sal>1000 AND sal<2000;
对两个条件同时取反以后的SELECT语句为:
SELECT ename FROM emp WHERE NOT(sal>1000 AND sal<2000);
这条语句等价于:
SELECT ename FROM emp WHERE sal<=1000 OR sal>=2000;
在WHERE子句中构造条件时,还要注意空值的运算。空值与任何数据进行赋值运算、四则运算以及关系运算时,结果都为空值。例如,下列的SELECT语句本意是要查询姓名不为空的所有员工的工资,查询的结果应该是所有员工的工资,但是结果却为空。
SQL>SELECT sal FROM emp WHERE ename!=NULL;
原因是ename列与空值进行了关系运算,结果为空,于是整个条件表达式的结果为假。判断某个表达式是否为空值的运算符是“IS NULL”,判断是否不为空值的运算符是“IS NOT NULL”。例如,用运算符“IS NOT NULL”重新构造上述SELECT语句,将得到我们希望的结果。这个SELECT语句为:
SQL>SELECT sal FROM emp WHERE ename IS NOT NULL;