sql数据过滤where子句

有时需要根据过滤条件来检索数据,用到where子句。where子句跟在select子句from的后面。where子句的操作符一般如下:
等于=、不等于<>、不等于!=、小于<、小于等于<=、不小于!<、大于>、大于等于>=、不大于!>、指定两个值之间between、为空值 is null
用法大同小异,只要保证子句的位置正确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select id,model_cpu,num_cpus from device_info where id<=5; 
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 1 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 2 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |
| 3 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 4 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |
| 5 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |
+----+----------------------------------+----------+
5 rows in set (0.00 sec)
mysql> select id,model_cpu,num_cpus from device_info where id between 6 and 9;
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 6 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 7 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |
| 8 | Intel(R)Xeon(R)CPUE5620@2.40GHz | 16 |
| 9 | Intel(R)Xeon(R)CPUE5620@2.40GHz | 16 |
+----+----------------------------------+----------+
4 rows in set (0.04 sec)

具体到不同的数据库,可能支持的操作符不一样,但都能达到相同的功能。从上面的例子可以看出可以用逻辑运算符 and or 将多个条件串联起来,and 的优先级高于or,() 的优先级最高,有点像C语言的运算符的优先级。
数据过滤操作符 in:

1
2
3
4
5
6
7
8
mysql> select id,model_cpu,num_cpus from device_info where id in(6,9) 
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 6 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 9 | Intel(R)Xeon(R)CPUE5620@2.40GHz | 16 |
+----+----------------------------------+----------+
2 rows in set (0.00 sec)

数据过滤操作符not,能结合in来使用:

1
2
3
4
5
6
7
8
9
10
11
mysql> select id,model_cpu,num_cpus from device_info where id not in(6,9); 
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 1 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 2 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |
| 3 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 4 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |
| 5 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |
| 7 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |
| 8 | Intel(R)Xeon(R)CPUE5620@2.40GHz | 16 |

查询结果就将 id 含有6和9的行排除了。
上面的这些过滤方法是常用的,还可以用通配符进行过滤,这些通配符结合like子句使用,开发中应该尽量避免是由like,特别是从大量数据中匹配查找时,如果机器性能足够强大还是可以用的。
百分号通配符%% 标识任意字符出现任意次数,就像bash中的*号。

1
2
3
4
5
6
mysql> select id,model_cpu,num_cpus from device_info where model_cpu like 'Intel%'; 
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 1 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 2 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |

下划线_通配符,与%类似,但是只匹配单个字符

1
2
3
4
5
6
7
8
9
mysql> select id,model_cpu,num_cpus from device_info where model_cpu like 'Intel(R)Xeon(R)CPUE5-26200@2.00_'; 
+----+----------------------------------+----------+
| id | model_cpu | num_cpus |
+----+----------------------------------+----------+
| 1 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 2 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 24 |
| 3 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 8 |
| 4 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |
| 5 | Intel(R)Xeon(R)CPUE5-26200@2.00G | 12 |

如果能够以其他的操作语句达到过滤的目的,就应该避免过分使用通配符。貌似通配符还有[ ]^等。

----------------本文结束 感谢阅读----------------