一.数据过滤
1. 组合where子句
为了进行更强大的过滤控制,MySQL允许给出多个where子句,这些子句可以以两种方式使用:以AND子句的方式或OR子句的方式使用。
操作符:用来联结或改变where子句中子句的关键字。也称为逻辑操作符。
AND操作符:
AND用在where子句中的关键字,用来指示检索满足所有给定条件的行。
Select prod_id,prod_price,prod_name
From products
Where vend_id = 1003 AND prod_price<=10;
OR 操作符
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
Select prod_name,prod_price
From produnts
Where vend_id = 1002 OR vend_id = 1003;
2. 计算次序
在SQL在处理OR操作符前,优先处理AND操作符。为避免发生错误,优先计算的条件需要用圆括号括起来。
Select pro_name,pro_price
From products
Where (vend_id = 1002 OR ven_id = 1003)AND pro_price>=10;
3. IN 操作符
圆括号在WHERE子句中还有一种用法,IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔符的清单,包括在圆括号中。
Select pro_name,pro_price
From products
Where vend_id IN (1002,1003)
ORDER BY prod_name;
此select语句检索供应商1002和1003制造的所有产品。IN操作符的功能与OR有相似之处,但比OR操作符清单执行更快。
4. NOT操作符
NOT 操作符用来否定它之后所跟的任何条件。
Select prod_name,pro_price
From products
Where vend_id NOT IN (1002,1003)
ORDER BY prod_name;
二.用通配符进行过滤
1. LIKE操作符
通配符:用来匹配值的一部分的特殊字符
搜索模式:由字面值,通配符或两者组合构成的搜索条件
为了搜索子句中使用通配符,必须使用LIKE 操作符。LIKE指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配。
2. 百分号(%)通配符
最常用的通配符是百分号(%),在搜索串中,%表示任何字符出现任意次数。如”jet%”表示搜索以jet开头的词。“%jet%”表示匹配任何位置包含文本jet的值。”%anvil”表示末尾为anvil的词。
Select prod_id,prod_name
From products
Where pro_name LIKE “jet%”;
- 注意:
%通配符不可以用来匹配空值。
3.下划线(-)通配符
下划线的用途与%一样,但下划线只匹配单个字符不是多个字符。
Select pro_id,prod_name
From products
Where prod_name LIKE “_ton anvil”;
搜索的是ton anvil 前面之后一个字符的文本。
- l注意:
与%能匹配0个字符不一样,-总是匹配一个字符,不能多也不能少。
三.用正则表达式进行搜索
1. 使用MySQL正则表达式
正则表达式是用来匹配文本的特殊的串(字符集合)。想要从文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果想要在一个文本块中找到所有的重复的单词,可以使用一个正则表达式。
2. 基础字符匹配
下面检索列prod_name包含文本1000的所有行:
Select pro_name
From products
Where prod_name REGEXP ‘1000’
Order by prod_name;
正则表达式‘.000’。是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符,因此,1000和2000都匹配且返回。
Select prod_name
From products
Where prod_name REGEXP ‘.000’
Order by prod-name;
- 注意:
Like与Regexp的差别,LIKE匹配整个列。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,Regexp将会找到它,相应的行将会返回。
3. 进行OR匹配
为搜索两个串之一,(或者为这个串,或者为那个串),可以使用| ,
Select pro_name
From products
Where prod_name Regexp ‘1000|2000’
Order by prod_name;
返回的结果中1000和2000都匹配并都返回。
|字符的功能类似于在select语句中使用or语句,多个or条件可并入单个正则表达式。
4. 匹配几个字符之一
可通过指定一组用[和]括起来的字符来完成,
Select prod_name
From products
Where prod_name REGEXP ‘[123] Ton’
Order by prod_name;
这里使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2ton都匹配且返回。
- 注意:
‘1|2|3 Ton’的含义则表示‘1’,‘2’,‘3ton’。
[^123]却匹配除这些字符外的任何东西。
5. 匹配范围
集合可用来定义要匹配的一个或多个字符。
如[0-9]以及[6-9],[a-z]匹配任何字母字符
Select prod_name
From products
Where prod_name REGEXP ‘[1-5] Ton’
Order by prod_name;
6. 匹配特殊字符
如果需要匹配特殊字符,必须用为前导,-表示查找-,.表示查找.。
Select vend_name
From vendors
Where vend_name REGEXP ‘.’
Order by vend_name;
7. 匹配多个实例
复杂的匹配需要使用到正则表达式重复元字符来完成
如select prod_name
From products
Where prod_name REGEXP ’([0-9]sticks?)’
这里的REGEXP’([0-9]sticks?)’,需要解释一下,(匹配),[0-9]匹配任意数字,sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),)匹配)。
另一个例子
Select prod_name
From products
Where prod_name REGEXP ‘[[:dight:]]{4}’
Order by prod_name;
这里的‘[[:dight:]]{4}’, [:dight:]表示匹配任意的数字,{4}表示前面的字符出现4次,即任意4位数。
8. 定位符
为了匹配特定位置的文本,需要使用定位符。
如想找出一个数(包括以小数点开始的数)开始的所有产品
Select prod_name
From products
Where prod_name REGEXP ‘="">^[0-9.]’
Order by prod_name;
^匹配串的开始,’^[0-9.]’只在.或任意数字为串中第一个字符时才匹配它们。