以下所有内容仅供个人记录,可能会有错误,恳请指正。
1.case when作为 很熟悉的一种类型判断语句
在orcale中的格式之一为:
case when condition1/expr1成立 then result1
when condition2/expr2成立 then result2
when condition3/expr3成立 then result3
.......
else default result(这里要注意 所有的result的数据类型都要相同,否则报错)
end
这只是 case when的格式,具体与查询语句连接的格式如下:
select table_cloumn/table* case ... end as(建议取别名) cloumn_newname from table_name where condition group by cloumn_name order by ;
2.关于日期转换问题
查询入职时间在1980年或1981年的员工信息
SELECT * FROM EMP WHERE '1980'=TO_CHAR(HIREDATE,'YYYY') OR '1981'=TO_CHAR(HIREATE,'YYYY');
TO_CHAR 中左边是字符串,右边也是字符串,左边是已有的字符串,肯定要加引号
左边是日期,如果右边一开始就加引号,那还要他转什么char?
而且tochar不会增加默认值,不需要补齐mm/dd
就算他有默认你也不能输入,因为前后参数要求一致,前面只有年后面就只写yyyy
查询入职时间在1980年1月1日到1981年12月31日之间的员工信息
SELECT * FROM EMP WHERE HIREDATE BETWEEN TO_DATE('1980','YYYY') AND TO_DATE('1981','YYYY');
同理左边是日期,右边肯定加引号,因为就是把字符串转日期,前后参数要求一致,前面只有年后面就只写yyyy
这里涉及到了两个方法 TO_CAHR和TO_DATE
TO_CHAR 是将日期转成字符
TO_DATE 是将字符转成日期
两者的作用,都可以使用等式匹配数值进行查询操作
需要注意的是 当to_date的格式不满足‘yyyy/mm/dd’时 会设置默认值的月和日,而to_char不会:
select to_date('1980','yyyy') from emp;
select to_char(hiredate,'yyyy') from emp;
这时我们看向第一题,如果使用to_date则会运行不出结果,原因是在判断=时,你以为只匹配年,实际该方法设置了默认值,所以导致没有结果。
而to_char则没有默认值,所以这时要使用to_char进行判断。
3.查询姓名中只有一个A字母的员工
select * from emp where ename like '%A%' and ename not like '%A%A%';
like的局限性,如果多一个A就要多加一次 not like 的判断,没有普适性。
4.查出10号部门的办事员(CLERK)和30号部门的经理(MANAGER)
常规的方法是利用逻辑运算符的判断顺序进行判断。
事实上也可以使用IN进行查询,但是需要用到整体思想。
select * from emp where (deptno,job) in ((10,'CLERK'),(30,'MANAGER')); 即可
5.escape 与 通配符
%\%% escape\ :转义%。
%\_% escape\:转义_。