SELECT: WHERE

说明

为SELECT, UPDATE或DELETE语句指定查询条件

语法

select_where ::=

参数

注解

WHERE子句对FROM子句输出结果的每一行进行判断,只输出那些满足条件的行给后续的处理。WHERE条件中可以包含任意结果为布尔类型的表达式,通常形如:

expr logic_op expr

expr cond_op expr

logic_op可以是AND, OR, NOT(此时没有左手边的表达式,即形如NOT expr),cond_op除了常用的<, <=, =, >=, >, <>等操作外,实际上可以

包含任意合法的操作,如LIKE。

WHERE子句中还可以使用子查询。子查询体现了SQL的可扩展性,通过使用子查询,可以写出任何复杂的SQL语句。对于子查询的结果,可以使用

如下操作进行判断:

  1. expr op ALL (子查询):当且仅当对子查询结果中的每一行A,expr op A都成立时表达式才成立。

expr op ANY (子查询):只需对子查询结果中的某一行A,expr op A成立,表达式即成立。

expr [NOT] IN (子查询):判断expr是否在子查询的结果之中,若不指定NOT,则等价于expr = ANY (子查询),若指定NOT,则等价于expr <> ALL (子查询)。

[NOT] EXISTS (子查询):判断子查询的结果是否为空,若不为空,则EXISTS (子查询)成立,否则NOT EXISTS (子查询)成立。

expr op (子查询):此时子查询称为标量子查询,必须返回一行结果且只返回一行,否则系统将会报错。

若右手边表达式为一个子查询,则还可以使用IN, [NOT] EXISTS等操作,及形如expr cond_op [ALL | ANY] (subquery)的表达式,详细说明请

参见下面的SELECT语句的示例。

示例

示例1: 筛选查询结果

--  清理环境
DROP TABLE tab1 CASCADE;


--  创建表并插入数据
CREATE TABLE tab1 (a INT, b INT);

INSERT INTO tab1 VALUES(1, 100);
INSERT INTO tab1 VALUES(2, 200);
INSERT INTO tab1 VALUES(3, 300);


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |100         |
------------------------
2           |200         |
------------------------
3           |300         |
总数目:3



--  筛选查询结果
SELECT * FROM tab1 WHERE b > 200 ORDER BY a;
A(int)      |B(int)      |
------------------------
3           |300         |
总数目:1


--  删除表
DROP TABLE tab1;

示例2: 使用 IN 操作

--  清理环境
DROP TABLE tab2 CASCADE;
DROP TABLE tab3 CASCADE;


--  创建表并插入数据
CREATE TABLE tab2 (a INT, b INT);

INSERT INTO tab2 VALUES(1, 101);
INSERT INTO tab2 VALUES(2, 202);
INSERT INTO tab2 VALUES(3, 303);
INSERT INTO tab2 VALUES(4, 404);


SELECT * FROM tab2 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |101         |
------------------------
2           |202         |
------------------------
3           |303         |
------------------------
4           |404         |
总数目:4


CREATE TABLE tab3 (id INT);

INSERT INTO tab3 VALUES(1);
INSERT INTO tab3 VALUES(2);


SELECT * FROM tab3 ORDER BY id;
ID(int)      |
-------------
1            |
-------------
2            |
总数目:2



--  使用 IN 操作
SELECT * FROM tab2 WHERE a IN (SELECT id FROM tab3) ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |101         |
------------------------
2           |202         |
总数目:2


--  删除表
DROP TABLE tab2;
DROP TABLE tab3;

示例3: 使用 EXISTS

--  清理环境
DROP TABLE tab3 CASCADE;
DROP TABLE tab4 CASCADE;


--  创建表并插入数据
CREATE TABLE tab3 (a INT, b INT);

INSERT INTO tab3 VALUES(1, 101);
INSERT INTO tab3 VALUES(2, 202);
INSERT INTO tab3 VALUES(3, 303);
INSERT INTO tab3 VALUES(4, 404);


SELECT * FROM tab3 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |101         |
------------------------
2           |202         |
------------------------
3           |303         |
------------------------
4           |404         |
总数目:4


CREATE TABLE tab4 (id INT);

INSERT INTO tab4 VALUES(1);
INSERT INTO tab4 VALUES(2);


SELECT * FROM tab4 ORDER BY id;
ID(int)      |
-------------
1            |
-------------
2            |
总数目:2



--  使用 EXISTS
SELECT a FROM tab3 WHERE EXISTS (SELECT id FROM tab4 WHERE a = id) ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  使用 NOT EXISTS
SELECT a FROM tab3 WHERE NOT EXISTS (SELECT id FROM tab4 WHERE a = id) ORDER BY a;
A(int)      |
------------
3           |
------------
4           |
总数目:2


--  删除表
DROP TABLE tab3;
DROP TABLE tab4;

示例4: 使用 ALL 操作

--  清理环境
DROP TABLE tab4 CASCADE;


--  创建表并插入数据
CREATE TABLE tab4 (a INT, b INT);

INSERT INTO tab4 VALUES(1, 100);
INSERT INTO tab4 VALUES(1, 100);
INSERT INTO tab4 VALUES(2, 200);
INSERT INTO tab4 VALUES(2, 0);
INSERT INTO tab4 VALUES(3, 300);
INSERT INTO tab4 VALUES(4, 400);


SELECT * FROM tab4 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |100         |
------------------------
1           |100         |
------------------------
2           |200         |
------------------------
2           |0           |
------------------------
3           |300         |
------------------------
4           |400         |
总数目:6


--  使用 ALL 判断一个表达式是否对子查询的所有结果都成立
SELECT * FROM tab4 WHERE b >= ALL(SELECT AVG(b) FROM tab4 GROUP BY a);
A(int)      |B(int)      |
------------------------
4           |400         |
总数目:1

--  删除表
DROP TABLE tab4;

示例5: 使用标量子查询

--  清理环境
DROP TABLE tab5 CASCADE;
DROP TABLE tab6 CASCADE;


--  创建表并插入数据
CREATE TABLE tab5 (a INT);

INSERT INTO tab5 VALUES(1);
INSERT INTO tab5 VALUES(2);
INSERT INTO tab5 VALUES(3);
INSERT INTO tab5 VALUES(4);
INSERT INTO tab5 VALUES(5);


SELECT * FROM tab5 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
------------
3           |
------------
4           |
------------
5           |
总数目:5


CREATE TABLE tab6 (id INT, b INT);

INSERT INTO tab6 VALUES(1, 100);
INSERT INTO tab6 VALUES(1, 100);
INSERT INTO tab6 VALUES(2, 200);
INSERT INTO tab6 VALUES(2, 0);
INSERT INTO tab6 VALUES(3, 300);
INSERT INTO tab6 VALUES(4, 400);


SELECT * FROM tab6 ORDER BY id;
ID(int)      |B(int)      |
-------------------------
1            |100         |
-------------------------
1            |100         |
-------------------------
2            |200         |
-------------------------
2            |0           |
-------------------------
3            |300         |
-------------------------
4            |400         |
总数目:6



--  使用标量子查询
SELECT * FROM tab5 WHERE (SELECT AVG(b) FROM tab6 WHERE a = id) > 150 ORDER BY a;
A(int)      |
------------
3           |
------------
4           |
总数目:2


--  删除表
DROP TABLE tab5;
DROP TABLE tab6;