过滤:条件查询
排序:order by
--查询10号部门的员工
select * from emp where deptno=10;
1.oracle严格区分大小写(mysql不区分)
--字符串大小写敏感
--查询名叫KING的员工select * from emp where ename ='KING';
select * from emp where ename='King';
2.日期格式敏感
--日期格式敏感
--查询入职日期是17-11月-81的员工select * from emp where hiredate='17-11月-81';
-- 错误写法 select * from emp where hiredate='1981-11-17'
报错:与字符串格式不匹配,说明是简单的字符串匹配,格式必须和系统设定的一样,否则就失败!
2.1修改日期格式
--修改日期格式
-- 查询数据字典 select * from v$nls_parameters;
修改日期格式
alter system set NLS_DATE_FORMAT='yyyy-mm-dd'; --system 整个系统有效 系统管理员才有资格 alter session set NLS_DATE_FORMAT='yyyy-mm-dd'; --session当前会话有效 scott有资格
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
此时上面的错误写法正确了,相应的正确写法'17-11月-81'就会出错,也即是符合系统设定的才是正确的
当前所有的日期类型都变了:
3.比较运算符
oracle比较运算符
操作符 | 含义 |
= | 等于(不是==) |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
<> | 不等于(也可以是!=) |
:= | 赋值 |
其他比较运算符
操作符 | 含义 |
between...and... | 在两个值之间(包含边界) |
in(set) | 等于值列表中的一个 |
like | 模糊查询 |
is null | 空值 |
--between and 在。。。。之间
--查询薪水1000~2000之间的员工select * from emp where sal between 1000 and 2000;
注意:
--between and: 1. 含有边界 2. 小值在前 大值在后
null值
1.null值永远不等于null 2.含有null值的表达式都是null
3.集合中有null,不能使用not in但可以使用in
-- 查不出任何结果 select * from emp where deptno not in (10,20,null); --ok select * from emp where deptno not in (10,20,null);
逻辑运算符:and or not
4.模糊查询
%:可以匹配任意长度的内容
"_":可以匹配一个长度的内容
where子句解析顺序: 从右往左
where condition1 and condition2
where condition2 and condition1
oracle里两条sql子句完全不同只是运行结果相同罢了
对于上面两天语句,若右边条件为假,左边的语句就不会执行了.所以写代码时尽量将可能为假的条件放到后面学习方向:sql执行计划
5.排序
空值排序:
select * from emp order by comm;
默认升序没问题
但是降序有问题
select * from emp order by comm desc;
解决方法:
select * from emp order by comm desc nulls last; --nulls last 如果有空值 所有空值都在最后
分析原因:oracle中空值最大