mysql和oracle对于内连接和左右连接的使用(一)

来源:互联网 发布:楼凤阁 源码 编辑:程序博客网 时间:2024/06/09 09:39

1.左右连接的问题

    这种 事情 我不确定 什么时候会用到(可能复杂的 储存过程会用到)

       可能 一次 一张表和 3张以上的 表连接时,会用到

       1-1   from  a left join b on ...... 

                       就是说  以a 表为主 ,b表会把 空的 显示为 null

      1-2 还可以在 连接中一次可以 连多次,以便于 把列显示多次

       select zid,t1.tname as t1name,res,kid,t2.tname as t2name,mtime
                     from m left join t as t1 on m.zid = t1.tid  
                                   left join tas t2 on m.kid = t2.tid 
                     where mtime between '2006-06-01' and '2006-07-01';
                    总结:可以对同一张表连接多次,以分别取多次数据
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
2.对于oracle 的一些 内置函数,很有用但是 功能有点 绕

  

case  when(

   

         SELECT sum(

           days*CASE WHEN PersonalLeaveType=0 

               THEN 100 ELSE 20 end 成立 则 100, 否则是 20

                           )  
                     FROM  

                  tb_personalleave WHERE emptId=emp.Id 

                    AND  to_char(PersonalLeaveDtm,''yyyy-MM'')=:dtm


                 ) 

                                      嵌套了 两层

               is NULL THEN 0  

else  ( )  end dddd--别名

................................

select     id , 

             case when  ()  is null then 0 else () end   name,

             addr

 from   emp 

.........................................................


 2-2看看 sql servier的   

create  procedure proc_getPayDetail
 (
 @dtm varchar(20)
 )
 as
 begin
select
@dtm,
emp.id, 

case

when(

                             值为空 则 返回0   否则 返回  本身

           select sum(days*150 ) from tb_Absence 

    where emptId=emp.id  and CONVERT(varchar(100),

    tb_Absence.absenceDtm, 102)=@dtm) 


             is null  

             then 0

   else(

          select sum(days*150 ) from tb_Absence 

         where emptId=emp.id  

         and CONVERT(varchar(100),tb_Absence.absenceDtm, 102)=@dtm)

end  absencepay

from tb_emp emp
end


public void updateEmp(EmployeeVo emp) throws Exception{
Connection conn = this.openConnection();
CallableStatement  cst = conn.prepareCall("{call sp_updateemp(?,?)}");
cst.setInt(1, emp.getEmpId());
cst.setString(2, emp.getEmpName());
//执行
cst.execute();
//如果返回表结构
// ResultSet rs = cst.getResultSet();....
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

2-3  mysql的写法

create PROCEDURE proc_getPayDetail(IN dtm VARCHAR(20))
  BEGIN
  SELECT  emp.empId,emp.ename,emp.basepay,

CASE
       WHEN (SELECT sum(hours * 20) FROM tb_overtime  
       WHERE emptId=emp.Id          
   AND DATE_FORMAT(overtimeDtm,'%Y-%m')=dtm) 
   is NULL THEN 0
   ELSE (SELECT hours*20 
   FROM tb_overtime  
   WHERE emptId=emp.Id AND
   DATE_FORMAT(overtimeDtm,'%Y-%m')=dtm)
   END overtimepay,

 CASE
   WHEN
(SELECT sum(

        days*(CASE WHEN PersonalLeaveType=0 

               THEN 100 ELSE 20 END)  成立 则 100, 否则是 20

)  
           FROM  

       tb_personalleave WHERE emptId=emp.Id 

                    AND DATE_FORMAT(PersonalLeaveDtm,'%Y-%m')=dtm) 

                                      嵌套了 两层

              is NULL THEN 0  


   ELSE (SELECT sum(days*(CASE WHEN PersonalLeaveType=0 THEN 100 ELSE 20 END))  
           FROM tb_personalleave WHERE emptId=emp.Id AND DATE_FORMAT(PersonalLeaveDtm,'%Y-%m')=dtm)
   END personalleavepay,   

   CALL proc_getPayDetail('2016-05');








0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 饥荒晚上猎狗来怎么办 脑紊乱思维迟缓怎么办 儿童思维反应慢怎么办 w7系统反应慢怎么办 思维缓慢发呆书呆子怎么办 苹果手机网速慢怎么办? 在美国警察杀人怎么办? 征兵填写不知道怎么办 长虹子画面关怎么办 土地被村长霸占怎么办 半夜 手机卡掉了怎么办 淘宝号买家违规怎么办 镍氢电池没电了怎么办 地下室对讲机信号不好怎么办 cf不能说话了怎么办 cf没办法说话怎么办 cf对讲机没声音怎么办 交警用的对讲机怎么办 cf语音没有声音怎么办 去上海没有流量怎么办 去外地没流量怎么办 外地流量不够用怎么办 手机在外地流量怎么办 联通网卡在外地怎么办 套餐流量不够用怎么办 省内流量去省外怎么办 在外省流量不够怎么办 榨汁机开关坏了怎么办 健伍dvd没遥控器怎么办 佳能 显示屏关不了怎么办 iqos充电闪红灯怎么办 航班取消了乘客怎么办 摩托罗拉电话静音了怎么办 对讲机话筒坏了怎么办 摩托罗拉xt1570费电怎么办 主板没有rgb接口怎么办 对讲机频段没了怎么办 怀孕查出宫颈囊怎么办 办养殖场没地怎么办 宝宝睡觉衣服湿透怎么办 开衫衣服往下滑怎么办