《sql必知必会》------day2

第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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值