zoukankan      html  css  js  c++  java
  • orcal_sql编写(我们似曾相识系列5)

    我们似曾相识系列5

    8个月前开始的系列,我们继续。

    很多朋友都要在面试的时候才会发现,写个简单sql文都比较困难。大概都是orm惹得祸吧,我也不例外。

    提供基础知识的网站: w3school


    主题:

    1,使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

    DECODE(value,if1,then1,if2,then2,if3,then3,...,else)

    decode(待比较的对象,如果为这个,那么结果为这个,否则结果是这个...)

    这个函数的好处就是可以实现if逻辑,作为查询语句,可以加上这样的能力能够处理很多问题。

    例:

    select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary*1.15) from employee;

    2,sign 函数

    作用:取数字n的符号,大于0返回1,小于0返回-1,等于0返回0

    select sign(100),sign(-100),sign(0) from dual; 

    3,NVL函数

    NVL( string1, replace_with)

    作用:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。

    关于null的处理,可以对付在需要计算的地方:

    select ename sal+nvl(coum, 0) from emp;

    需要注意的是:string1和replace_with的值必须是同一数据类型,比如这么搞:nvl(to_char(name), 'string1')

    另外:Oracle在NVL函数的功能上扩展,提供了NVL2函数。
      NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回E3,否则返回E2。

    4,COUNT函数

    COUNT(column_name)

      函数返回指定列的值的数目(NULL 不计入)

    5,Like

    A,包含ALL三个字符的员工信息

    select ename from emp where ename like '%ALL%';

    B,名字的第二个字母是A的员工信息

    select ename from emp where ename like '_A%';

    C,匹配NALT和CALT

    select ename from emp WHERE FirstName LIKE '[NC]ALT';

    D,如果通配符在匹配字段中,需要转义

    select ename from emp where ename like '%\%%' escape '\';

    6,case 作用大大滴

    select case when c.claim_status='FIN' and c.CHECK_OUT_FLAG=0 then '1' else '0' end as isFinishe
    select class count(case when sex='' then 1 end) from testtable group by class

    7,TO_CHAR函数

    作用:把日期或数字转换为字符串

    TO_CHAR(number, '格式')
    TO_CHAR(salary,’$99,999.99’)

    百度百科

    8,ROUND函数

    number  需要进行四舍五入的数字。
    num_digits  指定的位数,按此位数进行四舍五入。

    注解:
    如果 num_digits 大于 0,则四舍五入到指定的小数位。
    如果 num_digits 等于 0,则四舍五入到最接近的整数。
    如果 num_digits 小于 0,则在小数点左侧进行四舍五入。

    9,EXISTS和IN

    EXISTS:验证是否返回数据。

    IN:确定给定的值是否与子查询或列表中的值相匹配.

    上面就是两者的真正区别了。

    看下下面的两句:

    select * from emp e where exists (select * from depo d where d.empno = e.empno and d.empno < 0005);
    select * from emp e where e.empno in (select d.empno from depo d where d.empno < 0005);

    10,and和or

    需要注意的是,有时候我们在where或having后面同时用and和or时需要注意优先级问题,and先于or的问题,所以一般需要这样写,才能达到你要的效果:

    select * from table where flag='1'and (x=1 or y=2 or z=3)

    对,使用括号来改变次序,变成你想要的逻辑。

    11,题目一个:

    student表(sn,name,sax)--学生表(sn表示学号)

    score表(sn,cn,score)--成绩表

    scourse表(cn,cname)--课程表(cn表示课程号)

    问题:查询选china和french两门课,china成绩高于french成绩的学生信息

    select student.sn, student.name, student.sax 
    from student where student.sn in
    (select sc1.sn from
      score sc1 right join   score sc2
      
    on sc1.sn=sc2.sn
       where sc1.cn = (select s1.cn from scourse where s1.cname='french')
        and s2.cn=(select s2.cn from scourse s2 where s2.cname = 'china')
        and sc1.score < sc2.score)

    写出你的sql吧。

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

    低头做事,抬头做人。

  • 相关阅读:
    深入解析MySQL分区(Partition)功能
    使用mysqlreplicate命令快速搭建 Mysql 主从复制
    MySQL优化/面试,看这一篇就够了
    Nginx+Keepalived高可用集群
    高并发核心技术
    Redis详解
    memcached 常用命令及使用说明
    MemCached详解
    音频和视频
    frameset 和iframe框架标签
  • 原文地址:https://www.cnblogs.com/killbug/p/2781510.html
Copyright © 2011-2022 走看看