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就直接操作基表,而不是操作view

 
 
分类: MySQL

MySQL中函数、游标、事件、视图的更多相关文章

  1. [转]MySQL中函数CONCAT及GROUP_CONCAT

    一.CONCAT()函数 CONCAT()函数用于将多个字符串连接成一个字符串. 使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为 +-- ...

  2. Mysql中函数和存储过程的区别

    Mysql中函数和存储过程的区别 存储过程: 1.       可以写sql语句 2.       inout,out构造返回值 3.       调用:call:存储过程名称 4.       可以 ...

  3. MySQL中函数、游标、事件、视图基本应用举例(代码)

    MySQL中function用户自定义函数c,fun,fun是面向过程的实现方式只能传入参数,或不传入参数,不能传出参数,必有返回值函数中是不能有create table drop table之类的语 ...

  4. MySQL中函数CONCAT及GROUP_CONCAT

    一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...

  5. hive 中与mysql 中函数同名不同意的方法记录

    max 函数 在hive中max函数是一个聚合函数,所以,而且返回值是double ,而且后面必须跟group by ,这个和mysql差异很大 Built-in Aggregate Function ...

  6. MySQL中函数CONCAT及GROUP_CONCAT函数的使用

    一.CONCAT()函数 CONCAT()函数用于将多个字符串连接成一个字符串. 以数据表[user]作为实例: SELECT USER_NAME, SEX FROM USER WHERE USER ...

  7. Oracle中和mysql中函数的区别

    oracle                  -->                 mysqlto_char(sysdate,'yyyy-mm-dd')-->date_format(s ...

  8. mysql中的游标使用

    1.游标的作用及属性 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作:游标有下面这些属性: a.游标是只读的,也就是不能更新它: b.游标是不能滚动的,也就是只能在一个方向上进 ...

  9. JS中函数与事件

    一.函数: 1.函数就是一个工具,通过一小段代码,完成某个功能: 2.函数的定义: function 函数名(){ ..... } 或者 : var 函数名 = function(){ ...... ...

随机推荐

  1. java中文件的相对路径以及jar中文件的读取

    Java中File类的构造函数需要我们传入一个pathname,当我们传入以"/"开头的pathname表示绝对路径,其他均表示相对路径. 一:绝对路径名:是完整的路径名,不需要任 ...

  2. WebBrowser控件使用技巧分享

    原文:WebBrowser控件使用技巧分享 在发布“淘宝登货员”时发现不少朋友对WebBrowser控件比较感兴趣,故在此分享一下使用心得. 首先分享一个WebBrowser的扩展类(此类所需的dll ...

  3. DFGUI-- 标签交换 Tabstrip

    DFGUI没有更新,事实上,有些遗憾. 它着重于一个小 Examples/Containers/TabContainer.unity 那是,Tab采用. 功能 非常easy.就是切换Tag 内容改变. ...

  4. 专访雷水果国:离1.5K至18K 一个程序猿5每年的成长之路

    我只是一个小菜鸟,对于自主学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流. 寻 ...

  5. 平安某金所奇葩的面经-关于幂等和ROA设计的反思

    在公司一直在做跟支付有关的项目,某日接到平安某金所一男子电话,应该是之前某猎头投的,我正好在吃早饭(也不能怪他们上班早,我们公司弹性工作制,我一般上班比较晚). 因为饭馆信号不好,只能赶紧放下剩下的半 ...

  6. Android超炫日期日历控件:TimesSquare

    先看效果图: 使用说明: 在布局文件里: <com.squareup.timessquare.CalendarPickerView android:id="@+id/calendar_ ...

  7. Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 1

    Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 序章 Asp.Net MVC4 + Oracle + EasyUI + Bootstrap 序章 -- 新建微软实 ...

  8. 《Visual Studio Magazine》2013年读者选择奖—软件类

    <Visual Studio Magazine>会在每年的下半年向读者发出投票邀请,读者将在28个大类,超过500个开发工具的名单中选出他们认为最好的产品,以票数评出各分类的金.银.铜奖. ...

  9. 【转】浏览器DNS 预取读技术的危害

    今天中午在http://news.ycombinator.com/news看到一篇文章标题: Saved 10 billion DNS queries per month by disabling D ...

  10. idea执行go

    因为经常在不同的地方调代码,每次都调整环境很麻烦,于是在犯懒的时候发现了更直接简便的办法,关于idea集成go环境的,不需要按部就班的部署. 首先下代码,比如https://github.com/sa ...