02、Oracle过滤和排序数据

1.1 【where 子句基本语法】



where 子句中的条件有许多形式, 只有表中符合这些条件的行才会返回。

where 子句中不可以使用列的别名。
如果条件列是数字型的, 可以直接写;
如果条件列是字符型的, 需要使用单引号;
如果条件列是日期型的, 要注意日期格式, 单引号。
需求: 查询 10号部门的员工姓名

-- 查询 10 号部门的员工姓名  
SCOTT@orcl>select deptno,ename from emp where deptno=10;


1.2 【字符串和日期】

  1. 字符串和日期要用单引号引起来。
  2. 字符串大小写敏感。(区分大小写)
SCOTT@orcl>select * from emp where job='clerk';

SCOTT@orcl>select * from emp where job='CLERK';


  1. 日期值对于日期的格式敏感。
    缺省的日期值格式: DD-MON-RR需求: 查询入职日期是 1980-12-17 的员工信息 .

    【补充知识】 转换函数 to_date (备注: hiredate 是 date 类型)
SCOTT@orcl>select * from emp where hiredate='17-DEC-80';

在这里插入图片描述

SCOTT@orcl>select * from emp where hiredate=to_date('
1980-12-17','yyyy-mm-dd');


1.2.1 【数据库默认日期格式】

注意用户为sysdba

SYS@orcl>select property_name,property_value
  2  from database_properties
  3  where property_name='NLS_DATE_FORMAT';


1.2.2 【当前会话默认日期格式】

注意用户为**scott**

SCOTT@orcl>select * from v$nls_parameters
  2  where parameter='NLS_DATE_FORMAT';


1.2.3 【修改当前会话日期格式】

SCOTT@orcl>alter session set nls_date_format ='yyyy-mm-dd hh24:mi:ss';
SCOTT@orcl>select sysdate from dual;


退出 sqlplus 重新登录后恢复默认


1.3 【比较操作符】

SCOTT@orcl>select * from emp where deptno = 10;
SCOTT@orcl>select * from emp where deptno <>10;
SCOTT@orcl>select * from emp where deptno!=10;



1.3.1 【空值的不等于比较】

【注意】 包含空值的列进行比较, 要对空值进行处理。
否则进行比较 空值默认为无限大
需求: 查询工资大于奖金的员工

-- 查询工资大于奖金的员工 
SCOTT@orcl>select * from emp where sal>comm;

SCOTT@orcl>select * from emp where sal>nvl(comm,0);


1.3.2 【where 子句中使用 rownum 伪列】

因为 ROWNUM 是对结果集加的一个伪列: 即先查到结果集之后再加上去的一个列
(说明: 先要有结果集)。 通俗的说 rownum 是对符合条件结果的序列号。 它总是从 1 开始排起的。
所以你选出的结果不可能没有 1, 而有其他大于 1 的值。where 子句中使用 rownum 伪列进行限定时, 使用<或<=, 使用>不返回行。

SCOTT@orcl>select rownum,deptno,dname from dept; 
SCOTT@orcl>select rownum,deptno,dname from dept where rownum=2;
SCOTT@orcl>select rownum,deptno,dname from dept where rownum>2;
SCOTT@orcl>select rownum,deptno,dname from dept where rownum<=2;


rownum<and 并用时, 是在另一个条件 and 基础上的 rownum<
也就是说先执行 and 后面的条件, 返回满足条件的数据, 然后再进行 rownum<

SCOTT@orcl>select rownum,ename,deptno from emp;

SCOTT@orcl>select rownum,ename,deptno from emp where rownum<2;

SCOTT@orcl>select rownum,ename,deptno from emp where deptno=10;

SCOTT@orcl>select rownum,ename,deptno from emp where rownum<2
  2  and deptno=10;


1.3.3 【范围】 (between and)

需求: 查询工资在 **800~1000 **范围内的员工。

-- 查询工资在 800~1000 范围内的员工。 
SCOTT@orcl>select * from emp where sal between 800 and 1000;
SCOTT@orcl>select * from emp where sal between 1000 and 800;


【注意】 **between and **同时包括上下限边界, 小值写在前; 否则不返回结果。

**between and **也可以处理字符、 日期类型。
between ‘a’ and ‘c’ 时, 包含’c’ 不包含’ca’、 **‘cb’**等等以 **c **字母开头的。【注意】 日期格式, 否则报错

SCOTT@orcl>select * from emp where hiredate between '09-08-21' and '01-02-14';

SCOTT@orcl>select * from emp where hiredate between '09-JUN-81' and '23-JAN-82'

SCOTT@orcl>select * from emp where ename between 'A' and 'C';


1.3.4 【列举 in】

可以使用 IN 操作符来检查一个值是否在值的列表中。

SCOTT@orcl>select empno,ename,sal,mgr from
  2  emp where mgr in(7902,7566,7788);

SCOTT@orcl>select empno,ename,sal,mgr from emp
  2  where mgr=7902 or mgr=7566 or mgr=7788;

下面查询使用 NOT IN 检索那些未被 IN 检索出来的行:

SCOTT@orcl>select * from emp where comm in(300,500); 
SCOTT@orcl>select * from emp where comm not in (300,500);


【注意】 如果列表中包含空值, 那么 NOT IN 返回 false。 下面这个查询可以说明这
一点 , 它不返回任何行, 因为列表中包含空值:

SCOTT@orcl>select * from emp where comm not in (300,500,null);


1.3.5 【模糊查询 like】


需求: 查询姓名中包含 **MI **的。

SCOTT@orcl>select * from emp where ename like '%MI%';


1.3.5.1【escape 转义】


创建测试表、 修改数据

SCOTT@orcl>create table emp1 as select * from emp;
SCOTT@orcl>update emp1 set ename='OCM_DBA' where empno=7788;
SCOTT@orcl>commit;

-- 查询
SCOTT@orcl>select * from emp1;

SCOTT@orcl>select * from emp1 where ename like '%_%';

【说明】
**_代表任一字符
转义符(
\ **、 $) 后的通配符失去通配功能, 变为普通字符

SCOTT@orcl>select * from emp1 where ename like '%\_%' escape '\';

SCOTT@orcl>select * from emp1 where ename like '%$_%' escape '$';


1.3.6 【空值比较 is null is not null】


空值和空值不能用**= **来判断例如: 未知数 x 和未知数 y , 都是未知值, 不能用=
需求: 查询奖金是空值(不是空值) 的员工信息

-- 查询奖金是空值(不是空值) 的员工信息 
SCOTT@orcl>select * from emp where comm is null;

SCOTT@orcl>select * from emp where comm is not null;


1.4 【逻辑运算符】


实现多个条件的组合, 逻辑操作符根据逻辑条件来限定行

1.4.1 【AND】


需求: 查询工资大于等于 **1100 **并且工作是 **CLERK **的员工信息

-- 查询工资大于等于 1100 并且工作是 CLERK 的员工信息 
SCOTT@orcl>select * from emp
  2  where sal >=1000  and  job='CLERK';


需求: 查询工资在 **800~1000 **范围内的员工。

-- 查询工资在 800~1000 范围内的员工。 
SCOTT@orcl>select * from emp where sal>=800 and sal <=1000;

-- 扩展
SCOTT@orcl>select * from emp where sal between 800 and 1000;


1.4.2 【OR】


需求: 查询工资大于 **1100 **或者工作是 **CLERK **的员工信息

-- 查询工资大于 1100 或者工作是 CLERK 的员工信息
SCOTT@orcl>select * from emp where sal >=1100 or job='CLERK';


需求:查询经理号是 **7902 **或者 **7566 **或者 **7788 **的员工

-- 查询经理号是 7902 或者 7566 或者 7788 的员工 
SCOTT@orcl>select empno,ename,sal,mgr from emp
  2  where mgr=7902 or mgr=7566 or mgr=7788;


1.4.3 【NOT】


需求:查询工作不是 CLERKMANAGER、 **ANALYST **的员工

-- 查询工作不是 CLERK、 MANAGER、 ANALYST 的员工 
SCOTT@orcl>select ename,job from emp
  2  where job not in ('CLERK','MANAGER','ANALYST');

SCOTT@orcl>select ename,job from emp 
  2  where job!='CLERK' and job!='MANAGER' and job!=upper('analyst');


1.5 【优先级规则】

需求:查询工作是 **SALESMAN **或者 **PRESIDENT **的员工中,工资大于 **1500 **的员工。

-- 查询工作是 SALESMAN 或者 PRESIDENT 的员工中,工资大于 1500 的员工。
SCOTT@orcl>select ename,job,sal from emp
  2  where job='SALESMAN' or job ='PRESIDENT' and sal>1500;

结果中出现 sal 小于 1500 的员工,不符合要求。

SCOTT@orcl>select ename,job,sal from emp
  2  where (job='SALESMAN' or job='PRESIDENT') and sal>1500;

SCOTT@orcl>select ename,job,sal from emp
  2  where job in('SALESMAN','PRESIDENT') and sal>1500;

1.6 【order by 子句: 排序】

【order by 子句】
desc 降序, asc 升序。
order by 列名, order by 别名, order by 列序号, order by 表达式

如果有 where 子句, order by 子句跟在 where 子句后面。**order by **子句是 **select **语句中最后一个子句。

1.7 【升序 asc】

默认是 **asc **升序:
数字升序:由低到高
日期升序:由早到晚
字符升序:按字母表顺序(区分大小写)

SCOTT@orcl>select * from emp order by sal;

1.8 【降序 desc】

SCOTT@orcl>select * from emp order by sal desc;


1.9 【按照列的别名排序】

SCOTT@orcl>select ename,sal salary from emp order by salary;


如果列别名用双引号定义, **order by **排序时注意格式

SCOTT@orcl>select ename,sal "salary" from emp order by salary;
SCOTT@orcl>select ename,sal "salary" from emp order by "salary";


1.10 【按照列序号排序:位置排序】

列序号:列在 **select **子句中出现的位置

SCOTT@orcl>select empno,ename,deptno from emp order by 3,1;


1.11 【多个列排序:混合排序】

SCOTT@orcl>select * from emp order by deptno,sal desc;


1.12 【排序中的 null 值】

包含 null 值的列排序时, 默认把 null 值看做无限大:
在升序排序时, nulls last
在降序排序时, nulls first

SCOTT@orcl>select empno,ename,sal,comm from emp order by comm;


1.13 【order by 的部分限制】

  1. order by 后面不能跟 LOB、 LONG、 LONG ROW 类型的列。
  2. select 语句中有 distinct 关键字, order by 后面的列 必须出现在 select 子句中。
  3. order by 根据字符排序时,区分大小写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值