当前位置: 首页 > news >正文

Mysql中使用select into语句给变量赋值没有匹配记录时的结果

前言

select into语句感兴趣是因为看了项目中的一个存储过程引起的,在程序运行之前看了存储过程的逻辑,本以为没有数据时会报错,结果程序却正常运行,这说明我对select into语句理解的问题,同时也暴露了一个知识盲点,所以写了个小例子测试一下,并把测试的过程记录方便日后查找。

创建测试表格

为了更清楚的表明问题,我们创建的表格尽可能的简单,同时为了测试空值的情况,数据列我们不设置默认值,表格命名为’intotest’,创建语句如下:

CREATE TABLE `intotest` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `number` int(4),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=binary ROW_FORMAT=DYNAMIC;

插入测试数据

表格建立完成可以使用可视化工具或者insert语句插入测试数据,插入测试数据后查询结果如下:

mysql> select * from intotest;
+----+--------+
| id | number |
+----+--------+
|  1 |      1 |
|  2 |      2 |
|  3 |   NULL |
+----+--------+
3 rows in set (0.00 sec)

建立一个存储过程

我们建立一个用于测试的存储过程,主要的逻辑就是看看当select into语句找不到匹配记录时,被赋值的变量会怎么样,建立存储过程的代码如下:

CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=1 INTO _value;
    SELECT _value;
END

这个存储过程运行正常,配合刚才我们插入表格的记录可以知道,运行后的结果为1:

mysql> call select_into_value();
+--------+
| _value |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

测试过程

  1. 当查询结果中不存在符合条件的记录时会怎样,修改存储过程定义,然后查看运行结果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=5 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

结果为0,也就是说当查不到匹配结果时,不会执行select into的赋值效果。

  1. 当匹配到查询结果但是查询出来的数值为null会怎样,修改存储过程定义,然后查看运行结果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=3 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|   NULL |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

结果为NULL,也就是说当查到匹配结果时,不管结果时什么都会赋值到指定的变量中(类型不匹配的sql错误除外)。

  1. 当连续查询赋值中间出现不匹配会怎样,修改存储过程定义,然后查看运行结果:
CREATE PROCEDURE `select_into_value2`()
BEGIN
    DECLARE _value INT DEFAULT 0;

    SELECT number FROM intotest WHERE id=2 INTO _value;
    SELECT number FROM intotest WHERE id=5 INTO _value;
    SELECT _value;
END
mysql> call select_into_value();
+--------+
| _value |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

想必明白了前两种情况,这第三种也应该明白了,两条语句顺序执行,找到匹配的就赋值,找不到就放弃操作,结果就保留了上一次成功赋值的结果。

总结

  1. 关于select into语句赋值的规则就一句话,找到了符合条件的记录就赋值,找不到就算了。
  2. 在找到记录的前提下,如果类型不匹配会导致赋值失败并报错,比如查询到字符串赋值给整型变量。

相关文章:

  • 排序算法系列之(四)——抓扑克牌风格的插入排序
  • linux环境下服务器程序的查看与gdb调试
  • linux环境下运行程序常用的nohup和的区别
  • 排序算法系列之(五)——为目标打好基础的希尔排序
  • linux环境下查找包含指定内容的文件及其所在行数
  • Mysql查询可通过给条件字段添加索引提高查询速度
  • Mysql开启、查看慢查询日志
  • IP地址常见分类:A类、B类、C类、D类、E类
  • Mysql表连接:内连接、外连接、交叉连接、自然连接真的都不一样吗
  • C/C++版本更迭历程
  • gcc编译生成可执行文件的过程中发生了什么
  • Mysql中explain命令简析
  • Python利用requests模块实现代理访问网络
  • linux环境下查看C/C++程序的堆栈信息
  • Mysql调优之Using filesort一般情况
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CSS 专业技巧
  • HTTP中GET与POST的区别 99%的错误认识
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python学习笔记-类对象的信息
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vim Clutch | 面向脚踏板编程……
  • vue-loader 源码解析系列之 selector
  • vue自定义指令实现v-tap插件
  • webpack4 一点通
  • yii2权限控制rbac之rule详细讲解
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • kubernetes资源对象--ingress
  • ​插件化DPI在商用WIFI中的价值
  • #1015 : KMP算法
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (十八)三元表达式和列表解析
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一) springboot详细介绍
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)大型网站的系统架构
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *p++,*(p++),*++p,(*p)++区别?
  • .Net 4.0并行库实用性演练
  • .net 托管代码与非托管代码
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @Autowired @Resource @Qualifier的区别
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [BZOJ] 3262: 陌上花开
  • [C#] 如何调用Python脚本程序
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [codevs1288] 埃及分数
  • [HNOI2006]鬼谷子的钱袋
  • [NSSRound#16 Basic]RCE但是没有完全RCE
  • [orleans2.1]这是你没玩过的船新版本
  • [python] os.path说明