MySQL中函數、遊標、事件、視圖基本應用舉例(代碼)

MySQL中
function用戶自定義函數
c,fun,fun是面向過程的實現方式
只能傳入參數,或不傳入參數,不能傳出參數,必有返回值
函數中是不能有create table drop table之類的語句
與sp同樣,db中object
begin end 至關於{}
(1)輸入任意姓名,輸出 hello+姓名+!
drop function if exists fun1;
delimiter //
create function fun1(a varchar(32))
returns varchar(32)
begin
    declare x varchar(32);
    set x=concat('hello',a,'!');
    return x;
end //
delimiter ;
select fun1('張三');
                        -- (1)等同於(2)
(2)輸入任意姓名,輸出 hello+姓名+!
drop function if exists fun1;
create function fun1(a varchar(32))
returns varchar(32)
return concat('hello',a,'!');      -- 由於只有一條語句,因此省略了 begin end
select fun1('張三');

(3)求和
drop function if exists fun1;
delimiter //
create function fun1(a int,b int)
returns int
begin
   declare c int;
 -- set c=a+b;
   select a+b into c;
   return c;
  -- return a+b;
end //
delimiter ;
select fun1(10,30);

(4)select fun1('zhangfei');->stu(stuName) 實現輸入姓名,插入到stu表的stuName字段,並返回stu表的記錄條數
drop function if exists fun1;
delimiter //
create function fun1(a varchar(32))
returns int
begin
   declare x int;
   insert into stu(stuName) select a;
   select count(1) into x from stu;
   return x;
end //
delimiter ;
select fun1('zhangfei');

(5)取輸入字符串的前b個字符,並在其後加...輸出,若輸入字符串爲空,則提示‘輸入錯誤’,若輸入字符串長度小於b,則直接輸出字符串,若大於b,則截取前b個字符,並在其後加...輸出
drop function if exists fun1;
delimiter //
create function fun1(a varchar(32),b int)
returns varchar(32)
begin
   if isnull(a) || char_length(a)=0 then
   return '輸入錯誤';
   elseif  char_length(a)<=b then
   return a;
    else
    return concat(left(a,b),'...');
   end if;
end //
delimiter ;
select fun1('abcdef',3);

(6)輸出a個*
drop function if exists fun1;
delimiter //
create function fun1(a int)
returns varchar(32)
begin
   declare b int default 1; -- 1...5
   declare s varchar(32) default '';
   while b<=a
   do
   set s=concat(s,'*');
   set b=b+1;
   end while;
   return s;
end //
delimiter ;
select fun1(5);

-- cursor遊標(光標)
不多用,基本不用
對之後用php從一個表內將數據一條條取出來放網頁上去顯示
-- 什麼是cursor
4個步驟
-- cursor,數據緩衝區
1.聲明coursor
declare cur cursor for select stuID,stuName from stu oder by stuID;
2.打開coursor
open cur;
cursor有一個指針,默認就指在第一條
3.fetch
declare a int;
declare b varchar(32);
declare c varchar(32);
fetch cur into a,b,c;
select a,b,c;

fectch完數據,指針自動下移一行
while

close cur;

cursor 放在sp中用
drop procedure if exists sp1;
delimiter //
create procedure sp1()
begin
   declare a int;
   declare b varchar(32);
   declare cur cursor for select stuID,stuName from aa order by stuID;
   open cur;
 -- fetch cur into a,b;
 -- fetch cur into a,b;         (有三條數據)
 -- fetch cur into a,b;
  -- select a,b;
  -- close cur;
    set @a=1;
    select count(1) into @b from stu;
    while @a<=@b
    do
    fetch cur into a,b;
    select a,b;
    set @a=@a+1;
     end while;
   close cur;
end //   
delimiter ;
call sp1();


-- event事件
用的也較少 相似linux中的crontab (天天下午執行某事件) 通常用於按期執行某任務
drop event if exists ev1;
create event ev1
on schedule every 1 minute        -- 每隔1分鐘執行一次該事件
do
  insert into aa select 5,'孫堅';

alter event ev1 disable; 使其中止執行
on schedule at now()     當即執行,就執行一次,事件不會保存下來

drop event if exists ev1;
delimiter //
create event ev1
on schedule at now() + interval 3 second -- 3秒後執行一次該事件,執行完後該事件消失
do
begin
  insert into aa select 5,'孫堅';
  insert inwo aa select 6,'e';
end//
delimiter ;

alter event ev1 disable;
alter event ev1 enable;

-- view 視圖
-- 是一張虛擬表,
select * from v1;
-- data
view->table
-- 方便
-- 安全
stu(stuID,stuName,stuAge,stuAddr)
stuID,stuName->v1 -- 看需求

stu(stuID,stuName)
courses(coursesID,coursesName)
sc(stuID,coursesID,score)

create view v1
as
  select stuName,coursesName,score
  from stu,courses,sc
  where sc.stuID=stu.stuID && sc.coursesID=courses.coursesID

select * from v1;
-- 比較複雜的查詢作成view
-- 視圖只用於看,顯示,select
-- 當要進行數據修改插入什麼的時候,直接修改基表

create table stu
(
    stuID int,
    stuName varchar(32),
    stuAge int,
    stuAddr varchar(32),
    primary key(stuID)
)engine=innodb charset=utf8;
-- stuName,stuAge
drop view if exists v1;
create view v1
as
select stuName,stuAge from stu;

-- book(),author(),press
create table author
(
    authorID int,
    authorName varchar(32)
)engine=innodb charset=utf8;
create table press
(
   pressID int,
   pressName varchar(32)
)engine=innodb charset=utf8;
create table book
(
   bookID int,
   bookName varchar(32),
   authorID int,
   pressID int
) engine=innodb charset=utf8;

drop view if exists v1;
create view v1
as
select bookName,authorName,pressName
from book,author,press
where book.authorID=author.authorID && book.pressID=press.pressID;
select * from v1;

-- 根據需求,view只用來查數據
-- 要insert,update,delete就直接操做基表,而不是操做viewphp

相關文章
相關標籤/搜索