您的位置:首页 > 数据库 > MySQL

MySQL入门-5:数据过滤

2014-06-04 14:54 309 查看
大纲
1、WHERE子句初级过滤
2、比较函数
3、高级过滤

1、WHERE子句初级过滤
通常我们会根据特定操作或报告的需要提取表数据的子集。只检索出感兴趣的数据,需要指定搜索条件(search criteria),或过滤条件(filter condition)。




SQL过滤与应用过滤
数据也可以在应用程序层进行过滤。为此目的,SELECT语句为客户机应用程序检索出超过实际所需的数据,然后客户机代码对返回的数据集进行循环,以提取出需要的行。通常,这种实现并不令人满意。为此,数据库专门进行了优化,以便快速有效的对数据进行过滤。
使用客户机(或开发语言)处理数据库的工作将会极大的影响应用程序的性能,并且使所创建的应用完全不具备可伸缩性,此外,服务器不得不通过网络发送多余的数据,导致带宽的浪费。

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在FROM子句之后给出,如果有ORDER BY子句,那么WHERE子句应该出现在ORDER BY之前。假设我要检索出价格等于2.5的商品名称:
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE prod_price = 2.5;
这里,仅采用简单的相等测试,但是SQL允许做的事情不仅仅是这些,WHERE子句操作符:



a、范围值检查
可以使用BETWEEN操作符,需要提供两个值,范围的开始值和结束值[start, end],包含开始和结束的值。
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE prod_price BETWEEN 5 AND 10;
b、NULL值检查
如果列中不包含值时,那么其为NULL。NULL是一个逻辑概念,与字段值为0、空字符串''或者包含空格不同。NULL仅仅表示一种逻辑上的概念。NULL不能进行相等测试 = , 为此提供一个专门的IS [NOT] NULL子句来检查是否为NULL。
mysql> SELECT cust_id
-> FROM customers
-> WHERE cust_email IS NULL;
NULL与不匹配
除了IS [NOT] NULL之外,NULL不满足任何查找条件。
在通过过滤选择出不具有特定值的行时,可能希望返回具有NULL值的行。但是,不行。因为NULL具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。看起来比较抽象,举个例子:假设prod_price字段中,存在NULL,那么我用WHERE prod_price > 2.5; 这个条件进行过滤时,那么NULL的行并不会被匹配到。

因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。
如果NULL参与算术运算,则该算术表达式的值为NULL;如果NULL参与比较运算,则结果为UNKNOWN;如果NULL参与聚集运算,则除count(*)之外其他聚集函数都忽略NULL。
1、判断是否等于null,不能用=null和<>null,要用 is null 和 is not null 。
2、设置字段值为null,可以用 update XX set YY=null。null外面不要加引号。
3、插入新记录用 insert XXX (YYY)values(null)。null外面不要加引号。
特别要注意null/NULL与’NULL’、’null’的区别。







何时使用引号
单引号用来限定字符串。如果将值与字符串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值则不需要引号。所以,我们可以粗略的认为存在3种类型:数值、字符串、日期。

2、比较函数
比较运算产生的结果为1(TRUE)、0
(FALSE)或 NULL。这些运算可用于数字和字符串。根据需要,字符串可自动转换为数字,而数字也可自动转换为字符串。

MySQL按照以下规则进行数值比较:

若有一个或两个参数为
NULL,除非NULL-safe <=> 等运算符,则比较运算的结果为NULL。

若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。

若两个参数均为整数,则按照整数进行比较。

十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。

假如参数中的一个为
TIMESTAMP 或 DATETIME 列,而其它参数均为常数,
则在进行比较前将常数转为 timestamp。这样做的目的是为了使ODBC的进行更加顺利。
注意,这不适合IN()中的参数!为了更加可靠,在进行对比时通常使用完整的
datetime/date/time字符串。

在其它情况下,参数作为浮点数进行比较。

在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252
Latin1,同时对英语也适合)。

3、高级过滤
a、AND && OR操作符组合WHERE子句
为了进行更好的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以用两种方式使用:以AND子句的方式或者OR子句的方式使用。

mysql> SELECT prod_id, prod_price, prod_name
-> FROM products
-> WHERE vend_id = 1003 AND prod_price <= 10;
使用AND操作符,把两个条件组合起来。还可以添加多个过滤条件,分别用AND或者OR操作符连接起来。
AND 同时满足多个条件

OR 任意满足一个条件即可

计算次序
WHERE子句可以包含任意数目的AND和OR操作符。允许两者结合进行复杂和高级的过滤。
AND的优先级比OR高,NOT的优先级又高于AND。SQL(像多数语言一样)在处理OR操作符之前,优先处理AND操作符。(优先级: NOT > AND > OR)
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确的分组操作符。不要过分依赖默认的计算次序,使用圆括号没有什么坏处,它能消除歧义。

b、IN操作符




IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN 的合法取值是由逗号分隔的清单,全都扩在圆括号中。

mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE vend_id IN (1002, 1003)
-> ORDER BY prod_name;
如果你认为IN操作符完成与OR相同的功能,那么这种猜测是对的,IN 等价于 OR 组合相等测试。它和以下语句等价:
mysql> SELECT prod_name, prod_price
-> FROM products
-> WHERE vend_id = 1002 OR vend_id = 1003
-> ORDER BY prod_name;
c、NOT 操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。NOT IN, NOT BETWEEN, NOT LIKE, NOT REGEXP 。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息