过滤数据
如何筛选数据? 如何使用SELECT语句的WHERE子句指定搜索条件
常见的基本查询语句:
SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能是相当强大的。SELECT语句的基本语法如下: select selection_list //要查询的内容,选择哪些列
from 数据表名 //指定数据表
where //查询时需要满足的条件,行必须满足的条件
group by grouping_columns //如何对结果进行分组
order by sorting_cloumns //如何对结果进行排序
having secondary_constraint //查询时满足的第二条件
limit count //限定输出的查询结果
使用WHERE子句: 数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出,如下所示:
SELECT 字段名 FROM 表名 WHERE 条件;
为什么要进行数据的筛选,数据筛选的必要性? SQL过滤与应用过滤 数据也可以在应用层过滤。为了这个目 的,SQL的SELECT语句检索出超过实际所需的数据,然后客户 机代码对返回数据进行循环,以提取出需要的行。 通常,这种实现并不令人满意。因此,对数据库进行了优化, 以便快速有效地对数据进行过滤。因为我们在客户机应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建 的应用完全不具备可伸缩性。此外,如果在客户机上过滤数据, 服务器不得不通过网络发送多余的数据,这将导致网络带宽的 浪费。
DeepinScrot-5748这个例子采用了简单的相等测试j仅仅是对单个值进行过滤:它检查一个列是否具有指定的值,据此进行过滤。但是SQL允许做的事情不仅仅是相等测试。
= 等于
select name from customers where name='李逵';
<> 不等于
select name from customers where name<>'李逵';
!= 不等于
select name from customers where name!='李逵';
< 小于 (一般情况下后面会跟数字)
select name from customers where name<'李逵';
select * from customers where userid<10014;
<= 小于等于
select * from customers where userid<=10014;
> 大于
select * from customers where userid>10014;
>= 大于等于
select * from customers where userid>=10014;
BETWEEN .. AND ..在指定的两个值之间
select name from customers where userid between 10010 and 10014; 注意:在使用BETWEEN时,必须指定两个值,所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值.
空值检查(IS NULL)
在创建表时,表设计人员可以指定其中的列是否可以不包含值。在 一个列不包含值时,称其为包含空值NULL。 NULL 无值(no value),它与字段包含0、空字符串或仅仅包含 空格不同。
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。其语法如下:
SELECT 列 FROM students WHERE 列 IS NULL;
DeepinScrot-3908组合WHERE子句
AND操作符
为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。下面的代码给出了一个例子: SELECT 列,列 FROM students WHERE 条件1 and 条件2;
DeepinScrot-4603SELECT name,adress FROM customers WHERE userid<=10015 AND adress='北京市'
OR操作符
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
SELECT 列,列 FROM students WHERE 条件1 OR 条件2;
DeepinScrot-5201注意:计算次序 WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂 和高级的过滤。 例如:SELECT name,age,weight FROM students WHERE height = 170 or height = 180 and age < 19 ; 当SQL看到上述WHERE子句时,它理解为由身高180的任何 年龄小于19的同学,或者身高等于170的任何同学,实际的情况是这样的。换句话说,由于AND在计算次序中优先级更高,操作符被错误地组合了。
那如何才能够按照真实的sql语义来筛选呢? 此问题的解决方法是使用圆括号明确地分组相应的操作符。请看下 面的SELECT语句及输出: SELECT name,age,weight FROM students WHERE (height = 170 or height = 180) and age < 19 ;
这条SELECT语句与前一条的唯一差别是,这条语句中,前两个 条件用圆括号括了起来。因为圆括号具有较AND或OR操作符高 的计算次序,DBMS首先过滤圆括号内的OR条件,然后在结合后面条件进行筛选.
总结: 在WHERE子句中使用圆括号 任何时候使用具有AND和OR操作 符的WHERE子句,都应该使用圆括号明确地分组操作符。不要 过分依赖默认计算次序,即使它确实是你想要的东西也是如 此。使用圆括号没有什么坏处,它能消除歧义。
IN操作符
圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。下面的例子说明了这个操作符 格式如下: SELECT 列 FROM 表名 WHERE 列 IN(列值,列值);
DeepinScrot-2122SELECT name FROM customers WHERE userid IN(10011,10013);
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
DeepinScrot-2322SELECT name FROM customers WHERE userid NOT IN(10011,10013);
解释一下这条sql语句的含义
SELECT * FROM customers WHERE NOT age=20;
网友评论