切换导航
简历
工具
演示
查询
导航菜单
服务端
30
前端
114
数据库
82
进阶开发
8
桌面程序
2
QA
15
软件使用
36
规范协议
5
操作系统
11
AI
0
复用资源
6
硬件
0
标签
SQL Server
Redis
MySQL
其它
Oracle
外部链接
.NET Core SDK和运行时安装包
淘宝 NPM 镜像
查询网
Tables Generator线上表格转换工具
引用cdn在线脚本和样式
首页
数据库
MySQL 数据库的SQL编程语法
[TOC] ## 1. 变量 MySQL变量分为两种,系统变量和自定义变量 ### 1.1 系统变量 系统定义好的变量,系统变量是用来控制服务器别的表现,如:autocommit、auto_incremnet_increment等,常用系统变量点击[查看](/blog/info-md.html/EB096351606D21F9?type=40) #### 1.1.1 查看系统变量 查看系统变量使用 show 关键字 ```SQL -- 查询所有系统变量 show variables; -- 模糊查询系统变量 show variables like '%%' ; ``` *** 查看具体变量值,任何一个有数据返回的内容都是由 select 查看 __语法:__<mark>select @@变量名</mark>;,系统变量查询时,前面固定加两个@符号 ```SQL -- 查询自动提交事务变量的值 select @@autocommit; -- 输出:1 ``` #### 1.1.2 修改系统变量 修改系统变量分为两种方式:会话级别和全局级别 ##### 1.1.2.1 会话级别 临时修改,当前客户端档次连接有效 __语法:__<mark>set 变量 = 值;</mark> 或 <mark>set @@变量 = 值;</mark> ```SQL -- 执行下面语句后,当前客户端的autocommit变量变成了0,但其它客户端查看时,autocommit还是等于1,这就是会话级别修改 set autocommit = 0; ``` ##### 1.1.2.2 全局级别 一次修改永久生效,对所有客户端都生效 __语法:__<mark>set global 变量 = 值;</mark> ```SQL -- 执行下面语句后,当前客户端的autocommit变量变成了0,新开其它的客户端查看时,autocommit也等于0,这就是全局级别修改 set global autocommit = 0; ``` > 注意:全局级别变量修改,如果在修改时,已有其它客户端已经连接上服务器了,那么当此修改对这些客户端无效,要断开连接,重新连接服务器才会生效 ### 1.2 自定义变量 所有自定义的变量都是会话级别的,当前客户端当此连接有效,自定义变量保存在内存中,结束会话释放内存后,自定义变量就失效了,此外自定义变量在此次会话中有效,它是允许跨库使用的,它并不是在那个库下赋值就只能应用在此库 #### 1.2.1 定义变量 系统为了区分系统变量,规定用户自定义变量必须使用一个@符号,使用 `@` 定义的变量是全局的,即使是在函数和储存过程中定义的,也可以在函数和存储过程之外获取和使用,这种方式定义的变量在此次会话中是全局的 __语法:__<mark>set @变量 = 值;</mark> 或 <mark>set @变量 := 值;</mark> ```SQL -- 自定义一个name变量,值为曹操 set @name = '曹操'; -- 在 MySQL 中使用:=符号才算是赋值 set @name := '曹操'; ``` *** 自定义变量查看和系统变量查看一样,使用 select 查看 __语法:__<mark>select @变量;</mark> ```SQL -- 查看自定义name变量的值 select @name; ``` > 在 MySQL 中,'=' 会默认的当做比较符号处理,MySQL 为了区分比较和赋值的概念,重新定义了一个新的赋值符号 ':=' 冒号加等号 *** #### 1.2.2 变量查询赋值 MySQL 从数据表中获取数据,然后赋值给变量的两种方式 ##### 1.2.2.1 边赋值边查看 __语法:__<mark>select @变量名 := 字段名 from 数据源;</mark>,从字段中取值赋值给变量名,如果使用 = 等号会变成比较,要赋值要使用 := 冒号加等号,如果这两 select 是多条数据时,会将最后一条记录对应的字段赋值给变量,因此这里建议最好查询的是一条精准的数据 **示例:** ```SQL select @name = name,@name := name from my_student; -- 建议使用 select @name = name,@name := name from my_student where id = 3; select @name; ``` **第一条SQL结果:** | @name = name | @name := name | |--------------|---------------| | NULL | 关羽 | | 0 | 张飞 | | 0 | 马超 | | 0 | 甄宓 | | 0 | 小乔 | **第二条SQL结果:**将查询的最后一条记录的 name 赋值给了变量 @name | @name | |--------| | 张皇后 | ##### 1.2.2.1 只赋值不查看 只有赋值不查看结果,要求严格,数据记录最多只允许获取一条,MySQL不支持数组 __语法:__<mark>select 字段1,字段2,…… from 数据源 where 字段 = 值 into @变量1,@变量2;</mark>,这里select记录只允许有一条记录,否则会报错:<span style="color : red">ERROR 1172 (42000): Result consisted of more than one row</span> **示例:** ```SQL select name,age from my_student where id=5 into @name,@age; select @name,@age; ``` **两条语句执行的结果:** | @name | @age | |-------|------| | 张飞 | 50 | #### 1.2.3 变量作用域 MySQL中的作用域与js中的作用域完全一样,全局变量可以在任何地方使用,局部变量只能在函数内部使用 #### 1.2.3.1 全局变量 使用 `set` 关键字定义,使用 `@` 符号标志 #### 1.2.3.1 局部变量 使用 `declare` 关键字声明,没有 `@` 符号,所有的局部变量的声明,必须在函数体开始之前 **语法:**<mark>declare 变量 数据类型 default 默认值</mark> **示例:**循环求和,只有奇数相加,偶数跳过 ```SQL delimiter // create function calcSum(num int) returns int begin -- 声明局部变量 declare i int default 1; declare res int default 0; -- 循环 a:while i <= num do -- 偶数跳过相加 if i % 2 = 0 then set i = i + 1; iterate a; else -- 奇数相加 set res = res + i; set i = i + 1; end if; end while a; return res; end // delimiter ; ``` **调用结果:** ```SQL select calcSum(10); ``` |calcSum(10)| |--| |25| ## 2. 代码执行结构 ### 2.1. if 分支结构 实现准备多个代码段,按照条件选择性执行某段代码,在MySQL中只有`if`分支 __语法:__ ```SQL IF 条件判断 THEN -- 满足条件要执行的代码段 ELSE IF 条件判断 THEN -- 满足条件要执行的代码段 ELSE -- 不满足条件要执行的代码段 END IF; ``` **示例代码:**下面的触发器代码中就是使用了if分支结构,如果对应的信息存在就会执行暴力报错代码 ```SQL delimiter // create trigger tri_studentClasssRelation before insert on my_studentClasssRelation for each row begin IF exists (select id from my_studentClasssRelation where student = new.student and classs = new.classs) then insert into xxx values (xxx); -- 数据库中并不存在xxx表,这里就是人为的暴力报错 END IF; end // delimiter ; ``` ### 2.2. while 循环结构 某段代码在指定条件下被重复执行 __语法:__ ```SQL while 条件判断 do -- 满足条件要执行的循环代码段 -- 变更循环条件 END while; ``` __循环控制:__在循环内部进行循环判断和控制,MySQL中没有 continue 和 break 但是有其它的类似的方式 + iterate:迭代,类似 continue ,后面的代码不执行,跳过此次循环,进入下一次循环 + leave:离开,类似 break ,结束此次循环 __循环控制使用方式:__要使用循环控制需要先定义循环名,使用语法如下: ```SQL 循环名字:while 条件判断 do -- 满足条件要执行的循环代码段 -- 变更循环条件 iterate/leave 循环名字; END while 循环名字; ``` ### 2.3. case when then 查询判断处理 此语法可以用在 select 之后,也可以用在 where 查询条件中 **语法:** ```SQL case when 布尔表达式1 then 值1 when 布尔表达式2 then 值2 else 值3 end ``` #### 2.3.1. select 字段使用 **示例:**将性别字段由数值转换成对应的汉字 ```SQL select case when gender = 0 then '女' when gender = 1 then '男' else '未知' end as '性别', name from my_student; ``` **结果:** | 性别 | name | |--|--| |男 | 关羽| |女 | 甄宓| |女 | 小乔| |女 | 大乔| |男 | 黄忠| |女 | 张皇后| #### 2.3.2. where 查询使用 **示例:**将性别字段由数值转换成对应的汉字进行查询数据 ```SQL select name,gender from my_student where (case when gender = 0 then '女' when gender = 1 then '男' else '未知' end) = '男' ; ``` **结果:** | 性别 | name | |--|--| |男 | 关羽| |男 | 黄忠|
扫一扫手机看
点击排行
windows 文件资源管理器使用
Layui 弹窗open使用说明
SQL Server 中字符串函数使用
C# 使用QQ邮箱代理做邮件接收功能
SQL Server关于apply的两种形式cross apply 和 outer apply
ASP.NET MVC 模型的自定义验证
nvm安装及常用命令
SQL Server 中数据类型转换
SQL Server 中WITH AS短语的使用
IE浏览器下AJAX缓存问题导致数据不更新的解决办法
订阅号