经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL中符号@的作用
来源:jb51  时间:2022/6/27 12:53:31  对本文有异议

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,增加临时表,实现变量的自增

  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,实现排序递增

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

在这里插入图片描述

3,实现分组递增

  1. SELECT
  2. @r := CASE WHEN @type = a.LEVEL THEN
  3. @r + 1
  4. ELSE
  5. 1
  6. END AS rowNum,
  7. @type := a.`level` AS type,
  8. a.id
  9. FROM
  10. sys_region a,( SELECT @r := 0, @type := '' ) b;

在这里插入图片描述

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

实战

  1. INSERT INTO t_top ( col_account, col_date, p_account, p_name )
  2.  
  3. SELECT b.col_account, b.col_date, b.p_account, b.p_name FROM
  4. (
  5. SELECT
  6. @num := CASE WHEN @account = a.col_account THEN
  7. @num + 1
  8. ELSE
  9. 1
  10. END AS rownum,
  11. @account := a.col_account AS account,
  12. a.*
  13. FROM
  14. ( SELECT * FROM zb_top ORDER BY col_account, p_avg DESC ) a,
  15. ( SELECT @num := 0, @account := '' ) j
  16. ) b where 6 > b.rownum

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

初始化数据:
代码示例:

  1. CREATE TABLE `pd` (
  2. `imei` varchar(32) NOT NULL DEFAULT '',
  3. `date` datetime DEFAULT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  5.  
  6. INSERT INTO `pd` VALUES ('1', '2013-07-25 00:00:01');
  7. INSERT INTO `pd` VALUES ('1', '2013-07-26 00:00:02');
  8. INSERT INTO `pd` VALUES ('2', '2013-07-23 00:00:04');
  9. INSERT INTO `pd` VALUES ('2', '2013-07-26 00:00:03');
  10. INSERT INTO `pd` VALUES ('3', '2013-07-26 00:00:01');

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

  1. SELECT * FROM
  2. (
  3. SELECT
  4. imei user_id,
  5. max(max_dd),
  6. max(max_dd_2),
  7. to_days(max(max_dd)) - to_days(max(max_dd_2)) days
  8. FROM
  9. (
  10. SELECT
  11. imei,
  12. max_dd,
  13. max_dd_2
  14. FROM
  15. (
  16. SELECT
  17. tmp.imei,
  18. tmp.date,
  19. IF(@imei = tmp.imei, @rank := @rank + 1, @rank := 1) AS ranks,
  20. IF(@rank = 1, @max_d := tmp.date, @max_d := NULL) AS max_dd,
  21. IF(@rank = 2, @max_d_2 := tmp.date, @max_d_2 := NULL) AS max_dd_2,
  22. @imei := tmp.imei
  23. FROM
  24. (SELECT imei, date FROM pd ORDER BY imei ASC, date DESC) tmp,
  25. (SELECT @rownum := 0, @imei := NULL, @rank := 0, @max_d := NULL, @max_d_2 := NULL) a
  26. ) result
  27. ) t
  28. GROUP BY
  29. imei
  30. HAVING
  31. count(*) > 1
  32. ) x WHERE x.days >= 1 AND EXISTS (SELECT 'x' FROM pd WHERE date > '2013-07-26 00:00:00')

在这里插入图片描述

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号