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吧。

 

 

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

低头做事,抬头做人。

posted on 2012-11-21 21:12  每当变幻时  阅读(1695)  评论(0编辑  收藏  举报

导航