我对涉及 MySQL 中的变量声明的查询相当陌生。我见过各种样式,但我并不完全清楚它们的实际作用。我对它们的实际作用有疑问。
1)
set @row:=0;
SELECT name, @row:=@row + 1 AS rownum
FROM animal
2)
SELECT name, @row:=@row + 1 AS rownum
FROM (SELECT @row:= 0) c, animal
两者返回相同:
name rownum
|| cat || 1 ||
|| cat || 2 ||
|| dog || 3 ||
|| dog || 4 ||
|| dog || 5 ||
|| ant || 6 ||
以上两种查询有何不同,在范围、效率、编码习惯、用例等方面采用哪一种?
3) 现在如果我这样做:
set @row:=0;
SELECT name, @row:=@row + 1 AS rownum
FROM (SELECT @row:= 123) c, animal
我明白了
name rownum
|| cat || 124 ||
|| cat || 125 ||
|| dog || 126 ||
|| dog || 127 ||
|| dog || 128 ||
|| ant || 129 ||
那么这是否意味着内部变量初始化覆盖了外部初始化并因此使后者变得多余(因此在
4) 如果我只是这样做: 我明白了 我可以理解,因为 然后在重新运行时它产生 5) 如果我有这样的查询: 这总是会产生正确的结果: 那么这是否意味着它并不总是需要根据查询在顶部或 SELECT 中初始化始终是更好的做法?SELECT name, @row:=@row + 1 AS rownum
FROM animal
name rownum
|| cat || NULL ||
|| cat || NULL ||
|| dog || NULL ||
|| dog || NULL ||
|| dog || NULL ||
|| ant || NULL ||
row 没有初始化。但是,如果我运行任何其他查询(可能是变量 row 正在初始化?),我会看到每次运行上述查询时 row 变量都会递增。那就是它给了我第一次运行的结果: name rownum
|| cat || 1 ||
|| cat || 2 ||
|| dog || 3 ||
|| dog || 4 ||
|| dog || 5 ||
|| ant || 6 ||
name rownum
|| cat || 7 ||
|| cat || 8 ||
|| dog || 9 ||
|| dog || 10 ||
|| dog || 11 ||
|| ant || 12 ||
row 是否存储在某处?它的范围和生命周期是多少?SELECT (CASE WHEN @name <> name THEN @row:=1 ELSE @row:=@row + 1 END) AS rownum,
@name:=name AS name
FROM animal
rownum name
|| 1 || cat ||
|| 2 || cat ||
|| 1 || dog ||
|| 2 || dog ||
|| 3 || dog ||
|| 1 || ant ||
SELECT 中初始化变量?
最佳答案
请务必阅读 manual section on user variables .
What are the differences in the above two queries and which of the two to adopt as to their scope, efficiency, coding habit, use-cases?
查询 1) 使用多个语句。因此,它可以依赖于这些语句的执行顺序,确保变量在递增之前设置。
另一方面,查询 2) 在嵌套子查询中进行初始化。这会将整个事情变成一个查询。您不会冒险忘记初始化。但是代码更多地依赖于 mysql 服务器的内部工作,特别是它会在开始为外部查询计算结果之前执行子查询。
So doesn't that mean that the inner variable initialization is overriding the outer initialization and leaving the latter redundant hence (and hence its always a better practice to initialize in a
SELECT?
这不是关于内在和外在的,而是关于顺序的:子查询在SET之后执行。 , 所以它会简单地覆盖旧值。
So is row being stored somewhere? And what is its scope and lifespan?
用户变量是服务器连接的本地变量。因此任何其他进程都不会受到该设置的影响。即使是同一个进程也可能维护多个连接,用户变量的设置是独立的。连接关闭后,所有变量设置都会丢失。
So doesn't that mean its not always necessary to initialize variable at the top or in a SELECT depending on the query?
引自the manual :
If you refer to a variable that has not been initialized, it has a value of
NULLand a type of string.
因此您可以在变量初始化之前使用它,但您必须小心,您实际上可以处理结果NULL。以合理的方式估价。但是请注意,您的查询 5) 遇到手册中明确指出的另一个问题:
As a general rule, you should never assign a value to a user variable and read the value within the same statement. You might get the results you expect, but this is not guaranteed. The order of evaluation for expressions involving user variables is undefined and may change based on the elements contained within a given statement; in addition, this order is not guaranteed to be the same between releases of the MySQL Server. In
SELECT @a, @a:=@a+1, ..., you might think that MySQL will evaluate@afirst and then do an assignment second. However, changing the statement (for example, by adding aGROUP BY,HAVING, orORDER BYclause) may cause MySQL to select an execution plan with a different order of evaluation.
所以在你的例子中,@name:=name部分可以在 @name <> name 之前执行检查,导致你所有的rownum值相同。因此,即使它现在有效,也不能保证它在未来会有效。
请注意,我一直对以这种方式使用用户变量持怀疑态度。我已经在对几个答案的评论中引用了手册中的上述警告。我也问过关于 Guarantees when using user variables to number rows 的问题.其他用户更务实,因此更愿意使用看起来可以正常工作的代码,而无需明确保证事情将继续按预期工作。
关于mysql - MySQL中以下变量初始化风格有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226745/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串