谓词和CASE

谓词(LIKE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS)及 CASE

假如我们有一张表,表名为 predicate_table,如下所示:

+---------------+---------------+-------------+-------------+
| number_column | string_column | date_column | bool_column |
+---------------+---------------+-------------+-------------+
|            10 | Apple         | 2024-06-10  |           1 |
|            20 | Banana        | 2024-06-11  |           0 |
|            15 | Orange        | 2024-06-12  |           1 |
+---------------+---------------+-------------+-------------+

谓词

在SQL中,谓词是返回值为真值(TRUE、FALSE或UNKNOWN)的表达式。谓词通常由比较运算符、逻辑运算符和特殊的值(如NULL)组成,它们可以用于筛选、限制或者连接数据表中的数据SQL中的常见谓词主要有LIKE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS等

  • LIKE:使用通配符检查字符串是否匹配模式。

    SELECT * 
    FROM predicate_table 
    WHERE string_column LIKE 'Ap%';
    
    +---------------+---------------+-------------+-------------+
    | number_column | string_column | date_column | bool_column |
    +---------------+---------------+-------------+-------------+
    |            10 | Apple         | 2024-06-10  |           1 |
    +---------------+---------------+-------------+-------------+
    1 row in set (0.00 sec)
    
  • BETWEEN:检查值是否在指定范围内。

    SELECT * 
    FROM predicate_table 
    WHERE date_column BETWEEN '2024-06-10' AND '2024-06-11';
    
    +---------------+---------------+-------------+-------------+
    | number_column | string_column | date_column | bool_column |
    +---------------+---------------+-------------+-------------+
    |            10 | Apple         | 2024-06-10  |           1 |
    |            20 | Banana        | 2024-06-11  |           0 |
    +---------------+---------------+-------------+-------------+
    2 rows in set (0.00 sec)
    
  • IS NULL / IS NOT NULL:检查值是否为空或非空。

    SELECT * 
    FROM predicate_table 
    WHERE string_column IS NULL;
    
    Empty set (0.00 sec) --这是因为我们的数据表中不存在空值,所以查询的结果为空
    
    SELECT * 
    FROM predicate_table 
    WHERE string_column IS NOT NULL;
    
    +---------------+---------------+-------------+-------------+
    | number_column | string_column | date_column | bool_column |
    +---------------+---------------+-------------+-------------+
    |            10 | Apple         | 2024-06-10  |           1 |
    |            20 | Banana        | 2024-06-11  |           0 |
    |            15 | Orange        | 2024-06-12  |           1 |
    +---------------+---------------+-------------+-------------+
    3 rows in set (0.00 sec)
    

    "上面"和"下面"的查询结果之间的差异,主要是由WHERE子句中的NOT关键字引起的。换句话说,NOT关键字的存在或不存在,导致了查询结果的不同。

  • IN:检查值是否在给定的列表中。

    SELECT * 
    FROM predicate_table 
    WHERE number_column IN (10, 15);
    
    +---------------+---------------+-------------+-------------+
    | number_column | string_column | date_column | bool_column |
    +---------------+---------------+-------------+-------------+
    |            10 | Apple         | 2024-06-10  |           1 |
    |            15 | Orange        | 2024-06-12  |           1 |
    +---------------+---------------+-------------+-------------+
    2 rows in set (0.00 sec)
    
  • EXISTS 子查询

    SELECT *
    FROM predicate_table p
    WHERE EXISTS (
        SELECT *
        FROM predicate_table
        WHERE  number_column < 11
    );
    
    +---------------+---------------+-------------+-------------+
    | number_column | string_column | date_column | bool_column |
    +---------------+---------------+-------------+-------------+
    |            10 | Apple         | 2024-06-10  |           1 |
    |            20 | Banana        | 2024-06-11  |           0 |
    |            15 | Orange        | 2024-06-12  |           1 |
    +---------------+---------------+-------------+-------------+
    3 rows in set (0.00 sec)
    

    子查询会检查是否存在满足条件 date_column < '2024-06-11' 的行。如果存在,EXISTS 返回 TRUE,子查询会返回相应的行;否则,返回空结果集。

    很难明白?不用着急。实际上即使不使用 EXISTS ,基本上也都可以用 IN 或者 NOT IN 代替。

CASE 表达式(很常用且简单)

当涉及到 SQL 查询时,“CASE”是一种非常有用的表达式,允许在查询中执行条件逻辑。它允许根据条件的真假来返回不同的值。CASE 表达式通常与 SELECT 语句一起使用,但也可以在 WHERE、ORDER BY 和 GROUP BY 子句中使用。其语法为:

CASE
    WHEN 求值表达式1 THEN 表达式1
    WHEN 求值表达式2 THEN 表达式2
    ...
    ELSE 表达式
END

举个例子:

SELECT *,
    CASE
        WHEN number_column < 15 THEN 'Small'
        WHEN number_column >= 15 AND number_column < 25 THEN 'Medium'
        ELSE 'Large'
    END AS number_category
FROM
    predicate_table;

+---------------+---------------+-------------+-------------+-----------------+
| number_column | string_column | date_column | bool_column | number_category |
+---------------+---------------+-------------+-------------+-----------------+
|            10 | Apple         | 2024-06-10  |           1 | Small           |
|            20 | Banana        | 2024-06-11  |           0 | Medium          |
|            15 | Orange        | 2024-06-12  |           1 | Medium          |
+---------------+---------------+-------------+-------------+-----------------+
3 rows in set (0.00 sec)

ELSE 可以省略,但是不建议。

END 一定不能省略!!!

这个查询的结果虽然比原表多了一列,但是不影响原表,而且这一列只在这个查询语句中存在。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值