WHERE子句
数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定条件提取表数据的子集。
在SELECT
语句中,数据根据WHERE子句
中指定的搜索条件进行过滤。
WHERE子句
在表名(FROM子句
)之后。
SELECT 列名 FROM 表名 WHERE 条件;
例如过滤sys
数据库中sys_config
表中的数据,获取value=100
的数据。
mysql> SELECT * FROM sys_config WHERE value = 100;
+--------------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+--------------------------------------+-------+---------------------+--------+
| statement_performance_analyzer.limit | 100 | 2021-04-23 23:56:03 | NULL |
+--------------------------------------+-------+---------------------+--------+
1 row in set, 2 warnings (0.00 sec)
WHERE子句的算术操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN 值1 AND 值2 | 指定的两个值之间(包括起始和结束值) |
IS NULL | 是否为空值 |
WHERE子句的AND和OR逻辑操作符
AND操作符
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
SELECT 列名 FROM 表名 WHERE 条件1 AND 条件2;
例如过滤sys
数据库中sys_config
表中的数据,获取value!=100
且set_time='2021-04-23 23:56:03'
的数据。
mysql> SELECT * FROM sys_config WHERE value != 100 AND set_time='2021-04-23 23:56:03';
+-------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+-------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables | OFF | 2021-04-23 23:56:03 | NULL |
| diagnostics.include_raw | OFF | 2021-04-23 23:56:03 | NULL |
| ps_thread_trx_info.max_length | 65535 | 2021-04-23 23:56:03 | NULL |
| statement_truncate_len | 64 | 2021-04-23 23:56:03 | NULL |
+-------------------------------+-------+---------------------+--------+
4 rows in set, 2 warnings (0.00 sec)
OR操作符
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
SELECT 列名 FROM 表名 WHERE 条件1 OR 条件2;
例如过滤sys
数据库中sys_config
表中的数据,获取value=100
或variable='diagnostics.allow_i_s_tables'
的数据。
mysql> SELECT * FROM sys_config WHERE value =100 OR variable='diagnostics.allow_i_s_tables';
+--------------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+--------------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables | OFF | 2021-04-23 23:56:03 | NULL |
| statement_performance_analyzer.limit | 100 | 2021-04-23 23:56:03 | NULL |
+--------------------------------------+-------+---------------------+--------+
2 rows in set, 2 warnings (0.00 sec)
计算次序
WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。当AND操作符和OR操作符同时出现时,SQL在处理OR操作符前,会优先处理AND操作符。需要优先处理OR操作符时,可以使用括号来对运算符进行分组。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。
WHERE子句的IN和NOT操作符
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
SELECT 列名 FROM 表名 WHERE 列名 IN (选项1,选项2);
例如检索sys_config
表中value=100
和value=65535
的所有数据。
mysql> SELECT * FROM sys_config WHERE value IN (100,65535);
+--------------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+--------------------------------------+-------+---------------------+--------+
| ps_thread_trx_info.max_length | 65535 | 2021-04-23 23:56:03 | NULL |
| statement_performance_analyzer.limit | 100 | 2021-04-23 23:56:03 | NULL |
+--------------------------------------+-------+---------------------+--------+
2 rows in set, 2 warnings (0.00 sec)
可以发现IN操作符的作用与OR操作符的作用相同,上述SQL语句也可以使用OR操作符实现:
mysql> SELECT * FROM sys_config WHERE value=100 OR value=65535;
+--------------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+--------------------------------------+-------+---------------------+--------+
| ps_thread_trx_info.max_length | 65535 | 2021-04-23 23:56:03 | NULL |
| statement_performance_analyzer.limit | 100 | 2021-04-23 23:56:03 | NULL |
+--------------------------------------+-------+---------------------+--------+
2 rows in set, 4 warnings (0.00 sec)
IN操作符相比于OR操作符有一下优点:
- 在使用较长的选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比OR操作符清单执行更快。
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
NOT IN操作符
WHERE子句中的NOT操作符是用来否定它之后所跟的任何条件。
SELECT 列名 FROM 表名 WHERE 列名 NOT IN (选项1,选项2);
例如检索sys_config
表中value
不等于100
和65535
的所有数据。
mysql> SELECT * FROM sys_config WHERE value NOT IN (100,65535);
+------------------------------+-------+---------------------+--------+
| variable | value | set_time | set_by |
+------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables | OFF | 2021-04-23 23:56:03 | NULL |
| diagnostics.include_raw | OFF | 2021-04-23 23:56:03 | NULL |
| statement_truncate_len | 64 | 2021-04-23 23:56:03 | NULL |
+------------------------------+-------+---------------------+--------+
3 rows in set, 2 warnings (0.00 sec)
MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反。