MySQL中符号@的作用

目录
  • mysql的@用法
  • 实战

select @a;

变量名,如果你不加的话,会认为这是一个列名,但是这列不存在,就报错了;

  • @变量名 : 定义一个用户变量.
  • = 对该用户变量进行赋值.

用户变量赋值有两种方式: 一种是直接用"=“号,另一种是用”:=“号。

其区别在于:

  • 使用set命令对用户变量进行赋值时,两种方式都可以使用;
  • 用select语句时,只能用”:=“方式,因为select语句中,”="号被看作是比较操作符。

(@i:=@i+1)

可以在生成查询结果表的时候生成一组递增的序列号

select (@i:=@i+5) as rownum, surname, personal_name from student, (select @i:=100) as init;

select @ids := 101,@l := 0

GROUP_CONCAT + group by

按照分组,连接字段上的数据,默认以,,也可以指定分割符

mysql的@用法

1,增加临时表,实现变量的自增

SELECT (@i:=@i+1),t.* FROM table_name t,(SELECT @i:=0) AS j

(@i:=@i+1)代表定义一个变量,每次叠加1;
(SELECT @i:=0) AS j 代表建立一个临时表,j是随便取的表名,但别名一定要的。

2,实现排序递增

SELECT
	( @i := @i + 1 ),
	p.*
FROM
	( SELECT * FROM sys_region ORDER BY create_time DESC ) p, ( SELECT @i := 0 ) k

3,实现分组递增

SELECT
	@r := CASE WHEN @type = a.LEVEL THEN
			@r + 1
		ELSE
			1
		END AS rowNum,
	@type := a.`level` AS type,
	a.id
FROM
	sys_region a,( SELECT @r := 0, @type := '' ) b;

这里用了临时变量@type,因为对临时变量操作的时候,被使用的变量都是临时变量。

实战

INSERT INTO t_top ( col_account, col_date, p_account, p_name )

SELECT b.col_account, b.col_date, b.p_account, b.p_name FROM
(
	SELECT
		@num := CASE WHEN @account = a.col_account THEN
				@num + 1
			ELSE
				1
			END AS rownum,
		@account := a.col_account AS account,
		a.*
	FROM
		( SELECT * FROM zb_top  ORDER BY col_account, p_avg DESC ) a,
	( SELECT @num := 0, @account := '' ) j
) b where 6 > b.rownum

计算用户距上次访问的天数,根据imei号区分不同的用户,如果时间段内只有一次访问则为0。

初始化数据:
代码示例:

