一、内置函数
1 | select rand() from dual; |
1 | select * from stuInfo order by rand() limit 2; # 随机抽两个学生 |
1 | select round(3.5); # 四舍五入 4 |
1 | select ceil(2.1); # 向上取整 3 |
1 | select floor(2.9); # 向下取整 2 |
1 | select truncate(3.1415926,3) # 直接截取小数点后几位 |
2、字符串类
1 | select ucase('i am b boy!'); # 转成大写 |
1 | select lcase('I AM A BOY!'); # 转成小写 |
1 | select left('abcd',3); # 从左边截取 abc |
1 | select right('abcd',3); # 从左边截取 bcd |
1 | select substring('abcde',2,3) # 从1开始,第二个开始,取3个 |
1 | select concate('中国','-','上海'); # 字符串联接 |
1 | select stuName,coalesce (writtenExam,'缺考'),coalesce (labExam,'缺考') from stuInfo natural left join stuMarks; # coalesce(str1,st2); # 如果str1不为空,显示str1,如果str1为空,显示str2 |
1 | select length('锄禾日当午'); # 字节长度 |
1 | select char_length('锄禾日当午'); # 字符个数 |
3、时间类
1 | select unix_timestamp(); # 获取时间戳 |
1 | select from_unixtime(unix_timestamp()); # 将时间戳转成年月时分秒的格式 |
1 | select now(); # 获取当前日期时间 |
1 | select year(now())'年',month(now())'月',day(now())'日',hour(now())'小时',minute(now())'分钟',second(now())'秒'); |
1 | select dayName(now()); # 星期几 |
1 | select monthName(now()),dayofyear(now()); # 本年的第几个月,第几天 |
1 | select datediff(now(),'2008-8-8'); # 两个时间差多少天 |
- **cast() **函数进行数据类型转换(两个表达式可以隐性转换才可以转换)
- **convert()**函数是把日期转换为新数据类型的通用函数
1 | select cast(now() as time); |
1 | select convert(now(),date),convert (now(),time); # 将now()转成日期2018-09-16 和 时间16:08:03 |
4、加密函数
- md5() 单向加密
- 数据字典实现解密
- 穷举法
- sha()
1 | select md5('aa'),sha('aa'); |
1 | create table users( |
5、判断函数
语法:
1 | if(表达式,值1,值2) |
1 | select if(10%2,'偶数','奇数'); |
1 | select stuName,ch,math,if(ch>=60 && math>=60,'通过','不通过') '是否通过' from stu; |
二、预处理 prepare
- 预编译一次,可以多次执行。
- 用来解决一条SQL语句频繁执行的问题。
- 只要结构一样就可以。
- ?位置占位符
- 变量@开头,通过set给变量赋值
1 | 预处理语句:prepare 预处理名字 from 'sql语句' |
案例:
1 | prepare stmt from 'select * from stuInfo'; # 创建预处理 # stmt (statement) |
1 | delimiter // |
1 | prepare stmt from 'select * from stuInfo where stuNo=?'; # ?为位置占位符 @id全局变量 ------------------这个很重要!!! |
1 | prepare stmt from 'select * from stuInfo where stuSex=? and stuAddress=?'; |
三、存储过程 procedure
存储过程——函数。
- **没有return **的叫做过程
- **有return **的叫做函数
1、存储过程的优点
- 存储过程可以减少网络流量
- 允许模块化设计
- 支持事务
2、创建存储过程
- 由于过程中有很多sql语句,每个语句的结束都要用( ;)表示。
- 默认情况下,分号即表示语句结束,又表示向服务器发送SQL语句。
- 我们希望分号仅表示语句的结束,不要将SQL语句发送到服务器执行,通过delimiter 来更改结束符。
语法:
1 | create procedure 存储过程名(参数) |
案例:
1 | delimiter // |
3、调用存储过程
语句:
1 | call 存储过程名() # 创建存储过程 |
案例:
1 | call proc() # 可以多次调用存储过程 |
4、删除存储过程
语法:
1 | drop procedure [if exists] 存储过程名 |
案例:
1 | drop procedure proc// # 删除存储过程 |
5、查看存储过程信息
语法:
1 | show create procedure 存储过程名 \G |
案例:
1 | show create procedure proc \G |
1 | show procedure status \G # 显示所有存储过程 |
6、存储过程的参数
- 存储过程的参数分为:
- 输入参数(in)【默认】
- 输出参数(out)
- 输入输出参数(inout)
- 存储过程不能使用return返回值,要返回值只能通过“输出参数”来向外传递值。
1 | create procedure proc(in num1,out num2,inout num3); # num1,num2,num3既可以是输入参数也是输出参数 |
6.1 存储过程的输入参数
案例:传递学号,获取对应的信息
1 | create procedure proc(in param varchar(10)) # 输入参数 |
1 | call proc('s25301') // |
局部变量 declare,不用写@符号)
1 | create procedure proc(name varcahr(10)) |
- 注意事项⚠️:
- 通过 decalre 关键字声明局部变量。
- 给局部变量赋值有两种方法
- 方法一:set 变量名=值
- 方法二: select 字段 into 变量 from 表 where 条件
- 声明的变量不能与列名同名
6.2 存储过程的输出参数
1 | create procedure proc(num int,out result int) |
1 | call proc(10,@result) |
6.3存储过程的输入输出参数
1 | create procedure proc(inout num int) # inout 输入输出参数 |
1 | set @num=10; |
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/mySqlNote/09_MySQL_第八课_内置函数、预处理、存储过程/
- 版权声明: 梁俊可工作室