oracle--过滤和排序

过滤和排序

一、过滤

where子句

使用where子句,将不满足条件的行过滤掉
 --查询10号部门的员工:
 select * from emp where deptno=10;

字符和日期

字符和日期要包含在单引号中。
字符大小写敏感,日期格式敏感
默认的日期格式是DD-MON-RR

--查询入职日期是17-11月-81的员工
select * from emp where hiredate='17-11月-81';

查看日期格式:
select * from v$nls_parameters;

修改日期格式:
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
session:只在当前的会话中有效,退出就无效了
system:全局有效

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

比较运算:

oracle--过滤和排序_第1张图片
比较运算.PNG
oracle--过滤和排序_第2张图片
其他比较运算.PNG

赋值使用: := 符号

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

--查询薪水1000~2000之间的员工
select * from emp where sal between 1000 and 2000;

--in 在集合中

--查询10和20号部门的员工
select * from emp where deptno in(10,20);
--查询不是10和20号部门的员工
select * from emp where deptno not in(10,20);

 --null 值 
3. 如果集合中含有null,不能使用not in; 但可以使用in

select * from emp where deptno not in (10,20,null); 错误
select * from emp where deptno in(10,20,null);正确

模糊查询:

 --like 模糊查询
%:任意长度的任意字符串
_:任意的一个字符

--查询名字以S开头的员工
select * from emp where ename like 'S%';
--查询名字是4个字的员工
select * from emp where ename like '____';

转义字符:

--查询名字中含有下划线的员工
select * from emp where ename like '%_%';
_需要转义:使用escape '\'(声明\为转义字符)

select * from emp where ename like '%\_%' escape '\';

事务:

--Oracle是自动开启事务
使用rollback;直接回滚事务:
rollback;
回退已完成。

逻辑运算:

oracle--过滤和排序_第3张图片
逻辑运算.PNG
where condition1 and condition2
where condition2 and condition1
以上两条sql语句执行结果相同,但是两条完全不一样的sql语句

--SQL 优化 2. where解析顺序: 右--》 左(从右往左)

所以在编写sql语句时,
使用and时:把假的写在右边
使用or时:把真的写在右边

优先级:

oracle--过滤和排序_第4张图片
优先级.PNG

使用括号改变优先级顺序

二、排序

order by子句
asc:升序
desc:降序
默认使用升序

--排序
--order by后面  + 列,表达式,别名,序号
列:
--查询员工信息 按照月薪排序(默认升序)
select * from emp order by sal;
降序:select * from emp order by sal desc;

表达式:如果表达式很长,可以使用别名
select empno,ename,sal,sal*12 from emp order by sal*12 desc;
使用别名:
select empno,ename,sal,sal*12 年薪 from emp order by 年薪 desc;
使用数字代替:
年薪位于第四列:
select empno,ename,sal,sal*12 年薪 from emp order by 4 desc;

多个列排序:

先按第一个升序,第一个相同,再按第二个升序
先按部门号升序排列,部门号相同的,再按工资升序排列
select * from emp order by deptno,sal;

使用降序,只作用于离它最近的那一列:
select * from emp order by deptno,sal desc;
只作用于sal列,deptno依旧是升序。

要作用于两个列,都加上desc:
select * from emp order by deptno desc,sal desc;

排序的规则:

  1. 可以按照select语句中的列名排序
  2. 可以按照别名列名排序
  3. 可以按照select语句中的列名的顺序值排序
  4. 如果要按照多列进行排序,则规则是先按第一列排序,如果相同,则按照第二列排序;以此类推

小结:
order by 作用于后面所有的列;desc只作用于离他最近的列

null的排序:

设置页面显示几条数据:set pagesize 20

--查询员工信息  按照奖金排序
select * from emp order by comm;

如果使用降序排列:
select * from emp order by comm desc;
结果会把null的排在了前面;
修改sql语句为:
select * from emp order by comm desc nulls last;

原因:在oracle中,null值最大

你可能感兴趣的:(oracle--过滤和排序)