SELECT使用WHERE过滤数据

本文介绍了如何在MySQL中使用WHERE子句来过滤数据,包括算术操作符、AND和OR逻辑操作符的使用,以及IN和NOT IN操作符的详细解释和优缺点。通过示例展示了如何通过WHERE子句构建复杂的查询条件,以精确地提取所需的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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!=100set_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=100variable='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=100value=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不等于10065535的所有数据。

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子句取反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值