MYSQL中使用WHERE
关键字能达到过滤数据的作用。
一、使用where接单语句进行过滤
(1)使用where子句
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.5;
从表products中选择出prod_price 等于2.5的行。
SQL过滤与应用过滤:
数据也可在应用层过滤,为此目的,SQL的SELECT语句为客户机应用检索出超过实际需要的数据,然后客户机代码对返回数据进行循环,以提取出需要的行。
通常,这种实现并不令人满意,因此,对数据库进行优化,以便快速有效地对数据进行过滤,让客户机应用处理数据库的工作会极大影响应用的性能,并且使所创建的应用完全不具备可伸缩性,此外,如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,导致网络带宽的浪费。
(2)WHERE子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
(3)检查单个字符
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses;
MySQL在执行匹配时默认不区分大小写
(4)不匹配检查
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;
单引号用来限定字符串,如果将值与串类型的列进行比较,则需要限定单引号,用来与数值列进行比较不用引号。
(5)范围值检查
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
BETWEERN
匹配范围中的所有值,包括指定的开始值和结束值。
(6)空值检查
在创建表时,表的设计人员可以指定其中的类是否可以不包含空值。在一个列不包含值时,称其为包含空值NULL。 NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。(就是该位置不存放值,称为空值)检查空值:
SELECT prod_name FROM products WHERE prod_price IS NULL;
NULL 与不匹配: 在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL的值的行,但是,不行,因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在过滤数据时,一定要验证返回的数据中确定是给出了被过滤列具有NULL的行。
二、多个WHERE语句组合使用
(1) AND 操作符
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
(2)OR操作符
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
(3)计算次序(AND 和 OR组合使用)
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
因为在MySQL中。AND在计算次序中优先级更高,所以为了提高代码的可读性和正确性建议使用括号
如:
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR (vend_id = 1003 AND prod_price >= 10);
(4)IN操作符
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
这里是筛选出vend_id 为1002或1003的行。
实际上,IN
操作符与OR
相同功能。
为什么要使用IN
操作符:有如下优点:
- 在使用长的合法选项清单时,
IN
操作符的语法更清晰更直观; - 在使用
IN
时,计算的次序更容易管理(因为使用的操作符更少); IN
操作符比一般OR
操作符清单执行更快;IN
的最大有点就是可以包含其它SELECT
语句,使得能够更动态地建立WHERE
子句。
(5)NOT操作符
WHERE 子句中用来否定跟条件的关键字
SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_price;
三、用通配符进行过滤
(1)百分号(%)通配符
% 表示任何字符出现任意次数,可以是0次, 1次,多次
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'ject%';
在执行词条语句,将索引任意以ject开头的词。
区分大小写: 根据MySQL的配置方式,搜索可以是区分大小写的。
(2)下划线(_)通配符
_ 表示自能匹配单个字符
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
通配符搜索的处理一般要比前面讨论的其它搜所花时间更长
使用通配符的技巧:
- 不要过度使用通配符
- 在确定需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始
- 仔细注意通配符的位置,如果放错,可能返回不想要的数据
四、用正则表达式进行搜索
(1)基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000 ORDER BY prod_name;
REGEXP
后所跟的东西作为正则表达式处理。
LIKE 和 REGEXP的区别:
- LIKE 匹配的整个列,如果匹配的文本在列值中出现,LIKE 将不会找到它,相应的行也不会返回,而REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现, REGEXP将会找到它,返回相应的行
(2)进行OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
返回prod_name 含有1000或2000的列。
(3)匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
这里是指返回prod_name 中含有1 Ton, 2 Ton 或 3 Ton的行。
(4)匹配返回
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
这里是指返回prod_name 中含有1 Ton, 2 Ton , 3 Ton, 4 Ton 或 5 Ton的行。
(5)匹配特殊字符
SELECT vend_name FROM products WHERE vend_name REGEXP '.';
'.'表示匹配任意字符。
为了匹配特殊字符,必须使用\作为前导。
SELECT vend_name FROM products WHERE vend_name REGEXP '\\.';
(6)匹配多个实例
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目的匹配 |
{n, } | 不少于指定数目的匹配 |
{n, m} | 匹配数目的范围 |
(7)定位符
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[: <:]] | 词的开始 |
[[:>:]] | 词的结尾 |
注意:^的双重用途, 在集合中(用[ 和] 定义),用它来否定该集合,否则,用来指定串的开始。
参考资料:
【1】MYSQL必会必知