欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 谓词和CASE

谓词和CASE

2024/10/25 2:23:12 来源:https://blog.csdn.net/qq_55909023/article/details/139813262  浏览:    关键词:谓词和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_tableWHERE  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 子句中使用。其语法为:

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

举个例子:

SELECT *,CASEWHEN number_column < 15 THEN 'Small'WHEN number_column >= 15 AND number_column < 25 THEN 'Medium'ELSE 'Large'END AS number_category
FROMpredicate_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 一定不能省略!!!

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com