过滤:条件查询

排序:order by

 

--查询10号部门的员工

select *   from emp   where deptno=10;

oracle 2 过滤和排序_升序

 

1.oracle严格区分大小写(mysql不区分)

 --字符串大小写敏感
 --查询名叫KING的员工

select * from emp where ename ='KING';

oracle 2 过滤和排序_日期格式_02

select * from emp where ename='King';

oracle 2 过滤和排序_升序_03

 

2.日期格式敏感

--日期格式敏感
--查询入职日期是17-11月-81的员工

select * from emp where hiredate='17-11月-81';

oracle 2 过滤和排序_日期格式_04

-- 错误写法 select * from emp where hiredate='1981-11-17'

oracle 2 过滤和排序_升序_05

报错:与字符串格式不匹配,说明是简单的字符串匹配,格式必须和系统设定的一样,否则就失败!

 

2.1修改日期格式

--修改日期格式

-- 查询数据字典 select * from v$nls_parameters;

oracle 2 过滤和排序_升序_06

修改日期格式

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';

oracle 2 过滤和排序_日期格式_07

此时上面的错误写法正确了,相应的正确写法'17-11月-81'就会出错,也即是符合系统设定的才是正确的

oracle 2 过滤和排序_升序_08

 

当前所有的日期类型都变了:

 

 

oracle 2 过滤和排序_日期格式_09

 

 

3.比较运算符

oracle比较运算符

操作符

含义

=

等于(不是==)

>

大于

>=

大于等于

<

小于

<=

小于等于

<>

 不等于(也可以是!=)

:=

赋值

oracle 2 过滤和排序_升序_10

其他比较运算符

操作符

含义

between...and...

在两个值之间(包含边界)

in(set)

等于值列表中的一个

like

模糊查询

is null

空值

--between  and 在。。。。之间
--查询薪水1000~2000之间的员工

select * from emp where sal between 1000 and 2000;

oracle 2 过滤和排序_日期格式_11

注意:

--between  and: 1. 含有边界  2. 小值在前 大值在后

oracle 2 过滤和排序_oracle_12

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

 

oracle 2 过滤和排序_oracle_13

4.模糊查询

%:可以匹配任意长度的内容
"_":可以匹配一个长度的内容

--查询名字以S开头的员工
--注意字符串用'' 而不是 ""
select * from emp where ename like 'S%';

--查询名字是四个字的员工
select * from emp where ename like '____';

-- 查询名字中含有下划线的员工
select * from emp where ename like '%_%';
-- select * from emp where ename like '%_%'; 错误写法
-- 主动声明转移字符
select * from emp where ename like '%\_%' escape '\';
--附加 可以回滚刚才的插入操作
rollback;

 

 

where子句解析顺序: 从右往左
    where condition1 and condition2  
    where condition2 and condition1
oracle里两条sql子句完全不同只是运行结果相同罢了
对于上面两天语句,若右边条件为假,左边的语句就不会执行了.所以写代码时尽量将可能为假的条件放到后面

学习方向:sql执行计划

 

5.排序

--查询员工信息,按月薪升序排序
--order by 列
select * from emp order by sal;

--查询员工信息,按年薪升序排序
--order by 表达式
select empno,ename,sal,sal*12 年薪 from emp order by sal*12 desc;

--查询员工信息,按年薪升序排序
--order by (select后查询列的)序号
select empno,ename,sal,sal*12 年薪 from emp order by 4 desc;

--多个列排序 order by作用于后面所有列 最靠近的一级排序 其次二级三级
select * from emp order by deptno,sal;

--多个列排序 desc仅作用于前面一个 下面两句执行结果不同
select * from emp order by deptno,sal desc;
select * from emp order by deptno desc,sal desc;

空值排序:

select * from emp order by comm;

默认升序没问题

oracle 2 过滤和排序_oracle_14

但是降序有问题

select * from emp order by comm desc;

oracle 2 过滤和排序_oracle_15

解决方法:

select * from emp order by comm desc nulls last; --nulls last 如果有空值 所有空值都在最后

oracle 2 过滤和排序_日期格式_16

分析原因:oracle中空值最大