每天开心一点

SQL和PLSQL--过滤和排序

2024-07-29 14:05:00    六月    151    原创

SQL> host cls

SQL> --查询10号部门的员工

SQL> select *

  2  from emp

  3  where deptno=10;                                    

SQL> -- 字符串大小写敏感

SQL> --查询名叫KING的员工

SQL> select *

  2  from emp

  3  where ename='KING';

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where ename='King'

SQL> /

未选定行

SQL> --日期格式敏感

SQL> --查询入职日期是17-11月-81的员工

SQL> select *

  2  from emp

  3  where hiredate='17-11月-81';

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where hiredate='1981-11-17'

SQL> /

where hiredate='1981-11-17'

              *

第 3 行出现错误: 

ORA-01861: 文字与格式字符串不匹配 

SQL> --修改日期格式

SQL> select * from v$nls_parameters;

SQL> set linesize 200

SQL> select * from v$nls_parameters;

SQL> alter session set NLS_DATE_FORMAT='yyyy-mm-dd'

会话已更改。

SQL> select *

  2  from emp

  3  where hiredate='1981-11-17';

SQL> select *

  2  from emp

  3  where hiredate='17-11月-81';

where hiredate='17-11月-81'

               *

第 3 行出现错误: 

ORA-01861: 文字与格式字符串不匹配 

SQL> alter session set NLS_DATE_FORMAT='DD-MON-RR';

SQL> host cls

SQL> --between and

SQL> --查询薪水1000~2000之间的员工

SQL> select *

  2  from emp

  3  where sal between 1000 and 2000;

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where sal between 2000 and 1000

SQL> /

SQL> --between and: 1. 包含边界  2. 小值在前 大值在后

SQL> --in在集合中

SQL> --查询10和20号部门的员工

SQL> select *

  2  from emp

  3  where deptno in (10,20);

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

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where deptno in (10,20,null)

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where deptno not in (10,20)

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where deptno not in (10,20,null)

SQL> /

SQL> host cls

SQL> --模糊查询

SQL> --  %  _

SQL> --查询名字以S打头的员工

SQL> select *

  2  from emp

  3  where ename like 'S%';                             

SQL> --查询名字是4个字的员工

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where ename like '____'

SQL> /  

SQL> host cls

SQL> insert into emp(empno,ename,sal,deptno) values(1001,'Tom_AB',3000,10);

SQL> select * from emp;

SQL> --查询名字中含有下划线的员工

SQL> select *

  2  from emp

  3  where  ename like '%_%';

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* where  ename like '%\_%' escape '\'

SQL> /

SQL> rollback;

SQL> select * from emp;

SQL> host cls

SQL> --SQL 原则2. where解析的顺序: 右  ---> 左

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

SQL> select *

  2  from emp

  3  order by sal;

SQL> --order by后面  +  列,表达式,别名,序号

SQL> select empno,ename,sal,sal*12

  2  from emp

  3  order by sal*12 desc;

SQL> ed

已写入 file afiedt.buf

  1  select empno,ename,sal,sal*12 年薪

  2  from emp

  3* order by 年薪 desc

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select empno,ename,sal,sal*12 年薪

  2  from emp

  3* order by 4 desc

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select empno,ename,sal,sal*12 年薪

  2  from emp

  3* order by 5 desc

SQL> /

order by 5 desc

         *

第 3 行出现错误: 

ORA-01785: ORDER BY 项必须是 SELECT-list 表达式的数目 

SQL> --多个列排序

SQL> select *

  2  from emp

  3  order by deptno,sal;

SQL> --a命令  append

SQL> a  desc

  3* order by d

SQL> --order by 作用于后面所有的列,desc只作用于离他最近的一列

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* order by deptno desc,sal desc

SQL> /

SQL> host cls

SQL> --查询员工信息,按照奖金排序

SQL> --null 4:null的排序

SQL> select *

  2  from emp

  3  order by comm;

SQL> set pagesize 20

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3* order by comm desc

SQL> /

SQL> ed

已写入 file afiedt.buf

  1  select *

  2  from emp

  3  order by comm desc

  4* nulls last

SQL> /

SQL> --Oracle中,null最大

SQL> spool off