数据库之必知必会(二)

数据过滤

4、过滤数据

4.1 使用WHERE子句

数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要制定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。

输入:

SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;

分析:

这条语句从Products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行。

4.2 WHERE子句操作符

操作符

说明

操作符

说明

=

等于

>

大于

<>

不等于

>=

大于等于

!=

不等于

!>

不大于

<

小于

BETWEEN

在指定的两个值之间

<=

小于等于

IS NULL

为NULL值

!<

不小于

 

 

4.2.1  检查单个值

列出所有价格小于10的产品

输入:

SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;

4.2.2 不匹配检查

列出所有不是供应商DLL01制造的产品

输入:

SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01';

SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01';

4.2.3 范围值检查

要检查某个范围的值,可以使用BETWEEN操作符。需要两个值,范围的开始值和结束值。

检索价格在5和10之间的所有产品:

输入:

SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;

在使用BETWEEN时,必须指定两个值,所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。

4.2.4 空值检查

在创建表时,表设计人员可以指定其中的列能否不包含值。在一个列不包含值时,称其包含空值NULL。

NULL 无值,它与字段包含0、空字符串或仅仅包含空格不同。

确定值是否为NULL,不能简单地检查是否=NULL。SELECT子句用来检查具有NULL值的列为IS NULL

输入:

SELECT prod_nameFROM Products WHERE prod_price IS NULL;

这条语句返回所有没有价格(空prod_price字段,不是价格为0)的产品,由于表中没有这样的行,所以没有返回数据。但是,Customers表确实包含具有NULL值的列:如果没有电子邮件地址,则cust_email列将包含NULL值。

SELECT cust_name FROM Customers WHERE cust_email IS NULL;

过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。

5、 高级数据过滤

5.1 组合WHERE子句

为了更强的过滤控制,SQL给出多个WHERE子句,即AND子句或OR子句。

5.1.1 AND操作符

要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。

SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4;

检索出由供应商DLL01制造且价格小于等于4的所有产品的名称和价格。

AND指示DBMS只返回满足所有给定条件的行。

5.1.2 OR操作符

OR操作符与AND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况下,就不再计算第二条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都被检索出来)。

输入:

SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

分析:

OR错左幅告诉DBMS匹配任一条件而不是同时匹配两个条件。

5.1.3 求值顺序

WHERE子句可以包含任意数目的AND和OR操作符。允许两者结合已进行复杂、高级的过滤。

输入:

SELECT prod_name, prod_price

FROM Products

WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'

AND prod_price >= 10;

分析:

SQL在处理OR操作符前,优先处理AND操作符。

当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格为10美元以上的所有产品,以及有供应商DLL01制造的所有产品,而不管其价格如何。

由于AND在求值过程中优先级更高,操作符被错误地组合了。解决方法是使用圆括号对操作符进行明确分组。

输入:

SELECT prod_name, prod_price

FROM Products

WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')

AND prod_price >= 10;

分析:

圆括号具有比AND和OR操作符更高的求值顺序,导致首先过滤圆括号内的OR条件。 

提示:在WHERE子句中使用圆括号

任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。

5.2 IN操作符

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

输入:

SELECT prod_name, prod_price

FROM Products

WHERE vend_id  IN ( 'DLL01' , 'BRS01')

ORDER BY prod_name;

分析:

SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须在圆括号中。完成了与OR相同的功能。

为什么要使用IN操作符?

1)在有很多合法选项时,IN操作符的语法更清楚,更直观。

2)在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。

3)IN操作符比一组OR操作符执行得更快。

4)IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。

          IN

WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

5.3 NOT操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为NOT从不单独使用(它总是与其他操作符一起使用)所以它的语法与其他操作符有所不同。NOT关键字可以用在要过滤的列前,而不仅是在其后。

NOT

WHERE子句中用来否定其后条件的关键字

输入:

SELECT prod_name

FROM Products

WHERE NOT vend_id = 'DLL01'

ORDER BY prod_name;

分析:

NOT否定跟在其后的条件,DBMS是不匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。

你可能感兴趣的:(数据库,数据库,sql)