今天给大家讲一下我第二周的数据库学习内容,首先给大家看一下我MYSQL中的user表,如下图所示:
MYSQL单行函数
1.char_length:计算指定的数据列的字符的长度
select address, char_length(address) length from user;
结果为:
address | length |
山东省济南市 | 6 |
山东省烟台市 | 6 |
山东省青岛市 | 6 |
江苏省南京市 | 6 |
浙江省杭州市 | 6 |
2.date_add(参数,操作的字段):对日期、月份、年份操作
select date_add('2019-03-16', interval 2 day) proDate; //结果为2019-03-18
select date_add('2019-03-16', interval -2 month) proDate; //结果为2019-01-16
3.adddate:比date_add()使用起来要简单一点,但是功能不如其这个强大,只能对日期操作
select adddate('2019-03-16', -3) as proDate; //结果为2019-03-13
4.curdate:获取系统的当前日期
select curdate() as currentDate;
5.datediff:对日期进行加减操作的函数
select datediff(curdate(), '2019-02-12') as proDate; //显示当前日期和2019-02-12之间相差的天数
6.MD5:对用户密码进行加密操作,不可逆
select md5('123456') as pass; //显示加密后的结果
7.limit:用于指定获取固定条数的函数
select * from user limit 0,5; //显示user表中前五条数据
8.substring_index(要拆分的字符串, 分隔符, 拆分之后取哪几个)
select substring_index('abc,def,xyz', ',', 1); //结果为abc
select substring_index('abc,def,xyz', ',', -2); //结果为def,xyz
9.substring(要截取的字符串, 截取的起始位置, 截取几个字符)
select substring('ABCDEF', 3, 3); //结果为CDE
MySQL提供了如下几个处理null的函数:
- ifnull(exper1,exper2):如果exper1为null,则返回exper2,否则返回exper1
select userName, ifnull(telphone, '未知') tel from user where userId=1; //结果为zhangsan 未知
- if(exper1,exper2,exper3):类似于三目运算符,如果exper为true,不等于0且不等于null,则返回exper2,否则返回exper3
select userName, if(gender, if(gender=1, '男', '女'), '未知') gender from user where userId<10;
select userName, if(gender is not null, if(gender=1, '男', '女'), '未知') gender from user where userId<10;
上述两种方式的结果都是一样的,如下所示:
userName | gender |
zhangsan | 男 |
lisi | 未知 |
wangwu | 男 |
zhaoliu | 女 |
zhangsanfeng | 未知 |
MySQL还提供了一个case函数,该函数是一个流程控制函数。
//case when then 函数语法
//1.case后面跟数据列
select userName, (case gender when 1 then '男' when 2 then '女' else '未知' end) gender from user where userId<10;
//2.case后面不跟数据列,数据列在when函数后面
select userName, (case when gender=1 then '男' when gender=2 then '女' else '未知' end) gender from user where userId<10;
注:case when then函数组合,在使用时需要注意,不要丢掉最后的结束关键字end,end表示接受函数操作。
分组和组函数
先给大家看一下我的goods表
- avg:取平均值
select avg(t.shopPrice) as avgPrice from (select shopPrice from goods where goodsName like '%三%');
//输出商品名中带有"三"的商品的平均价格
- count:取总的数据记录
select count(*) from goods; //结果为3
- min、max、sum:最小值、最大值、求和
select * from goods where goodsPrice=(select min(shopPrice) from goods); //筛选出价格最低的商品的信息
select * from goods where goodsStock=(select min(shopStock) from goods); //筛选出库存最多的商品的信息
select sum(shopPrice) from goods; //求出商品表中商品价格的总和
存储过程
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批处理文件,虽然它的作用不仅限于批处理。
创建存储过程的语法格式如下:
create procedure 存储过程名(pram[参数列表])
begin
sql语句
end;
//第一个简单的存储过程
drop procedure if exists user_order;
delimiter // //声明一个结束符
create procedure user_order(in username varchar(30), in gdId int, in countNum int)
begin
set @total=(select goodsStock from goods where goodsId=gdId); //total为选中商品的库存
update goods set goodsStock=(@total-countNum) where goodsId=gdId;//更新goods表的商品库存量
insert into order_tail(orderId, goodsId, buyNum) values(1, gdId, countNum);//把购买信息添加到order_tail表中
end //;
call order_tail('张三', 2, 20); //调用存储过程
在数据库编程中加入分支语句:if then else end if
//带事务的存储过程
drop procedure if exists pro_order;
delimiter //
create procedure pro_order(in userId varchar(50), in gdId varchar(50), in buyNum int)
begin
declare t_error integer default 0; //declare用于定义变量
declare total int default 0;
declare continue handler for sqlexception set t_error=1; //定义一个事件句柄,在这里用于监听异常,如果监听到,则设置t_error为1
start transaction; //开始事务
set total=(select goodsStock from goods where goodsId=gdId);
if total-buyNum>0 then
update goods set goodsStock=(@total-countNum) where goodsId=gdId;
insert into order_tail(orderId, goodsId, buyNum) values(1, gdId, countNum);
end if;
if t_error=1 then
rollback;
else
commit;
end if; //如果运行过程中出错,则回滚,没有出错则提交
end //;