SELECT: WHERE¶
说明¶
为SELECT, UPDATE或DELETE语句指定查询条件
参数¶
注解
WHERE子句对FROM子句输出结果的每一行进行判断,只输出那些满足条件的行给后续的处理。WHERE条件中可以包含任意结果为布尔类型的表达式,通常形如:
expr logic_op expr
或
expr cond_op expr
logic_op可以是AND, OR, NOT(此时没有左手边的表达式,即形如NOT expr),cond_op除了常用的<, <=, =, >=, >, <>等操作外,实际上可以
包含任意合法的操作,如LIKE。
WHERE子句中还可以使用子查询。子查询体现了SQL的可扩展性,通过使用子查询,可以写出任何复杂的SQL语句。对于子查询的结果,可以使用
如下操作进行判断:
- 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;