mysql自定义函数 多表_mysql通过多表连接,查询多表字段,自定义函数、流程控制...

多表链接查询是从多个表中获取数据(两个表以上)最好不要超过三个表

table_reference [inner] join | {left|right} [outer] join teble_reference on condition_expr

透过查看图书信息表和图书类别表来获取图书编号、图书名称、图书类别

select book_id,book_name,category from book_info inner join book_category on book_info.book_category_id=book_category.category_id;

内链接

根据链接条件从多个表中查询选择数据,显示表中与链接条件相匹配的数据行,组合成新记录。

select col_list from table_name1 inner join on jion_condition1 inner join t3 on join_condition2]where where_conditions;条件是指定两个表都存在的列,inner可以省略

外连接

查询多个表中相关联的行

左外连接 left [outer] join,返回左表满足连接条件的所有记录

select book_id,book_name,category from book_category left outer join book_info on book_category.category_id=book_info.book_category_id;

右外连接right [outer] join

select col_list from t1 left|right [outer] join t2 on join_condition1;

自连接

如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。

查询的数据是来自一张表

select s.category_id as '图书类别编号',s.category as '图书类别名称',p.category as '图书的上级名称' from book_category s left join book_category p on s.parent_id=p.category_id;

多表更新

update talbe1 {inner]join|{left|right}[outer]join table2

on conditional_expr

set col1={expr1|default}

[,col2={expr2|default}]....

[where where_condition];

update reader_info t1 join book_info t2 on t1.card_id=t2.card_id

set actual_return_date = sysdate(),bookfee=datediff(sysdate(),return_date)*0.2,balance=balance-bookfee

where t1.book_id = 20151101 and t1.car_id ='2012011';

多表删除

delete table1[.*],table2[.*]

from table1{inner]join|{left|right}[outer]join table2 on conditional_expr

where where_condition

create table book_category_bak

as

select * from book_category;复制一个book_category表

delete t1 from book_category_bak t1

left join bookinfo_bak_t2

on t1.category_id=t2.book_category_id

where parent_id<>0 and book_id is null;

外连接、内连接、自连接难点;什么时候使用外连接,什么时候使用内连接

-------------------------------------------------------------

自定义函数

函数(存储函数)

1、需要有返回值  2、可以指定0~n个参数

create function function_name([func_parameter])

returns type

[charateristics...] routine_body

charateristics指定存储函数的特性

sqlsecurity{definer|invoker}:指明谁有权限来执行

definer:表示只有定义者才能执行

invoker表示拥有权限的调用者才可以执行,默认情况下,系统指定definer

comment'string':注释信息,可以用来描述存储函数

(routine body)函数体是由SQL代码构成;

函数体可以是简单的SQL语句,比如:简单的查询语句

函数体如果为复合结构需要使用begin...end语句

复合结构可以包含声明、流程控制。

create function ym_date(mydate date)  传参数

returns varchar(15)  返回值类型

return date_format(mydate,'%Y-%m');函数返回值

delimiter//自定义结束符(以//结束)

create function ym_date(mydate date)

returns varchar(15)  返回值类型

begin

return date_format(mydate,'%Y-%m');函数返回值

end//

create function newdate()

returns varchar(20)

return date_format(curdate,'%Y年%m月%d日');

创建有参函数

create function show_name_store(bid int)

returns varchar(50)

return (select concat_ws('----',book_name,store) from book_info where book_id =bid);

当book_id传入时,连接book_name---store

结果:java编程思想---5;

删除自定义函数

drop function [if exists] func_name;

drop function newdate;

流程控制

变量

可以在存储程序(存储过程和函数)中使用变量

在存储程序中变量的作用范围在begin..end之间。

定义变量

declare var_name [,varname]...date_type[default value];

declare num int default 10;

为变量赋值

定义变量之后,通过赋值可以改变变量的默认值。

两种赋值方式:

set var_name=expr[,var_name=expr]...

select col_name[,...] into var_name[,..] talbe_expr

set num=100;

select store into num from bookinfo;从表bookinfo中的列store 的值赋给num;

delimiter //

create function show_name_store(bid int)

returns varchar(50)

begin

declare result varchar(50); 设置变量

(select concat_ws('----',book_name,store) into result from book_info where book_id =bid);赋值变量

return result;

end //

delimiter

流程控制语句

if语句

if condition then

....

[elseif condition then]

....

....

[else]

....

end if;

delimiter //

create function show_level(cid char(18))

returns varchar(10)

begin

declare lev varchar(10);

declare money decimal(7,3);

select balance into money from readerinfo where card_id=cid;

if money>=500 then

set lev='金牌会员';

elseif money>=300 then

set lev='银牌会员';

elseif money>=200 then

set lev='普通会员';

else

set lev='非会员,余额不足';

end if;

return lev;

end //

delimiter;

case语句

case case_expr(表达式)[when_value 是表达式的值

when when_value then statement_list

when when_value then statement_list...

[else statement_list]

end case

delimiter //

create function show_level2(cid chr(18))

returns varchar(10)

begin

declare lev varchar(10);

declare money decimal(7,3);

declare num int;

select balance into money from readerinfo card_id=id;

set num=truncate(money/100,0);

case num

when 0 then set lev='非会员,余额不足';

when 1 then set lev='非会员,余额不足';

when 2 then set lev='普通会员';

when 3 then set lev='高级会员';

when 4 then set lev='高级会员';

else then set lev='金牌会员';

end case;

return lev;

end //

delimiter

case

when expr_condition then statement_list

when expr_condition then statement_list...

else statement_list

end case

循环语句

[while_label:]while condition do

...

end while[while_label]

求n以内的和

delimiter //

create function testfunc(n int)

returns int

begin

declcare num int dafault 0;

declcare sum int default 0;

while num

set num=num+1;

set sum=sum+num;

end while;

return sum;

end //

delimiter;

loop循环语句

该循环没有内置循环条件,但可以通过leave语句退出循环

[loop_label:]loop

statement_list

end loop[loop_label]

leave loop_label

delimiter //

create function testfunc(n int)

returns int

begin

declcare num int dafault 0;

declcare sum int default 0;

lab1:loop

set num=num+1;

set sum=sum+num;

if num>=n then

leave lab1;

end if;

end loop lab1;

return sum;

end //

delimiter;

repeat循环语句

[repeat_label:]repeat

.....

until expr_condition

end repeat[repeat_label]

delimiter //

create function testfunc(n int)

returns int

begin

declcare num int dafault 0;

declcare sum int default 0;

repeat

set num=num+1;

set sum=sum+num;

util num>=n

end repeat;

return sum;

end //

delimiter;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值