Skip to content

sql-expressions

SQL 表达式是一个或多个值、运算符和 SQL 函数的组合,它会解析为一个值。表达式是查询的构建块,用于 SELECT 列表、WHERE 子句、GROUP BY 子句等。

将表达式视为一个公式。它可以像常量值(100)或列名(salary)一样简单,也可以像函数、计算和子查询的组合一样复杂。它们通常用于 WHERE 子句来过滤数据。

SELECT column1, column2, ...
FROM table_name
WHERE [EXPRESSION]; -- 一个求值为 TRUE、FALSE 或 UNKNOWN 的条件

布尔表达式求值为一个真值:TRUE、FALSE 或 UNKNOWN(如果涉及 NULL)。它们通常使用比较运算符(=, >, <, <>)和逻辑运算符(AND, OR, NOT)来形成条件。

考虑 CUSTOMERS 表:

IDNAMEAGEADDRESSSALARY
1Ramesh32Ahmedabad2000.00
2Khilan25Delhi1500.00
3kaushik23Kota2000.00
4Chaitali25Mumbai6500.00

以下查询使用布尔表达式来查找年龄为 25 岁且薪水大于 2000 的客户:

SELECT * FROM CUSTOMERS
WHERE AGE = 25 AND SALARY > 2000;
IDNAMEAGEADDRESSSALARY
4Chaitali25Mumbai6500.00

数值表达式使用算术运算符(+、-、*、/、%)执行数学计算。它们可以用于数值字面量或列。

这里,一个数值表达式计算每个客户 10% 的奖金,并为结果列指定别名 BONUS。

SELECT NAME, SALARY, SALARY * 0.10 AS BONUS
FROM CUSTOMERS;
NAMESALARYBONUS
Ramesh2000.00200.00
Khilan1500.00150.00
kaushik2000.00200.00
Chaitali6500.00650.00

这些表达式对日期和时间数据类型进行操作。它们用于检索当前时间、操作日期或根据时间段过滤记录。

大多数数据库都提供函数来获取当前时间戳(CURRENT_TIMESTAMP、NOW())和提取日期的部分(EXTRACT、DATE_PART)。

-- 获取当前系统时间戳(语法可能略有不同)
SELECT CURRENT_TIMESTAMP;
-- PostgreSQL 或标准 SQL 示例:从订单日期中提取年份
SELECT OID, EXTRACT(YEAR FROM ORDER_DATE) AS OrderYear
FROM ORDERS
WHERE ORDER_DATE < DATE '2023-11-01';

请注意 DATE '2023-11-01' 的使用。这是日期字面量的标准 SQL 语法,比使用像 '2023-11-01' 这样的纯字符串(它依赖于隐式类型转换)更好。

字符串表达式用于操作字符数据。常见操作包括字符串连接和使用 UPPER、LOWER、SUBSTRING 和 TRIM 等函数。

以下查询通过连接名字和姓氏创建全名,并将地址转换为大写。在标准 SQL 和 PostgreSQL 中,连接运算符是 ||,而在 SQL Server 中是 +。

-- 标准 SQL / PostgreSQL
SELECT
NAME || ' from ' || ADDRESS AS FullDescription,
UPPER(ADDRESS) AS UppercaseAddress
FROM CUSTOMERS;

CASE 表达式是一个强大的工具,用于在 SQL 查询中实现 if-then-else 逻辑。它允许你根据一组条件返回不同的值。

此查询使用 CASE 表达式将客户分类到不同的薪资区间。

SELECT NAME, SALARY,
CASE
WHEN SALARY < 2000 THEN 'Low'
WHEN SALARY >= 2000 AND SALARY < 5000 THEN 'Medium'
WHEN SALARY >= 5000 THEN 'High'
ELSE 'Uncategorized'
END AS SalaryBracket
FROM CUSTOMERS;
NAMESALARYSalaryBracket
Ramesh2000.00Medium
Khilan1500.00Low
kaushik2000.00Medium
Chaitali6500.00High