Oracle:过滤和排序数据

时间:2021-03-27 08:18:07

--查询部门号是10的员工

Select * from emp where deptno=10;

--日期格式敏感,查询入职日期为17-11-81的员工,可以查询出结果

Select * from emp where hiredate=’17-11月-81’

--如果查询1981-11-17,会报错,报文字与格式字符串不匹配

/*

--默认日期格式:DD-MON-RR,这个格式是Oracle9i之后的格式,9i之前是DD-MON-YY。有什么区别呢?

--因为9i数据库的版本跨越了2000年,2000年有一个特别著名的问题,就是千年虫问题。什么是千年虫问题呢?

--19982098年,用YY表示的话,1998982098还是98区分不开,这就千年虫问题。RR虽然还是两位,但

--是他的内部算法将他们区分开了。

*/

--通过查询系统日期可以知道当前日期格式:

Select sysdate from dual;

--专业的做法是查询参数设置:

Select * from v$nls_parameters;

--修改日期格式,如果是session就是修改当前会话的格式,只在当前会话中有效,如果是global就是修改全局变量,

--global只有系统管理员才可以修改。如果数据库字段定义为日期格式,要查询这个字段,就需要使用规定的日期格

--式来查询。

Alter session set NLS_DATE_FORMAT=’yyyy-mm-dd’;

--赋值时要使用 :=来赋值。用于plSQL中,plSQL是一种程序语言,例如:Java中的 int a=0;Oracle中的

--a number := 0;是等价的。

--比较运算符:=(不是==),>,>=,<,<=,<>(不等于,也可以是!=)

--其他比较运算符:BETWEEN… AND … (在两个值之间),IN(set)(等于值列表中的一个),LIKE (模糊查询),IS NULL(空值)

--between … and … 查询薪水在1000-2000之间的员工,(小的值在前,大值在后)

Select * from emp where sal between 1000and 2000;

--in 在这个集合中,查询部门号是10 20 的员工

Select * from emp where deptno in (10,20);

--not in 不在集合中

Select * from emp where deptno not in(10,20);

--null值的注意:如果在集合中,含有null,不能使用not in,但是可以使用in

--like模糊查询:符号有: % _ ,例如查询名字以s开头的员工

Select * from emp where ename like ‘s%’;

--关于下划线:选择名字中有_的员工,如果按下面的语句查询,会得到所有的记录,为什么呢?

--在模糊查询当中,% _有特殊的含义,所以要转义字符,需要用escape声明一个转义字符。

Select * from emp where ename like ‘%_%’;

--使用了转义字符的语句

Select * from emp where ename like ‘%\_%’escape ‘\’;

--不使用delete语句删除一条数据。可以使用rollback,来回滚刚才的操作。

--我们没有开启事务,如何进行回滚操作呢?Oracle是默认自动开启事务的。只要事务没有提交,都可以回滚。

--逻辑运算符:ANDNOT OR

 

--使用ORDERBY字句排序。ADC升序(默认)DESC降序。注意ORDERBYSelect语句的结尾。

--查询员工信息,按照月薪排序

Select * from emp order by sal;

--注意:orderby后面可以跟  列,表达式,别名,序号

--按照年薪排序

Select ename,sal,sal*12 from emp order bysal*12 desc;

--别名

Select ename,sal,sal*12 年薪 from emporder by 年薪 desc;

--序号,select后面的列号,第三列是sal*12年薪,列号必须存在,

Select ename,sal,sal*12 年薪 from emporder by 3 desc;

 

--order by + 多个列,先按照部门号排序,部门号相同,再按照薪水排序。Order by作用于后面的所有的列。

Select * from emp order by deptno,sal;

--desc 只作用于离他最近的列。按照部门升序排序,部门号相同,再按照sal降序排序

Select * from emp order by deptno,sal desc;

--如果想让两个列同时降序排序,需要将两个列中都加上desc限制符。

Select * from emp order by deptno desc,saldesc;

 

--排序问题:查询员工,按照奖金倒序排序。奖金中有null值,null值都排到了前面,我们希望的是将Null值排到

--后面,这样才符合人们的习惯。

Select* from emp order by comm desc;

Oracle:过滤和排序数据

--如何解决呢?排序的时候,如果有null,如何将null排到最后?在排序后面加上 nulls last即可。

Select* from emp order by comm desc nulls last;

Oracle:过滤和排序数据