一、过滤数据
1.1 使用WHERE子句
在SELECT
语句中,数据根据WHERE
子句中指定的搜索条件进行过滤。WHERE
子句在表名(FROM
子句)之后给出,如下所示:
SELECT id,home FROM table1 WHERE name = "TN6";
WHERE子句的位置: 在同时使用ORDER BY
和WHERE
子句时,应该让ORDER BY
位于WHERE
之后,否则将会产生错误。
1.2 WHERE子句操作符
MySQL支持下表列出的所有条件操作符:
操作符 | 说明 |
| 等于 |
| 不等于 |
| 不等于 |
| 小于 |
| 小于等于 |
| 大于 |
| 大于等于 |
| 指定的两个值之间 |
上述指令使用示例如下:
范围检查
SELECT id,home FROM table1 WHERE id < 6;
SELECT id,home FROM table1 WHERE id <= 6;
不匹配检查
SELECT id,home FROM table1 WHERE name <> "TN6";
范围值检查
SELECT id,home FROM table1 WHERE id BETWEEN 4 AND 6;
空值检查
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。该子句是IS NULL
。其语法示例如下:
SELECT id FROM table1 WHERE home IS NULL;
二、数据过滤
2.1 组合WHERE子句
mysql允许给出多个WHERE
子句,这些子句可以两种方式使用:以AND
子句的方式或OR
子句的方式使用。
2.1.1 AND操作符
SELECT id,phone FROM table1 WHERE name = "TN6" ADN id <= 5;
2.1.2 OR操作符
OR
操作符与AND
操作符不同,它指示mysql检索匹配任一条件的行,命令如下:
SELECT id,phone FROM table1 WHERE name = "TN6" OR id <= 5;
2.1.3 计算次序
WHERE
可包含任意数目的AND
和OR
操作符。允许两者结合以进行复杂和高级的过滤。SQL在处理OR
操作符前,优先处理AND
操作符。可使用圆括号明确地分组相应的操作符。
任何时候使用具有AND
和OR
操作符的WHERE
子句,都应该使用圆括号明确地分组操作符。
2.2 IN操作符
圆括号在WHERE
子句中还有另外一种用法。IN
操作符用来指定条件范围,表示的是列表,列表中的每个值都可以进行匹配。指定条件范围在圆括号中,示例如下。
SELECT id,phone FROM table1 WHERE id IN (2,5) ORDER BY name;
使用IN
操作符的有如下优点:
- 在使用长的合法选项清单时,
IN
操作符的语法更清楚和直观。 - 在使用
IN
时,计算的次序更容易管理(因为使用的操作符更少)。 -
IN
操作符一般比OR
操作符清单执行更快。 -
IN
最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE
子句。
2.3 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
SELECT id,phone FROM table1 WHERE id NOT (2,5) ORDER BY name;
MySQL支持使用NOT
对IN
、BETWEEN
和EXISTS
子句取反,这与多数其他DBMS允许使用NOT
对各种条件取反有很大的差别。
三、用通配符进行过滤
3.1 LIKE操作符
为在搜索子句中使用通配符,必须使用LIKE
操作符。LIKE
指示mysql后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
3.1.1 百分号(%)通配符
最常使用的通配符是百分号%
。在搜索串中,%
表示任何字符出现任意次数。例如,为了找出所有以12开头的内容,可使用以下SELECT
语句:
SELECT id,home FROM table1 WHERE phone LIKE '12%';
区分大小写 根据MySQL的配置方式,搜索是可以区分大小写的
3.1.1 下划线(_
)通配符
另一个有用的通配符是下划线(_
)。下划线的用途与%
一样,但下划线只匹配单个字符而不是多个字符。
SELECT id,home FROM table1 WHERE name LIKE 'TN_';
3.2 使用通配符的技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在需要使用通配符时,除非绝对有必要,否则不要把它用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回预期的结果
四、使用正则表达式进行搜索
4.1 使用mysql正则表达式
4.1.1 基本字符匹配
下面的语句检索列name包含文本TN的所有行:
SELECT id,home FROM table1 WHERE name REGEXP 'TN';
此命令表示:REGEXP
后所跟的内容作为正则表达式(与文字正文TN匹配的一个正则表达式)处理。
匹配不区分大小写: MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即大写和小写都匹配)
4.1.2 进行OR匹配
为搜索两个串之一,使用|
,示例如下:
SELECT id,home FROM table1 WHERE name REGEXP 'TN|李';
4.1.3 匹配几个字符之一
匹配任何单一字符。若只想匹配特定的字符,可通过指定一组用[]
括起来的字符来完成,如下所示:
SELECT id,home FROM table1 WHERE name REGEXP 'TN[26]';
这里,使用了正则表达式TN[26]
。[26]
定义一组字符,其含义是匹配2或6,因此, TN2
和TN6
都匹配且返回。字符集合也可以被否定,即它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^
即可,因此,[^26]
匹配除这些字符外的任何东西。
4.1.4 匹配范围
集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]
为简化这种类型的集合,可使用-
来定义一个范围。下式功能上等同于上述数字列表:[0-9]
SELECT id,home FROM table1 WHERE name REGEXP 'TN[2-6]';
4.1.5 匹配范围
SELECT id,home FROM table1 WHERE name REGEXP '.';
.
匹配任意字符,因此每个行都被检索出来
为了匹配特殊字符,必须用\\
为前导。\\-
表示查找-
, \\.
表示查找.
。\\
也用来引用元字符(具有特殊含义的字符),如下表所示:
元字符 | 说明 |
| 换页 |
| 换行 |
| 回车 |
| 制表 |
| 纵向制表 |
匹配\
为了匹配反斜杠\
字符本身,需要使用\\\
。
4.1.6 匹配字符类
为更方便工作,可以使用预定义的字符集,称为字符类(character class)。下表列出字符类以及它们的含义。
类 | 说明 |
| 任意字母和数字(同 |
| 任意字符(同 |
| 空格和制表(同 |
| ASCII控制字符(ASCII 0到31和127) |
| 任意数字(同 |
| 与 |
| 任意小写字母(同 |
| 任意可打印字符 |
| 既不在 |
| 包括空格在内的任意空白字符(同 |
| 任意大写字母(同 |
| 任意十六进制数字(同 |
4.1.7 匹配多个实例
下表列出的正则表达式重复元字符来完成
元字符 | 说明 |
| 0个或多个匹配 |
| 1个或多个匹配(等于 |
| 0个或1个匹配(等于 |
| 指定数目的匹配 |
| 不少于指定数目的匹配 |
| 匹配数目的范围(m不超过255) |
匹配连在一起的4位数字:
SELECT id, home FROM table1 WHERE name REGEXP '[[:digit:]]{4}';
4.1.8 定位符
为了匹配特定位置的文本,需要使用下表列出的定位符:
元字符 | 说明 |
| 文本的开始 |
| 文本的结尾 |
| 词的开始 |
| 词的结尾 |
若想找出以一个数(包括以小数点开始的数)开始的所有内容,可使用^
定位符,如下所示:
SELECT id,home FROM table1 WHERE name REGEXP '^[0-9\\.]';
^
匹配串的开始。因此,^[0-9\\.]
只在串中第一个字符为.
或任意数字时才匹配它们。