|
| 1 | +## 10. 变量 |
| 2 | + |
| 3 | +分类: |
| 4 | +- 系统变量 |
| 5 | + - 全局变量 |
| 6 | + - 会话变量 |
| 7 | +- 自定义变量 |
| 8 | + - 用户变量 |
| 9 | + - 局部变量 |
| 10 | + |
| 11 | +### 10.1 系统变量 |
| 12 | + |
| 13 | +变量由系统提供,不是用户定义,属于服务器层面 |
| 14 | + |
| 15 | +如果是全局级别,需要加global,如果是会话级别,则需要加session,如果不写,则默认session |
| 16 | + |
| 17 | +#### 1. 全局变量 |
| 18 | + |
| 19 | +作用域:服务器每次启动将为所有的全局变量赋初始值,针对所有的会话(连接)有效,但不能跨重启。 |
| 20 | + |
| 21 | +- 查看系统变量 |
| 22 | +```sql |
| 23 | +#全局变量 |
| 24 | +show global variables; |
| 25 | +#会话变量 |
| 26 | +show session variables; |
| 27 | +``` |
| 28 | + |
| 29 | +- 查看满足条件的部分变量 |
| 30 | +```sql |
| 31 | +show global variables like '%char%'; |
| 32 | +``` |
| 33 | + |
| 34 | +- 查看指定的某个系统变量的值 |
| 35 | +```sql |
| 36 | +select @@global.autocommit; |
| 37 | +select @@transaction_isolation; |
| 38 | +``` |
| 39 | + |
| 40 | +- 为某个具体的变量赋值 |
| 41 | +```sql |
| 42 | +set @@global.autocommit=0; |
| 43 | +``` |
| 44 | + |
| 45 | +#### 2. 会话变量 |
| 46 | + |
| 47 | +作用域:仅针对于当前会话(连接)有效 |
| 48 | + |
| 49 | +- 查看所有会话变量 |
| 50 | +```sql |
| 51 | +#会话变量 |
| 52 | +show session variables; |
| 53 | +show variables; |
| 54 | +``` |
| 55 | + |
| 56 | +- 查看满足条件的部分变量 |
| 57 | +```sql |
| 58 | +show session variables like '%char%'; |
| 59 | +show variables like '%char%'; |
| 60 | +``` |
| 61 | + |
| 62 | +- 查看指定的某个系统变量的值 |
| 63 | +```sql |
| 64 | +select @@session.transaction_isolation; |
| 65 | +select @@transaction_isolation; |
| 66 | +``` |
| 67 | + |
| 68 | +- 为某个具体的变量赋值 |
| 69 | +```sql |
| 70 | +set @@session.autocommit=0; |
| 71 | +set session autocommit=0; |
| 72 | +``` |
| 73 | + |
| 74 | +### 10.2 自定义变量 |
| 75 | + |
| 76 | +用户自定义的,不是由系统提供的 |
| 77 | + |
| 78 | +使用步骤: |
| 79 | +- 声明 |
| 80 | +- 赋值 |
| 81 | +- 使用(查看、比较、运算等) |
| 82 | + |
| 83 | +#### 1. 用户变量 |
| 84 | + |
| 85 | +作用域:针对于当前会话(连接)有效,同于会话变量的作用域 |
| 86 | + |
| 87 | +应用在任何地方, begin end 里外都可以 |
| 88 | + |
| 89 | +```sql |
| 90 | +#1.声明并初始化 |
| 91 | +set @用户变量名=值; |
| 92 | +set @用户变量名:=值; |
| 93 | +select @用户变量名:=值; |
| 94 | + |
| 95 | +#2. 更新用户变量的值 |
| 96 | +#方式一 |
| 97 | +set @用户变量名=值; |
| 98 | +set @用户变量名:=值; |
| 99 | +select @用户变量名:=值; |
| 100 | +#方式二 |
| 101 | +select 字段 into @变量名 from 表; |
| 102 | + |
| 103 | +#3. 查看用户变量的值 |
| 104 | +select @用户变量名 |
| 105 | + |
| 106 | +set @count=1; |
| 107 | +select count(*) into @count from employees; |
| 108 | +select @count; |
| 109 | +``` |
| 110 | + |
| 111 | +#### 2. 局部变量 |
| 112 | + |
| 113 | +作用域:仅仅在定义它的begin end中有效 |
| 114 | + |
| 115 | +应用在 begin end 中的第一句话 |
| 116 | + |
| 117 | +```sql |
| 118 | +#1. 声明 |
| 119 | +declare 变量名 类型; |
| 120 | +declare 变量名 类型 default 值; |
| 121 | +#2. 赋值 |
| 122 | +#方式一 |
| 123 | +set 局部变量名=值; |
| 124 | +set 局部变量名:=值; |
| 125 | +select @局部变量名:=值; |
| 126 | +#方式二 |
| 127 | +select 字段 into 局部变量名 from 表; |
| 128 | +#3. 使用 |
| 129 | +select 局部变量名; |
| 130 | +``` |
| 131 | + |
| 132 | +#### 3. 用户变量与局部变量对比 |
| 133 | + |
| 134 | +用户变量 |
| 135 | +- 作用域:当前会话 |
| 136 | +- 定义和使用的位置:会话中的任何地方 |
| 137 | +- 语法:必须加@符号,不用限定类型 |
| 138 | + |
| 139 | +局部变量 |
| 140 | +- 作用域:begin end中 |
| 141 | +- 定义和使用的位置:只能在begin end 中,且为第一句话 |
| 142 | +- 语法:一般不用加@符号,需要限定类型 |
| 143 | + |
| 144 | +```sql |
| 145 | +#声明两个变量并赋初始值,求和,并打印 |
| 146 | +#1. 用户变量 |
| 147 | +set @m=1; |
| 148 | +set @n=2; |
| 149 | +set @sum=@m+@n; |
| 150 | +select @sum; |
| 151 | + |
| 152 | +#2. 局部变量 |
| 153 | +declare m int default 1; |
| 154 | +declare n int default 2; |
| 155 | +declare sum int; |
| 156 | +set sum=m+n; |
| 157 | +select sum; |
| 158 | +``` |
| 159 | + |
| 160 | +## 11. 存储过程和函数 |
| 161 | + |
| 162 | +类似于java中的方法 |
| 163 | + |
| 164 | +好处: |
| 165 | +1. 提高代码的重用性 |
| 166 | +2. 简化操作 |
| 167 | + |
| 168 | +### 11.1 存储过程 |
| 169 | + |
| 170 | +含义:一组预先编译好的SQL语句的集合,理解成批处理语句 |
| 171 | + |
| 172 | +好处: |
| 173 | +1. 提高代码的重用性 |
| 174 | +2. 简化操作 |
| 175 | +3. 减少了编译次数,并且减少了和数据服务器的连接次数,提高效率 |
| 176 | + |
| 177 | +#### 1. 创建语法 |
| 178 | + |
| 179 | +语法:`create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的sql语句) end` |
| 180 | + |
| 181 | +注意: |
| 182 | +1. 参数列表包含三部分:参数模式 参数名 参数类型 |
| 183 | + - `in stuname varchar(20)` |
| 184 | + - 参数模式 |
| 185 | + - in: 该参数可以作为输入,该参数需要调用方传入值 |
| 186 | + - out: 该参数作为输出,该参数可以作为返回值 |
| 187 | + - inout: 该参数既可以作为输入,又可以作为输出 |
| 188 | +2. 如果存储过程体仅仅只有一句话,begin end 可以省略 |
| 189 | +3. 存储过程体中的每条sql语句的结尾必须加分号,存储过程的结尾可以使用 delimiter 重新设置 |
| 190 | + - 语法:`delimiter 结束标记` |
| 191 | + |
| 192 | +```sql |
| 193 | + |
| 194 | +``` |
| 195 | + |
| 196 | +#### 2. 调用语法 |
| 197 | + |
| 198 | +语法:`call 存储过程名(实参列表);` |
| 199 | + |
| 200 | +**1. 空参列表** |
| 201 | +```sql |
| 202 | +#插入到admin表中五条记录 |
| 203 | +delimiter $ |
| 204 | + |
| 205 | +create procedure myp1() |
| 206 | +begin |
| 207 | + insert into admin(username,password) values('john1', '0000'), ('lily', '0000'), ('rose', '0000'),('jack', '0000'),('tom', '0000'); |
| 208 | +end $ |
| 209 | + |
| 210 | +call myp1()$ |
| 211 | +``` |
| 212 | + |
| 213 | +**2. 创建带in模式参数的存储过程** |
| 214 | +```sql |
| 215 | +#根据女神名,查询对应的男神信息 |
| 216 | +create procedure myp2(in beautyName varchar(20)) |
| 217 | +begin |
| 218 | + select bo.* from boys bo right join beauty b on bo.id = b.boyfriend_id where b.name = beautyName; |
| 219 | +end $ |
| 220 | + |
| 221 | +call myp2('liuyan')$ |
| 222 | + |
| 223 | +#用户是否登录成功 |
| 224 | +create procedure myp3(in username varchar(20), in password varchar(20)) |
| 225 | +begin |
| 226 | + declare result int default ''; |
| 227 | + select count(*) into result from admin where admin.username=username and admin.password=password; |
| 228 | + select if(result>0,'success','unsuccess'); |
| 229 | +end $ |
| 230 | + |
| 231 | +call myp3('zhangfei', '8888')$ |
| 232 | +``` |
| 233 | + |
| 234 | +**3. 创建带out模式的存储过程** |
| 235 | + |
| 236 | +```sql |
| 237 | +#根据女神名,返回对应的男神名 |
| 238 | +create procedure myp4(in beautyName varchar(20), out boyName varchar(20)) |
| 239 | +begin |
| 240 | + select bo.boyName into boyName from boys bo inner join beauty b on bo.id = b.boyfriend_id where b.name=beautyName; |
| 241 | +end $ |
| 242 | + |
| 243 | +set @bName$ |
| 244 | +call myp4('xiaozhao', @bName)$ |
| 245 | +select @bName$ |
| 246 | + |
| 247 | +#根据女神名,返回对应的男神名和男神魅力值 |
| 248 | +create procedure myp5(in beautyName varchar(20), out boyName varchar(20), out userCP int) |
| 249 | +begin |
| 250 | + select bo.boyName,bo.userCP into boyName,userCP from boys bo inner join beauty b on bo.id = b.boyfriend_id where b.name=beautyName; |
| 251 | +end $ |
| 252 | + |
| 253 | +call myp5('xiaozhao', @bName, @usercp)$ |
| 254 | +select @bName, @usercp$ |
| 255 | +``` |
| 256 | + |
| 257 | +**4. 创建带inout模式的存储过程** |
| 258 | +```sql |
| 259 | +#传入a和b两个值,最终a和b都翻倍并返回 |
| 260 | +create procedure myp6(inout a int, inout b int) |
| 261 | +begin |
| 262 | + set a=a*2; |
| 263 | + set b=b*2; |
| 264 | +end $ |
| 265 | + |
| 266 | +set @m=10$ |
| 267 | +set @n=20$ |
| 268 | +call myp6(@m, @n)$ |
| 269 | +select @m, @n$ |
| 270 | +``` |
| 271 | + |
| 272 | +#### 3. 删除存储过程 |
| 273 | + |
| 274 | +语法:`drop procedure 存储过程名;` |
| 275 | + |
| 276 | +```sql |
| 277 | +drop procedure mp1; |
| 278 | +``` |
| 279 | + |
| 280 | +#### 4. 查看存储过程的信息 |
| 281 | + |
| 282 | +```sql |
| 283 | +show create procedure myp2; |
| 284 | +``` |
| 285 | + |
| 286 | +### 11.2 函数 |
| 287 | + |
| 288 | +- 存储过程:可以有0个返回,也可以有多个返回。适合批量插入、批量更新 |
| 289 | +- 函数:有且仅有1个返回。适合在处理数据后返回一个结果 |
| 290 | + |
| 291 | + |
| 292 | + |
| 293 | + |
0 commit comments