过滤和排序
一、过滤
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值最大