MYSQL必知必会(三)过滤数据
- 过滤数据
- 使用WHERE字句
- WHERE字句操作符
- 检查单个值
- 不匹配检查
- 范围值检查
- 空值检查
- 数据过滤
- 组合WHERE字句
- AND操作符
- OR操作符
- 计算次序
- IN操作符
- NOT操作符
- 用通配符进行过滤
- LIKE操作符
- 百分号(%)通配符
- 下划线(_)通配符
- 使用通配符技巧
过滤数据
使用WHERE字句
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出
SELECT prod_name,prod_price
FROM products
where prod_price = 2.5;
ORDER BY和WHERE同时使用时
ORDER BY位于WHERE之后
WHERE字句操作符
检查单个值
SELECT prod_name,prod_price
FROM products
where prod_name = 'fuses';
SELECT prod_name,prod_price
FROM products
where prod_price<10;
不匹配检查
SELECT vend_id,prod_name
FROM products
where vend_id <> 1003;
SELECT vend_id,prod_name
FROM products
where vend_id != '1003';
范围值检查
BETWEEN匹配范围中所有的值,包括指定的开始值和结束值
SELECT prod_name,prod_price
FROM products
where prod_price BETWEEN 5 AND 10;
空值检查
NULL无值(no value),它与字段包含0、空字符串或仅仅包含空格不同
SELECT prod_name
FROM products
where prod_price IS NULL;##返回价格为空的名字
在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行
SELECT cust_id
FROM customers
where cust_email IS NULL;
数据过滤
组合WHERE字句
AND操作符
SELECT prod_id,prod_price,prod_name
FROM products
where vend_id = 1003 AND prod_price <=10;
OR操作符
SELECT prod_price,prod_name
FROM products
where vend_id = 1003 OR vend_id=1002;
计算次序
假如需要列出价格为10美元(含)以上且由1002或1003制造的所有产品
SELECT prod_name,prod_price
FROM products
where vend_id = 1002 OR vend_id=1003 AND prod_price >=10 ;
返回的行中有两行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?
原因在于计算的次序。SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符
AND 优先级大于 OR
SELECT prod_name,prod_price
FROM products
where (vend_id = 1002 OR vend_id=1003) AND prod_price >=10 ;
此为我们所想要的
注:任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符
IN操作符
圆括号在WHERE子句中还有另外一种用法
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配
IN取合法值的由逗号分隔的清单,全都括在圆括号中
SELECT prod_name,prod_price
FROM products
where vend_id IN (1002,1003)
ORDER BY prod_name;
IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。
IN操作符完成与OR相同的功能
SELECT prod_name,prod_price
FROM products
where vend_id =1002 OR vend_id=1003
ORDER BY prod_name;
IN操作符优点
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)
- IN操作符一般比OR操作符清单执行更快
- N的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
NOT操作符
功能: 否定它之后所跟的任何条件
SELECT prod_name,prod_price
FROM products
where vend_id NOT IN(1002,1003)
ORDER BY prod_name;
用通配符进行过滤
LIKE操作符
通配符(wildcard):用来匹配值的一部分的特殊字符
搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件
为在搜索子句中使用通配符,必须使用LIKE操作符
百分号(%)通配符
%:表示任何字符出现任意次数
#找出所有以词jet起头的产品
SELECT prod_id,prod_name
FROM products
where prod_name LIKE 'jet%'
SELECT prod_id,prod_name
FROM products
where prod_name LIKE '%anvil%'
注:%可匹配 0,1,多个字符,不能匹配NULL
下划线(_)通配符
注:下划线(_)只能匹配一个字符,要注意空格,空格也是字符
SELECT prod_id,prod_name
FROM products
where prod_name LIKE '_ ton anvil'
和%比较
SELECT prod_id,prod_name
FROM products
where prod_name LIKE '% ton anvil'
使用通配符技巧
通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长
技巧:
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
- 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据