当前位置:首页 > 问答 > 正文

树叶云带你简单聊聊OceanBase里那些表达式列表到底是啥意思和怎么用

整理自OceanBase官方文档中关于“表达式”的章节,具体可参考“OceanBase数据库SQL参考”中的表达式部分)

大家好,今天树叶云带大家伙儿轻松唠唠OceanBase数据库里的“表达式列表”,这名字听起来可能有点技术味儿,但说白了,它就是一堆“表达式”凑在一起形成的“小团体”或者“清单”,咱们先别管“列表”,关键得弄明白啥是“表达式”。

表达式是啥?就是个能算出个结果的“式子”

你可以把表达式想象成我们小时候学的数学题。1 + 1,这就是个最简单的表达式,它的结果就是 2,在OceanBase里,表达式也是这个道理,它是由数字、文本、运算符、函数,或者列名等组合起来,最终能计算出一个特定值的东西。

比方说:

  • 100 是一个表达式,结果就是数字100。
  • ‘你好世界’ 是一个表达式,结果就是文本“你好世界”。
  • salary (假设是工资表的列名)也是一个表达式,它的结果就是当前这行数据里salary列的具体值,比如50000。
  • salary * 1.1 还是一个表达式,它能算出涨薪10%后的工资是多少。
  • UPPER(‘hello’) 也是一个表达式,它用了UPPER这个函数,结果是把小写字母转成大写,变成‘HELLO’。

表达式无处不在,你写的几乎每一句SQL里都包含着各种各样的表达式。

那“表达式列表”又是啥?就是表达式的“组合套餐”

树叶云带你简单聊聊OceanBase里那些表达式列表到底是啥意思和怎么用

理解了单个表达式,“表达式列表”就好办了,它就是把多个表达式用逗号隔开,打包在一起,就像你去快餐店点餐,你不是单点一个汉堡,而是点一个“套餐”:汉堡、薯条、可乐,这个“汉堡、薯条、可乐”就是一个“食物列表”。

在OceanBase里,表达式列表最常见的用武之地就是在 INSERT 语句和 WHERE ... IN (...) 条件里。

场景1:往表里插入数据时(INSERT语句)

当你想往一张表里插入一条新记录时,你需要告诉数据库每个列要填什么值,这时候,表达式列表就派上用场了。

你有一张员工表 employees,有 id, name, salary 三个列,你要插入一条新数据,可以这么写:

树叶云带你简单聊聊OceanBase里那些表达式列表到底是啥意思和怎么用

INSERT INTO employees (id, name, salary)
VALUES (101, '张三', 8000);

看,VALUES 后面跟的那个小括号里的东西 (101, '张三', 8000),就是一个标准的表达式列表!它包含了三个表达式:

  1. 101 (数字表达式)
  2. ‘张三’ (文本表达式)
  3. 8000 (数字表达式)

这个列表里的表达式顺序,必须和前面 INSERT INTO 后面指定的列名顺序一一对应,这样OceanBase就知道,哦,要把101放进id列,把‘张三’放进name列,把8000放进salary列。

你甚至可以插入多条记录,那就是多个表达式列表用逗号隔开:

INSERT INTO employees (id, name, salary)
VALUES (101, '张三', 8000), (102, '李四', 9000);

这里,(101, '张三', 8000)(102, '李四', 9000) 就是两个表达式列表。

场景2:查询时筛选数据(WHERE ... IN 子句)

树叶云带你简单聊聊OceanBase里那些表达式列表到底是啥意思和怎么用

另一个常见用法是当你需要筛选数据的时候,你想找出工资恰好是8000、9000或10000的员工,你当然可以写 salary = 8000 OR salary = 9000 OR salary = 10000,但这样太麻烦了,用 IN 关键字就简洁多了:

SELECT * FROM employees
WHERE salary IN (8000, 9000, 10000);

瞧,IN 后面那个小括号里的 (8000, 9000, 10000),又是一个表达式列表!它明确列出了salary列需要匹配的几个可能的值,OceanBase会检查每一行数据的salary值,看它是否在这个“许可清单”里。

表达式列表里能放些啥?

表达式列表里的成员(也就是各个表达式)可以很灵活,不一定都是简单的数字或文本,只要每个表达式最终能得出一个值,并且这个值的类型是合适的就行。

  • 可以是列名:WHERE (id, name) IN ((101, ‘张三’), (102, ‘李四’)) (这是一个更复杂的多列IN查询,它本身也用了表达式列表)
  • 可以是函数计算的结果:INSERT INTO log (message, create_time) VALUES (‘系统启动’, NOW()),这里 NOW() 是个函数表达式,会算出当前时间。
  • 甚至可以是一个子查询(Subquery)的结果(这个稍微高级点,你先知道有这回事就行)。

总结一下

树叶云带你简单聊了聊,OceanBase里的表达式就是一个能算出一个值的式子,而表达式列表就是多个这样的式子用逗号组合在一起的“值清单”,它最常用的地方就是:

  1. INSERT ... VALUES (...):用来一次性提供要插入的多列数据。
  2. WHERE ... IN (...):用来筛选符合列表中任意一个值的数据。

记住这个核心概念,以后在写SQL时看到小括号里用逗号隔开的一串值,你就知道它大概率就是个“表达式列表”在发挥作用了,希望这个简单的解释能帮你理解OceanBase这个基础又重要的概念!