- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我对涉及 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 ||
那么这是否意味着内部变量初始化覆盖了外部初始化并因此使后者变得多余(因此在 SELECT
中初始化始终是更好的做法?
4) 如果我只是这样做:
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
是否存储在某处?它的范围和生命周期是多少?
5) 如果我有这样的查询:
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
NULL
and 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@a
first and then do an assignment second. However, changing the statement (for example, by adding aGROUP BY
,HAVING
, orORDER BY
clause) 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/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!