Oracle_过滤和排序

where条件过滤

  • where
select * from emp where comm = 10; //从表emp中过滤comm列数据等于10的数据
select * from emp where ename = 'KING'; //过滤出ename列为KING的数据,注意这里KING因为是数据库数据,其大小写敏感
  • 系统日期:
select * from emp where hiredate = '17-11月-81'; //日期也是字符串,用单引号。
//注意,系统的日期格式是固定的,过滤时必须与其格式相同。
select sysdate from dual; //查询系统当前日期(注意其格式)
select * from v$nls_parameters; //获取系统当前日期格式,其中NLS_DATE_FORMAT即为系统日期格式(v$nls_parameters是一个数据字典,类似tab)
alter session set NLS_DATE_FORMAT='yyyy-mm-dd'; //修改系统日期格式为yyyy-mm-dd
alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'; //带时间的日期
alter session set NLS_DATE_FORMAT='DD-MON-RR'; //改回系统默认格式

注意:

  1. 字符和日期要包含在单引号中,当作字符串看待
  2. 字符大小写敏感,日期格式敏感
  • 比较运算:
select * from emp where sal != 1000;
select * from emp where sal <> 1000;
//上述两句作用相同,选出表emp中sal列数据不等于1000的数据
  1. 范围筛选:
select * from emp where sal>= 1000 and sal <= 2000;
select * from emp where sal between 1000 and 2000;
//上述两句作用相同

注意:BETWEEN AND语句中小值在前大值在后

select * from emp where hiredate between '1-2月-81' and '28-2月-82'
select * from emp where hiredate >= '1-2月-81' and hiredate <= '28-2月-82'
//上述两句作用相同
  1. IN:在集合中(相对应地,NOT IN可查询不在集合中的数据)
select * from emp where deptno in (10, 20);
select * from emp where deptno = 10 or deptno = 20;
//上述两句作用相同

注意:
如果在NOT IN后跟的集合中有NULL,会出错,而对于IN则不会出错。(为什么?)

select * from emp where deptno not in (10,20,NULL); //会出错
  1. like:模糊查询
    借助通配符来完成:%匹配任意多个字符,_匹配一个字符。
select * from emp where ename like '____'; //ename中是4个字符的数据
select * from emp where ename like 'M%'; //ename中以M开头的数据

注意:对特殊字符的转义

insert into emp(empno, ename, sal, deptno) values(1001, 'TOM_ABC', 3000, 10); //向表emp中插入一条数据
select * from emp where ename like '%\_%' escape '\'; //查询ename中带下划线的数据
//注意: 这里关键点是关键字escape,至于执行转义的符号,不一定非得是'\',只要是跟在escape后的字符均可
select * from emp where ename like '%R_%' escape 'R'; //作用同上句

对单引号字符本身的转义:

select 'hello''world' from dual; //使用两个单引号完成转义:hello'world
  • 逻辑运算:
    AND\OR\NOT:逻辑与、或、非
    注意:
    ...where statement1 and statement2;中,由于SQL在解析where时是从右向左解析的,因此:and时应将易假的表达式放在右侧,or时将易真的表达式放在右侧,这实际上是一个短路求值的问题。

order by排序

  • order by(默认升序:ascend)
select * from emp order by sal; //按sal数据排序
select * from emp order by sal*12; //无结果
//因为order by是根据前面查询出来的数据再依据后面跟的数据来排序,而前面的表中并没有sal*12这一列数据,应为:
select ename, sal, sal*12 from emp order by sal*12; //只要前面查询项中有这一列数据即可
select ename, sal, sal*12+nvl(comm, 0) 年收入 from emp order by 年收入 //根据定义出来的年收入来排序
select ename, sal, sal*12+nvl(comm, 0) from emp order by 1 //根据前面查询出来的三列数据中的第一列ename数据来排序

可以发现,order by后不仅可以跟表达式,还可以跟别名,还可以跟数字(这个数字表示序号)。
注意:若order by 后跟多个数据:

select * from emp order by deptno, sal;
//首先根据deptno排序,在deptno数据相同时再根据sal排序
//因此这和distinct的作用相同,作用于后面的所有数据
  • 逆序:后加desc(descend,即降序)
select * from emp order by deptno desc //根据deptno数据降序排列查询到的数据

若order by 后跟多个数据呢?遵循就近原则:

select * from emp order by deptno, sal desc //仅根据sal数据降序排列

如果作用于order by后跟的所有列呢?用多个desc:

select * from emp order by deptno desc, sal desc //先根据deptno数据降序排列,再根据sal数据降序排序

若根据comm列数据降序排列呢?因为表emp中的comm列并非每一条数据都有值,所以若要实现降序排列,则没有值的那些数据肯定要排在有值的后面:

select * from emp order by comm desc nulls last;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值