SQL> --查询部门为10号的员工
SQL> select *
2 from emp
3 where deptno=10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
SQL> --字符大小写敏感
SQL> select *
2 from emp
3 where ename='king';
未选定行
SQL> --正确书写
SQL> select *
2 from emp
3 where ename='KING';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
SQL> --日期敏感
SQL> --查询入职日期为 17-11月-81 的员工
SQL> select *
2 from emp
3 where hiredate='17-11月-81';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
SQL> --但是当我们改成1981-11-17会查询失败
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> --oracle的默认日期格式为:DD-MM-RR(17-11月-81),而1981-11-17不符合
SQL> --那么我们来修改一下,首先要获取到参数的配置
SQL> select * from v$nls_parameter
2 ;
select * from v$nls_parameter
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select *
2 from v$nls_parameters;
PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ¥
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
已选择19行。
SQL> --修改日期参数NLS_DATE_FORMAT
SQL> alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
会话已更改。
SQL> --然后再一次输入上面验证失败的例子
SQL> select *
2 from emp
3 where hiredate='1981-11-17';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- ---------- ----- ---------- ----------
7839 KING PRESIDENT 1981-11-17 5000 10
SQL> --如上,现在就成功了
SQL> --然后我们再把参数的取值改回去
SQL> alter session set NLS_DATE_FORMAT='DD-MON-RR';
会话已更改。
SQL> --上面的参数中,session代表用户范围,其中还有另外一个取值为global,这个取值要数据库管理员才能使用
SQL> --其中上面的v$nls_parameters也是数据字典
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> --关于between and
SQL> --表示范围在什么之间
SQL> --查询薪水在1000~2000之间的员工
SQL> select *
2 from emp
3 where sal between 1000 and 2000;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择6行。
SQL> --试一下大值在前,小值在后
SQL> ed
已写入 file afiedt.buf
1 select *
2 from emp
3* where sal between 2000 and 1000
SQL> /
未选定行
SQL> --如上所示,必须小值在前,大值在后
SQL>
SQL>
SQL>
SQL> --in 和not in表示是否存在于某一集合中
SQL> --查询部门为10和20的员工
SQL> select *
2 from emp
3 where deptno in (10,20);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择8行。
SQL> --如果我们需要找不在这个集合,就使用not in
SQL> ed
已写入 file afiedt.buf
1 select *
2 from emp
3* where deptno not in (10,20)
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
已选择6行。
SQL> --如上所示
SQL> host cls
SQL> --模糊查询: % _ 其中百分号表示任意长度的任意字符,_表示一个字符
SQL> --查询名字以s开头的员工
SQL> select *
2 from emp
3 where ename like 's%';
未选定行
SQL> --由于Oracle对大小写敏感,所以在查找名字的时候需要明确区分大小写
SQL> select *
2 from emp
3 where ename like 'S%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
SQL> --查询名字是3个字的员工
SQL> select *
2 from emp
3 where ename like '___';
未选定行
SQL> --查询名字为4个字的员工
SQL> select *
2 from emp
3 where ename like '____';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
SQL> --因为百分号和下划线在这里是特殊字符,如果我们有一个员工的名字中有下划线应该怎样寻找呢?
SQL> --首先我们先插入一条语句
SQL> insert into emp(empno,ename,sal,deptno)
2 values(1002,'ansel_pan',8888,10);
已创建 1 行。
SQL> --查找刚刚插入的语句,名字带有下划线
SQL> select *
2 from emp
3 where ename like '%_%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
1001 ansel 8888 10
1002 ansel_pa 8888 10
n
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择16行。
SQL> --在这里把所有记录都查找出来,可是我们只要找到名字带有下划线的记录
SQL> --所以在这里我们要用到转移
SQL> select *
2 from emp
3 where ename like '%\_%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
1002 ansel_pa 8888 10
n
SQL> --然后查找成
SQL> --如果想把刚刚插入的语句删除掉
SQL> rollback;
回退已完成。
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
SQL> --在逻辑运算符中,比如where 条件1 and/or 条件2 ,Oracle从右到左解析
SQL>
SQL> host cls
SQL> --整完了过滤,接下来就是排序
SQL> --那么按照月薪排序所有员工
SQL> select *
2 from emp
3 order by sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
已选择14行。
SQL> --从上面我们可以看到,Oracle默认的排序是升序
SQL> --那么如果这个时候我想让它降序排序,又不用从新输入怎么办?
SQL> --这时候要用到a命令,即append的简称
SQL> --注意:使用a命令的时候,要在a后面加上2个以上的空格,否则会追加失败
SQL> --使用a命令,追加指令
SQL> a desc
3* order by sal desc
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7369 SMITH CLERK 7902 17-12月-80 800 20
已选择14行。
SQL> --order by 后面可以跟列名,表达式,别名,序号
SQL> --order by后面跟表达式:
SQL> --查询员工的年薪,并升序排序
SQL> select empno,ename,sal,sal*12
2 from emp
3 order by sal*12;
EMPNO ENAME SAL SAL*12
---------- -------- ----- ----------
7369 SMITH 800 9600
7900 JAMES 950 11400
7876 ADAMS 1100 13200
7521 WARD 1250 15000
7654 MARTIN 1250 15000
7934 MILLER 1300 15600
7844 TURNER 1500 18000
7499 ALLEN 1600 19200
7782 CLARK 2450 29400
7698 BLAKE 2850 34200
7566 JONES 2975 35700
EMPNO ENAME SAL SAL*12
---------- -------- ----- ----------
7788 SCOTT 3000 36000
7902 FORD 3000 36000
7839 KING 5000 60000
已选择14行。
SQL> --order by 后面跟别名
SQL> select empno,ename,sal,sal*12 年薪
2 from emp
3 order by 年薪;
EMPNO ENAME SAL 年薪
---------- -------- ----- ----------
7369 SMITH 800 9600
7900 JAMES 950 11400
7876 ADAMS 1100 13200
7521 WARD 1250 15000
7654 MARTIN 1250 15000
7934 MILLER 1300 15600
7844 TURNER 1500 18000
7499 ALLEN 1600 19200
7782 CLARK 2450 29400
7698 BLAKE 2850 34200
7566 JONES 2975 35700
EMPNO ENAME SAL 年薪
---------- -------- ----- ----------
7788 SCOTT 3000 36000
7902 FORD 3000 36000
7839 KING 5000 60000
已选择14行。
SQL> --order by 后面跟序号,注意从1开始,如果超出范围也会查找失败
SQL> select empno,ename,sal,sal*12
2 from emp
3 order by 4;
EMPNO ENAME SAL SAL*12
---------- -------- ----- ----------
7369 SMITH 800 9600
7900 JAMES 950 11400
7876 ADAMS 1100 13200
7521 WARD 1250 15000
7654 MARTIN 1250 15000
7934 MILLER 1300 15600
7844 TURNER 1500 18000
7499 ALLEN 1600 19200
7782 CLARK 2450 29400
7698 BLAKE 2850 34200
7566 JONES 2975 35700
EMPNO ENAME SAL SAL*12
---------- -------- ----- ----------
7788 SCOTT 3000 36000
7902 FORD 3000 36000
7839 KING 5000 60000
已选择14行。
SQL> --order by 后面跟多列
SQL> select *
2 from emp
3 order by deptno,sal;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
已选择14行。
SQL> --order by后面跟多列的意思是 首先按照第一列进行排序,如果遇到两列相同的
SQL> --再按照第二列比较
SQL> --那么 如果我们order bY 后面跟有desc那么是按照什么来降序呢?
SQL> a desc
3* order by deptno,sal desc
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7839 KING PRESIDENT 17-11月-81 5000 10
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7900 JAMES CLERK 7698 03-12月-81 950 30
已选择14行。
SQL> --从上面我们可以看到,部门编号没有改变,大师同一个部门里面的薪水是降序的,
SQL> --又因为在order bY语句中,我们的desc跟sal最近,所以desc是作用与与它最近的列
SQL> set pagesize=20;
SP2-0268: pagesize 选项的编号无效
SQL> set pagesize='20';
SP2-0268: pagesize 选项的编号无效
SQL> --上面的例子无效
SQL> --按照奖金降序排序
SQL> select *
2 from emp
3 order by comm desc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
已选择14行。
SQL> --从上面我们可以看到,上面的奖金都是null的,那么如何避免这种情况,让值为null的员工排在下面呢?
SQL> ed
已写入 file afiedt.buf
1 select *
2 from emp
3 order by comm desc
4* nulls last
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- -------------- ----- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
已选择14行。
SQL> --如上所示,只要我们在后面加上一句话 nulls last 这里的null值的员工不止一个,所以用复数形式
SQL> spool off
过滤和排序
最新推荐文章于 2022-04-16 18:54:17 发布