数据库学习二

今天给大家讲一下我第二周的数据库学习内容,首先给大家看一下我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 //;

 

发布了16 篇原创文章 · 获赞 69 · 访问量 7609

猜你喜欢

转载自blog.csdn.net/suiyu_eran/article/details/88744449