WHERE 子句 的语法是
WHERE search_condition
这里的 search_condition 是任意返回一个类型为boolean的值表达式 (参阅 Section 4.2)。
在完成对FROM子句的处理之后,生成的每一行都会对搜索条件进行检查。 如果该条件的结果是真,那么该行输出到输出表中,否则(也就是说, 如果结果是假或空)就把它抛弃。搜索条件通常至少要引用一些在FROM子句里生成的列; 这不是必须的,但如果不是这样的话,那么WHERE子句就没什么用了。
注意: 内连接的连接条件既可以写在 WHERE 子句也可以写在 JOIN 子句里。 比如,这些表表达式是等效的:
FROM a, b WHERE a.id = b.id AND b.val > 5
和
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5
或者可能还有
FROM a NATURAL JOIN b WHERE b.val > 5
你想用哪个只是一个风格问题。FROM子句里的JOIN语法可能不那么容易移植到其它产品中。 对于外部连接(outer join)而言,我们在任何情况下都没有选择:它们必须在FROM子句中完成。 外部连接的 ON/USING 子句不等于WHERE条件, 因为它判断最终结果中行的增(那些不匹配的输入行)和删。
这里是一些 WHERE 子句的例子:
SELECT ... FROM fdt WHERE c1 > 5
SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)
SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)
SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)
SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100
SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)
在上面的例子里,fdt是从FROM子句中派生的表。 那些不符合WHERE子句的搜索条件的行从fdt中删除。 请注意我们把标量子查询当做一个值表达式来用。 就好象任何其它查询一样,子查询里可以使用复杂的表表达式。 同时还请注意fdt是如何引用子查询的。 把c1修饰成fdt.c1只有在c1是该子查询生成的列的名字时才是必须的。 但修饰列名字可以增加语句的准确性,即使有时候不是必须的。 这个例子就演示了字段名字范围如何从外层查询扩展到它的内层查询.