可以创建包含任意数量搜索条件的查询,这些条件用任意数量的 AND 和 OR 运算符相链接。组合了 AND 和 OR 子句的查询会很复杂,所以有必要了解在执行这种查询时查询被解释的方式,以及这种查询在“网格”和 SQL 窗格中是如何表示的。 为便于理解下面的讨论,假设正在处理包含有hire_date、job_lvl和status列的employee表。该示例假定用户需了解诸如某雇员在公司里工作了多久(也就是了解该雇员的雇佣日期)、该雇员从事何种工作(也就是岗位级别)以及该雇员的状态(例如,是否退休)等信息。 AND 和 OR 运算符的优先级 当执行一个查询时,它会首先计算用 AND 运算符链接的子句,然后计算用 OR 运算符链接的子句。 注释NOT 运算符的优先级比 AND 和 OR 都高。 例如,为了找出在低级岗位上为公司工作了五年以上的雇员以及不论工作年限长短在中级岗位上的雇员,可以构建如下 WHERE 子句: WHERE hire_date < '01/01/90' AND job_lvl = 100 OR job_lvl = 200 WHERE hire_date < '01/01/90' AND(job_lvl = 100 OR job_lvl = 200) 为使优先级结构清楚,建议在组合使用 AND 和 OR 子句时总是使用括号,而不要依赖于默认的优先级。 AND 子句与多个 OR 子句一起使用的方式 理解 AND 和 OR 子句的组合方式,有助于在“查询设计器”中构建和理解复杂的查询。 如果用 AND 链接了多个条件,则与 AND 链接的第一组条件会应用于第二组中的所有条件上。换句话说,用 AND 链接到另一个条件的条件,会分配给第二组中的所有条件。例如,下列示意的表达方式显示了一个链接到一组 OR 条件的 AND 条件: A AND (B OR C) (A AND B) OR (A AND C) WHERE (hire_date < '01/01/90' ) AND (job_lvl = 100 OR job_lvl = 200) WHERE (hire_date < '01/01/90' ) AND (job_lvl = 100) OR (hire_date < '01/01/90' ) AND (job_lvl = 200) WHERE (job_lvl = 200 OR job_lvl = 300) AND (hire_date < '01/01/90' ) OR (status = 'R') WHERE (job_lvl = 200 AND hire_date < '01/01/90' ) OR (job_lvl = 200 AND status = 'R') OR (job_lvl = 300 AND hire_date < '01/01/90' ) OR (job_lvl = 300 AND status = 'R') “查询设计器”在“网格”窗格中表达搜索条件。但是,对于包含用 AND 和 OR 链接的多个子句的条件,“网格”窗格中的表达方式可能与预想的不一样。另外,如果在“网格”或“图表”窗格中修改查询,则会发现 SQL 语句与所输入的会有所不同。 下面是 AND 和 OR 子句在“网格”窗格中显示的一般规则: 用 AND 链接的所有条件都显示在“准则”网格列中,或显示在同一“或?…”列中。 WHERE (hire_date < '01/01/90' )AND (job_lvl = 100)OR (status = 'R')
但是,如果链接的 OR 子句具有比 AND 子句高的优先级,则对每个 OR 子句都会重复这个 AND 子句。这样,这个 AND 子句会分配给每个 OR 子句。例如,在 SQL 窗格中,可能创建如下 WHERE 子句: WHERE (hire_date < '01/01/90' )AND ( (job_lvl = 100)OR (status = 'R') )
如果链接的 OR 子句只涉及一个数据列,则“查询设计器”会将整个 OR 子句放在该网格的单个单元格中,从而避免重复使用 AND 子句。例如,在 SQL 窗格中,可能创建如下 WHERE 子句: WHERE (hire_date < '01/01/90' )AND ((status = 'R')OR(status = 'A'))
如果更改了查询(例如,在“网格”窗格中更改了一个值),“查询设计器”会在 SQL 窗格中重新创建这个 SQL 语句。重新创建的 SQL 语句会类似于“网格”窗格的显示,而与原来的语句有所不同。例如,如果“网格”窗格中包含要分配的 AND 子句,则 SQL 窗格中的生成语句会用明确分配的 AND 子句重新创建。 |