CREATE TABLE `pd` (
	`imei` varchar(32) NOT NULL DEFAULT '',
	`date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `pd` VALUES ('1', '2013-07-25 00:00:01');
INSERT INTO `pd` VALUES ('1', '2013-07-26 00:00:02');
INSERT INTO `pd` VALUES ('2', '2013-07-23 00:00:04');
INSERT INTO `pd` VALUES ('2', '2013-07-26 00:00:03');
INSERT INTO `pd` VALUES ('3', '2013-07-26 00:00:01');

脚本,使用@特殊变量:
代码示例:

SELECT * FROM
(
	SELECT
		imei user_id,
		max(max_dd),
		max(max_dd_2),
		to_days(max(max_dd)) - to_days(max(max_dd_2)) days
	FROM
		(
			SELECT
				imei,
				max_dd,
				max_dd_2
			FROM
				(
					SELECT
						tmp.imei,
						tmp.date,
						IF(@imei = tmp.imei, @rank := @rank + 1, @rank := 1) AS ranks,
						IF(@rank = 1, @max_d := tmp.date, @max_d := NULL) AS max_dd,
						IF(@rank = 2, @max_d_2 := tmp.date, @max_d_2 := NULL) AS max_dd_2,
						@imei := tmp.imei
					FROM
						(SELECT imei, date FROM pd ORDER BY imei ASC, date DESC) tmp,
						(SELECT @rownum := 0, @imei := NULL, @rank := 0, @max_d := NULL, @max_d_2 := NULL) a
				) result
		) t
	GROUP BY
		imei
	HAVING
		count(*) > 1
) x WHERE x.days >= 1 AND EXISTS (SELECT 'x' FROM pd WHERE date > '2013-07-26 00:00:00')

注意:
表数据量较大时,使用union all等操作将会有悲剧性的结果。

到此这篇关于MySQL中符号@的作用的文章就介绍到这了,更多相关MySQL 符号@内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql中@和@@符号的详细使用指南

    目录 一.概述 二.使用语法及实践 用户自定义变量 补充:MySQL的@与@@区别 总结 一.概述 @是用户变量,@@是系统变量. select @a; 变量名,如果你不加的话,会认为这是一个列名,但是这列不存在,就报错了: @变量名 : 定义一个用户变量. = 对该用户变量进行赋值. 用户变量赋值有两种方式: 一种是直接用"=“号,另一种是用”:=“号. 其区别在于: 使用set命令对用户变量进行赋值时,两种方式都可以使用: 用select语句时,只能用”:=“方式,因为select语句中,”

  • MySQL中符号@的作用

    目录 mysql的@用法 实战 select @a; 变量名,如果你不加的话,会认为这是一个列名,但是这列不存在,就报错了: @变量名 : 定义一个用户变量. = 对该用户变量进行赋值. 用户变量赋值有两种方式: 一种是直接用"=“号,另一种是用”:=“号. 其区别在于: 使用set命令对用户变量进行赋值时,两种方式都可以使用: 用select语句时,只能用”:=“方式,因为select语句中,”="号被看作是比较操作符. (@i:=@i+1) 可以在生成查询结果表的时候生成一组递增的

  • C# 中 “$” 符号的作用以及用法详解

    前言:$是c# 6.0 的语言特性,功能类似string.format(),更方便的地方在于不要像format一样使用索引,可以直接使用变量.表达式或者方法的执行. 一.C#中$的作用 谈及这个$,其实它是C#6.0语法中模板字符串的一种写法,什么是模版字符串?还记得你们用过的格式化字符串吗?string.Format() 这个方法,是最常用的方法之一. 那$又是什么呢?它是为了替代string.format()的,原先赋值需要占位符和变量,当需要拼接多个变量会造成语句过长等不易理解问题. $是

  • 详解 Mysql中的delimiter定义及作用

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程.触发器.函数等. 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解. 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了. 默认情况下,delimiter是分号(;) . 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令.如输入下面的语句 mysql> select * from test_table;

  • Mysql中explain作用详解

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构. 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句). 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这样就可以在这些数据结构上实现高级查找算法.这些数据结构就是索引. 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上. 我们

  • shell脚本中常见的一些特殊符号和作用详解

    在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到 userA-home, userA-bin, userA-data, userB-home, user

  • 详解mysql中的静态变量的作用

    详解mysql中的静态变量的作用 使用静态变量 static variable 示例代码: function Test() { $a = 0; echo $a; $a++; } 本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0".将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了 示例代码: function Test(){ static $a = 0; echo $a; $a++; } 每次调用 Test() 函数都会输出 $a 的值

  • 详细聊聊MySQL中auto_increment有什么作用

    目录 问题来源 解释 注意事项 总结 问题来源 很多时候,MySQL语句中会出现[auto_increment]这个词汇,大多数时候,表都是自动生成的,刚开始学习MySQL数据库时会学习到,后来,渐渐地可能会忘记,那么这个语句的作用到底是什么意思?下面,来汇总一下: 解释 auto_increment是用于主键自动增长的,从1开始增长,当你把第一条记录删除时,再插入第二条数据时,主键值是2,不是1. 例如: create table test ( id int(10) not null auto

  • MySQL中字段类型char、varchar和text的区别

    在MySQL中,char.varchar和text类型的字段都可以用来存储字符类型的数据,char.varchar都可以指定最大的字符长度,但text不可以. 它们的存储方式和数据的检索方式也都不一样. 数据的检索效率是:char > varchar > text 具体说明: char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时

  • MySQL中索引失效的常见场景与规避方法

    前言 之前有看过许多类似的文章内容,提到过一些sql语句的使用不当会导致MySQL的索引失效.还有一些MySQL"军规"或者规范写明了某些sql不能这么写,否则索引失效. 绝大部分的内容笔者是认可的,不过部分举例中笔者认为用词太绝对了,并没有说明其中的原由,很多人不知道为什么.所以笔者绝对再整理一遍MySQL中索引失效的常见场景,并分析其中的原由供大家参考. 当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时

随机推荐