过滤和排序

一、过滤

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

比较运算:

比较运算.PNG

其他比较运算.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;

回退已完成。

逻辑运算:

逻辑运算.PNG

where condition1 and condition2

where condition2 and condition1

以上两条sql语句执行结果相同,但是两条完全不一样的sql语句

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

所以在编写sql语句时,

使用and时:把假的写在右边

使用or时:把真的写在右边

优先级:

优先级.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;

排序的规则:

可以按照select语句中的列名排序

可以按照别名列名排序

可以按照select语句中的列名的顺序值排序

如果要按照多列进行排序,则规则是先按第一列排序,如果相同,则按照第二列排序;以此类推

小结:

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值最大