我对涉及 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 ||
那么这是否意味着内部变量初始化会覆盖外部初始化并因此使后者变得多余(因此在 a 中进行初始化总是更好的做法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
根据查询初始化变量?