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吧。
------------------------------
低头做事,抬头做人。