(case when a.medfee_sumamt > 0 then ‘1’ else ‘-1’ end )
处理NLUU值。select x+nvl(y,0) from emp;
instr(s1,s2[,i][,j])返回s2在s1中第j次出现的位置,从第i个字符开始。默认为1.
replace(s1,s2[,s3])使用s3替换在s1中的所有s2字符串。默认为空
substr(s,i[,j])从s的第i个位置截取长度为j的字符串
tochar(sysdate,‘yyyy-mm-dd’),将表达式转为字符串
wm_concat(name || amount || units) XXXX
in、any、all多行子查询
查询工资大于部门编号为30的所有员工工资的员工信息信息。selcet * from emp where sal >all (select sal from emp where deptno=30)
group by多个字段就是做多次聚合,先对B列做一个聚合,再对C列做一次。先对B列进行拆分,拆分成a,b两个,然后分别针对a和b进行拆分。
减少表的查询次数
用not exists代替 not in 。in后接枚举列表时可使用
oracle自下而上解析where字句。因此表连接必须写在其他where条件之前。那些能过滤掉最大数据记录的条件必须写在where字句的末尾,过滤掉的记录越多越好。
避免全表扫描,如带like并使用%
SQL JOIN 中 on 与 where 的区别

将含有别名列的查询放入内嵌视图,就可以在外层查询中引用别名列。为什么要这么做呢? WHERE 子句会比 SELECT 子句先执行,就最初那个失败的查询例子而言,当 WHERE 子句被执行时,SALARY 和 COMMISSION 尚不存在。直到 WHERE 子句执行完毕,那些别名列才会生效。然而,FROM 子句会先于 WHERE 子句执行。如果把最初的那个查询放入一个 FROM 子句,其查询结果会在最外层的 WHERE 子句开始之前产生,这样一来,最外层的 WHERE 子句就能“看见”别名列了。当表里的某些列没有被恰当命名的时候,这个技巧尤其有用。











GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前

WHERE过滤行,而 HAVING 过滤分组。
另一种理解方法,WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。
使用 HAVING 时应该结合 GROUP BY 子句





