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'; //改回系统默认格式
注意:
- 字符和日期要包含在单引号中,当作字符串看待
- 字符大小写敏感,日期格式敏感
- 比较运算:
select * from emp where sal != 1000;
select * from emp where sal <> 1000;
//上述两句作用相同,选出表emp中sal列数据不等于1000的数据
- 范围筛选:
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'
//上述两句作用相同
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); //会出错
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;