2.5 限定返回行

  从数据库取回数据的时候,可能需要根据条件限制所显示的数据行。本节将通过WHERE关键字及其子句,完成限定返回行的任务。

2.5.1 限定行初步

  继续操作employees表,如果仅需要查询部门编号为60的所有雇员,则可以使用如下SQL语句:

  1. SELECT * FROM employees WHERE department_id = 60

  执行该SQL语句,按要求仅查询出了五个雇员的信息。

  使用WHERE子句,可以限制查询满足条件的行,WHERE子句能够比较字段值、文字值、算术表达式或函数,内部由字段名、比较条件和比较值三个部分组成。

  在WHERE子句中字符串和日期必须包含在单引号中,数字常数不需要。尤其需要注意的是,虽然说SQL语句是大小写不敏感的,但是在使用WHERE子句进行条件限定时,这个比较值是大小写敏感的。

  例如要查询departments表中部门名称为“IT”的部门信息,SQL语句应该是:

  1. SELECT * FROM departments WHERE department_name = 'IT'

  通过该SQL语句,正常查询出所需要的信息,如图2.22所示。但是如果把WHERE子句写成WHERE department_name = ‘it’,执行SQL,没有行返回。

  那么如何使比较值大小写不敏感呢?可以使用单行函数UPPER和LOWER来解决这个问题,在后续课程中会讲到。

  在WHERE子句中,比较条件不仅有“=”,还包括“>”、“>=”、“<”、“<=”、“<>”、“!=”、“^=”,其中最后三个均可代表不等于。

  回到employees表,如果希望查询出薪水大于等于12000元的雇员的名字和薪水,则可以用下面的SQL语句:

  1. SELECT first_name, salary FROM employees WHERE salary >= 12000

执行SQL语句,结果如图2.23所示。

2.5 限定返回行 - 图1


图2.22 SQL WHERE子句

2.5 限定返回行 - 图2


图2.23 WHERE子句比较条件

2.5.2 限定行进阶

  前面提交了几个简单的比较条件,“=”、“>”、“>=”、“<”、“<=”、“<>”、“!=”、“^=”。接下来介绍其他几个条件。

  • BETWEEN…AND…条件

  使用BETWEEN条件可以查询显示上下限之间的行。例如希望查询出雇员表中薪水在6000~12000元的雇员的名字和薪水,可以用下面的SQL语句:

  1. SELECT first_name, salary FROM employees WHERE salary BETWEEN 6000 AND 12000

  BETWEEN…AND…本质上是由Oracle转变为一对AND条件:(a >= 下限) AND(a <= 上限),所以使用BETWEEN…AND…并没有性能的提高,只是逻辑上简单而已。

  • IN条件

  IN条件也称为成员条件,用以查询出所选字段中符合指定的一组值中的一个。例如希望查询出雇员表中部门编号是60或90的雇员信息,可以用下面的SQL语句:

  1. SELECT * FROM employees WHERE department_id IN(60,90)

  在IN条件中可以使用任何数据类型,下面的例子从employees表中查询雇员的名字、薪水和职位编号字段,且仅查询职位编号是AD_VP、IT_PROG或FI_ACCOUNT的雇员,SQL语句如下:

  1. SELECT job_id, first_name, salary FROM employees WHERE job_id IN('AD_VP','IT_PROG','FI_ACC OUNT')

  同样的,IN(value1,value2,value3)本质上是由Oracle转变为一组OR条件:a = value1 OR a = value2 OR a = value3,所以使用IN 条件也没有得到性能的提高。

  • LIKE条件

  假设希望搜索employees里所有以D开头的雇员的名字和薪水信息,这时候就需要用到LIKE条件。LIKE条件查询通常也称为通配符查询,可以使用两个通配符来构造需要匹配的字符模板,其中“%”表示零个或多个字符,“_”表示一个字符,这里提到的字符既可以是文字也可以是数字。上面的需求可以用如下的SQL语句实现:

  1. SELECT first_name, salary FROM employees WHERE first_name LIKE 'D%'

  执行SQL语句,结果显示了雇员名字中以D开头的9个工程师的名字和薪水。

  “%”和“”通配符可以被组合使用,例如LIKE ‘%s‘ 表示匹配倒数第二个位置字符为s的字符串。不过,当确实需要匹配“%”和“”这两个字符的时候,可以使用ESCAPE选项,该选项指定换码符是什么。如果想要搜索employees表里job_id包含“AD”的雇员职位编号、名字和薪水信息,可以用下面的SQL语句:

  1. SELECT job_id, first_name, salary FROM employees WHERE job_id LIKE '%AD$_%' ESCAPE '$'

  其中ESCAPE选项指定美元符“$”为换码符,即不将美元符后面的“_”当作通配符看待。执行SQL语句,结果如图2.24所示。

2.5 限定返回行 - 图3


图2.24 “%”和“_”通配符组合使用

  • NULL条件

  NULL条件,包括IS NULL条件和IS NOT NULL条件。IS NULL条件用于判断空值,在Oracle中,空值的含义为难以获得的、未指定的、未知的或者不适用的。这种学术的描述对软件开发人员意义不大,但判断空值时不可以使用“=”进行判断,因为NULL不能等于或不等于任何值。

  如果要查询没有佣金的雇员的职位编号、名字和佣金百分比,用下面的SQL语句:

  1. SELECT job_id,first_name,commission_pct FROM employees WHERE commission_pct IS NULL

  部分显示结果如图2.25所示。

2.5 限定返回行 - 图4


图2.25 NULL条件使用

  • 逻辑条件

  前面使用的都是单个的比较条件,有时候往往一个比较条件难以满足查询的需求,这时候可以使用逻辑条件将多个比较条件组合起来使用。SQL语言的三个逻辑运算符分别是AND、OR和NOT,其含义顾名思义,就是与、或和非。

  如果要从雇员表中查询出部门编号为50,且薪水大于等于5000元的雇员全部信息,SQL语句如下:

  1. SELECT * FROM employees WHERE department_id = 50 AND salary >= 5000

  关于逻辑条件中的NOT运算符,需要注意的是,它通常需要和其他比较运算符一起使用,通常有IN、BETWEEN、LIKE和NULL。

  1. ...WHERE job_id NOT IN ('ST_CLERK', 'AD_VP''SA_REP')
  2. ...WHERE salary NOT BETWEEN 6000 AND 12000
  3. ...WHERE last_name NOT LIKE '_S%'
  4. ...WHERE commission_pct IS NOT NULL
  • 优先规则

  优先规则定义表达式求值和计算的顺序,默认的优先顺序如下:

  (1)算术运算。

  (2)连字操作。

  (3)比较操作。

  (4)IS [NOT] NULL、LIKE、[NOT] IN。

  (5)[NOT] BETWEEN。

  (6)NOT逻辑条件。

  (7)AND逻辑条件。

  (8)OR逻辑条件。

  和Java语言一样,在编写SQL语句时,可以用圆括号括住想要先计算的表达式来覆盖默认的优先顺序。作为软件开发人员,为了使自己编写的SQL语句具有良好的可读性,在碰到优先规则不明确的情况时,建议直接使用圆括号标识优先顺序。