diff --git "a/23 \351\231\210\346\254\243\345\250\201/20231023 MySQL\345\244\215\344\271\240.md" "b/23 \351\231\210\346\254\243\345\250\201/20231023 MySQL\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec5bb36cffc936acddc2e562eb1f47a9363c8c58 --- /dev/null +++ "b/23 \351\231\210\346\254\243\345\250\201/20231023 MySQL\345\244\215\344\271\240.md" @@ -0,0 +1,9 @@ +# 笔记 + +--日期函数 +curdate() -- 返回当前日期 +curtime() -- 返回当前时间 +now() -- 返回当前时间日期 +year(date) -- 获取指定date的年份 +month(date) -- 获取指定date的月份 +day(date) -- 获取指定date的日期 \ No newline at end of file diff --git "a/23 \351\231\210\346\254\243\345\250\201/20231024 MySQL\347\254\224\350\256\260.md" "b/23 \351\231\210\346\254\243\345\250\201/20231024 MySQL\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..37c408d6ad24b75b7ad6b812734dff6d3c64676a --- /dev/null +++ "b/23 \351\231\210\346\254\243\345\250\201/20231024 MySQL\347\254\224\350\256\260.md" @@ -0,0 +1,262 @@ +# 笔记总结 + +## 函数学习 + +1.length()返回字符串的长度 + +2.substring(s,index,len) 返回从字符串s的index位置截取len个字符 + +3.trim(s) 去掉字符串s开始与结尾的空格 + +## 分支结构 + +```mysql +-- 创建存储过程 +demiliter // +create procedure abc (in num int) +begin + -- if判断如果num大于30输出123否则输出456 + if num>30 then select '123'; -- if 条件 then 输出123 + else select '456'; -- 否则输出456 + end if; -- 结束if判断 +end // +demiliter ; +call abc(40); +``` + +## 参数 + +```mysql +set @admin='大脑斧'; -- 会话变量 + + +delimiter && +create procedure one() +begin +declare name varchar(50); -- 创建局部变量(只能创建和生效在procedure过程里面) +set name = '研嵩'; -- 给局部变量赋值 +end && +delimiter; + + +delimiter && +create procedure one(in myid int,out myname varchar(100)) -- in 入参,out 出参 inout 入参+出参 +begin +select last_name into myname from employees where employee_id=myid; -- 在查询的字段后面写into+赋值变量(给局部变量赋值) +end && +delimiter; + +call one(100,@name); -- 输入参数(参数之间需相互对应) + +select @name; -- 查询参数 +``` + +### 循环 + +loop:是死循环需要有条件才能跳出循环 + +```mysql +-- 写一个存储过程,可以输入一个整数,输入小于或等于0时,提示非法输入,并中止这个存储过程 +drop procedure test_loop; +delimiter // +create procedure test_loop (in num int) +a:begin + declare i int default 1; + if num <=0 then + select '非法输入'; + leave a; + end if; + if num>20 then + b:loop + if i%10=0 then + set i=i+1; + iterate b; + end if; + + if i%2=0 then select i; + end if; + + if i<=num then + set i=i+1; + end if; + + if i>num then leave b; + end if ; + end loop b; + + else select '太小了' ;leave a; + end if; +end // +delimiter ; +call test_loop(30); +``` + +while:是条件循环,需要满足条件才能进入循环一旦不满足条件就会跳出循环 + +```mysql +drop procedure test_while; +delimiter // +create procedure test_while (in num int) +a:begin + declare i int default 1; + if num <=0 then + select '非法输入'; + leave a; + end if; + if num>20 then + b:while i<=num do + set i=i+1; + if i%2=0 then select i; + end if; + if i>num then leave b; + end if ; + end while b; + else select '太小了' ;leave a; + end if; +end // +delimiter ; +call test_loop(26); +``` + +repeat:是先执行一次循环后通过until进行条件判断,满足条件跳出循环 + +```mysql +drop procedure test_repeat +delimiter // +create procedure test_repeat (in num int) +a:begin + declare i int default 1; + if num <=0 then + select '非法输入'; + leave a; + end if; + if num>20 then + repeat + set i=i+1; + if i%2=0 then select i; + end if; + until i>num + end repeat ; + else select '太小了' ;leave a; + end if; +end // +delimiter ; +call test_loop(26); +``` + +## 游标 + +存储函数的关键字是:function + +create function 函数名 (参数名 参数类型) 函数没有模式 + +定义游标语句 + +declare ub cursor for ...... + +打开游标 + +open ub + +使用游标 + +fetch ub into xx; 从游标里取值赋值给变量,有几个值就要有几个变量 + +```mysql +-- 1.利用游标,查询并计算出emp表中全公司的总薪资(salary和comm) +delimiter // +CREATE PROCEDURE a() +BEGIN + DECLARE sal_sum INT; + DECLARE comm_sum int; + DECLARE ub CURSOR FOR SELECT sum(sal),sum(comm) from emp; + CREATE table show_num( + sal_sum int, + comm_sum int + ); + OPEN ub; + FETCH ub INTO sal_sum,comm_sum; + INSERT into show_num VALUES (sal_sum,comm_sum); + CLOSE ub; +END// +delimiter ; +call a() +SELECT * FROM show_num +``` + +## 触发器 + +### 练习 + +模拟一个食品库存表,当食品采购时,记录采购信息并更改库存。 + +```mysql +create database food_t charset utf8; +use food_t; +create table food( + food_id int primary key, + food_name varchar(20), + quantity int +); +create table DeliveryLog( + log_id int primary key, + food_id int, + quantity int, + delivery_date date + ); +drop trigger if exists update_f; +delimiter // +create trigger update_f + after insert on DeliveryLog for each row +begin + update food set quantity = quantity + new.quantity where food_id = new.food_id; +end // +delimiter ; +INSERT INTO DeliveryLog (log_id, food_id, quantity, delivery_date) +VALUES (1, 1, 10, '2023-10-14'); +``` + +## 窗口函数 + +```mysql +-- rows 启用窗口大小 +-- between ... and ... 范围区间 +-- unbounded preceding 起始行 +-- current row 当前行 +-- unbounded following 最终行 +-- preceding指当前行之前的行 可搭配数字可获取当前行数字之前的数据 +-- following指当前行之后的行 可搭配数字可获取当前行数字之后的数据 + +``` + +## 索引 + +索引: + +创建普通索引 + +create index 索引名 on 表名(列名) + +**alter** **table** 表名 **add** **index** 索引名(列名) + +创建表时直接创索引 + +create table tab( + id int primary key, + name varchar(20), + index 索引名 (列名) primary key(列名) +); + + + +创建唯一索引 + +比普通索引多了unique关键字 + +create unique index 索引名 on 表名(列名); +alter table 表名 add unique 索引名 (列名) +create table tab( + id int primary key, + name varchar(20), + unique [INDEX] 索引名 (列名) +); \ No newline at end of file