第4课 过滤数据
通常只会根据特定操作或报告的需要提取表数据的子集,只检索所需数据需要指定搜索条件(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 的行
注意: WHERE 子句的位置
在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于WHERE 之后,否则将会产生错误
注意:< >与!=相同, !<相当于>=
不匹配检查:
SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01';
#列出所有不是供应商 DLL01 制造的产品
#SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01';
#一般来说,!=和<>通常可以互换
如果将值与字符串类型的列进行比较,就需要限定引号。用来与数值列进行比较的值不用引号。!=和<>通常可以互换,但是,并非所有 DBMS 都支持这两种不等于操作符。例如, Microsoft Access 支持<>而不支持!=。
范围值检查:
SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
#检索价格在 5 美元和 10美元之间的所有产品
空值检查:
SELECT prod_name FROM Products WHERE prod_price IS NULL;
#返回所有没有价格(空 prod_price 字段,不是价格为 0)的产品名称
注意: NULL 和非匹配
通过过滤选择不包含指定值的所有行时,你可能希望返回含 NULL 值的行。但是这做不到。因为未知(unknown)有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。过滤数据时,一定要验证被过滤列中含 NULL 的行确实出现在返回的数据中。
第 5 课 高级数据过滤
组合 WHERE 子句:
给出多个 WHERE 子句。这些子句有两种使用方式,即以 AND 子句或 OR 子句的方式使用。
SELECT prod_id, prod_price, prod_name FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
#检索由供应商 DLL01 制造且价格小于等于 4美元的所有产品的名称和价格
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;
#检索由任一个指定供应商制造的所有产品的产品名和价格
SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符:
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10;
#等价于
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR (vend_id = 'BRS01' AND prod_price >= 10);
#由供应商 BRS01 制造的价格为 10美元以上的所有产品,或由供应商 DLL01 制造的所有产品
SELECT prod_name, prod_price FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10;
#价格为 10美元及以上,且由 DLL01或 BRS01制造的所有产品
IN 操作符:
IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 IN 取一组由逗号分隔、括在圆括号中的合法值。
SELECT prod_name, prod_price FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;
#检索由供应商 DLL01 和 BRS01 制造的所有产品
#IN 操作符与 OR 相同的功能
#等价于:
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
IN 的最大优点是可以包含其他 SELECT 语句,能够更动态地建立WHERE 子句。
NOT 操作符:
WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为 NOT 从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。 NOT 关键字可以用在要过滤的列前,而不仅是在其后。
SELECT prod_name FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
#列出除 DLL01 之外的所有供应商制造的产品
第 6 课 用通配符进行过滤
使用 LIKE 操作符进行通配搜索,以便对数据进行复杂过滤。
百分号(%)通配符:
%表示任何字符出现任意次数。
SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE 'Fish%';
#检索任意以Fish 起头的词,%告诉 DBMS 接受 Fish 之后的任意字符,不管它有多少字符.
Access 通配符
使用的是 Microsoft Access,需要使用*而不是%
通配符%不匹配NULL
下划线(_)通配符:
下划线()只匹配单个字符,而不是多个字符。DB2 不支持通配符。Microsoft Access中,需要使用?而不是_
SELECT prod_id, prod_nameFROM Products
WHERE prod_name LIKE '__ inch teddy bear';
#两个下划线
结果:
prod_id prod_name
-------- --------------------
BR02 12 inch teddy bear
BR03 18 inch teddy bear
方括号([ ])通配符:不是所有 DBMS 都支持用来创建集合的[]。只有微软的 Access 和 SQL Server 支持集合。
SELECT cust_contact FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
#找出所有名字以 J 或 M 起头的联系人
用前缀字符^(脱字号)来否定,
SELECT cust_contact FROM Customers
WHERE cust_contact LIKE '[^JM]%'
ORDER BY cust_contact;
#查询匹配以J 和 M 之外的任意字符起头的任意联系人名
#使用的是 Microsoft Access,需要用!而不是^来否定一个集合,因此,使用的是[!JM]而不是[^JM]
《sql必知必会》------day6
《sql必知必会》------day5
《sql必知必会》------day4
《sql必知必会》------day3
《sql必知必会》------day2
《sql必知必会》------day1