我执行了以下查询,但它确实有效。我想了解它的工作原理。
select 50+2 from employees
仅当'employees'表存在时才有效。如果我提到一个不存在的表,那么它会抛出一个错误。
如何针对用户定义的表评估此类表达式?
答案 0 :(得分:3)
MySQL首先做的是它使用它的解析器来读取SQL语句并将其分成它的逻辑部分。解析器(不仅由MySQL使用,而且经常在编程中使用)只是一块代码块,用于检索原始信息,并将其转换为程序可以使用的内容。
对于MySQL,它将分开
SELECT 50+2 FROM employees
进入SELECT 50+2
和FROM employees
因此,让我们分析这两者的作用。 SELECT
保留字用于标识用户希望从操作中获得的内容。它通常包含列名。但是,如果您包含名为" hello "的字符串,则MySQL会解释您要选择" hello "。在这种情况下,您要选择一个50+2
结果的数字。
现在FROM employees
的作用是告诉MySQL您希望从哪个表中选择此信息。 50+2
不是列,甚至不是表中的任何内容,这并不重要。 MySQL不是一个人工智能系统,并且不会问你为什么决定这样做的问题,它只是执行按照既定规则设计的命令。
现在,MySQL将查看整个表,并返回每行的选定列,这些列与查询的WHERE ...
部分中存在的条件一致。如果查询没有WHERE ...
部分,则假定您要返回所有行。
您的查询结果将是一个满值52
的列,其行数与您的表格相同。如果您的表有5行,结果将是:
52
52
52
52
52
答案 1 :(得分:1)
如果您想表达,请使用SELECT .. Dual
select 50+2 from dual
这也会导致52
为什么select 50+2 from employees
因为它只是一个常量值,将显示在表的所有行中,例如,下面的查询也将为所有行生成常量值“A”
Select 'A',col1,col2 from yourtable
答案 2 :(得分:0)
如果您不想引用任何现有表,并且仍想计算表达式(请注意单个表达式),则可以在oracle中使用DUAL表。
select 50+2 from dual;
select 1*2*3 from dual;
来自oracle doc,
名为DUAL的表是数据字典中的一个小表,Oracle数据库和用户编写的程序可以引用该表来保证已知结果。该表有一列名为DUMMY,一行包含值X。