oracle查询语句汇总与分类

您所在的位置:网站首页 sql分类汇总语句 oracle查询语句汇总与分类

oracle查询语句汇总与分类

#oracle查询语句汇总与分类| 来源: 网络整理| 查看: 265

查询语句实例,无结果集的

--对oracle 查询的学习 --select --from tble [where condition(s)] --[group by group_by_expression] --[order by column[desc|asc] ] --emp表 describe emp; select * from emp; --dept表 describe dept; select * from dept; --基本查询 select * from dept; select empno, ename, job from emp; --通过distinct删除重复值 select job from emp; select distinct job from emp; --distinct 限制的是后面所有列组合出现的重复值,这里是job和deptbo组合为键值的来判别不同 select distinct job, deptno from emp; --算术表达式 select empno, ename , sal ,sal*12 year_salary from emp; --别名的使用 select empno as id , ename name , sal "Salary" ,sal*12 "Annual Salary" from emp; --连接表达式 select ename || ' 的职位是 ' || job from emp; --处理null 如果不处理null,null+任意值还是等于null select ename , sal ,comm , sal+comm total_salary from emp; select ename , sal,comm, sal+nvl(comm,0) total_salary from emp; --对日历列的处理,默认的显示格式是DD-MON-RR==>两位日-月明-两位年 --可以使用to_char()对日期格式化 select ename , hiredate from emp; select ename ,to_char(hiredate,'YYYY-MM-DD') from emp; --to_date对字符串转化为date类,以方便比较日期大小 select ename, sal, hiredate from emp where hiredate>to_date('1982-01-01','YYYY-MM-DD'); --限制查询 -- where的使用 select ename , sal from emp where sal'01-1月-82'; select ename, sal, job from emp where sal between 1500 and 3000;--[1500,3000] 闭区间 --这里的集合使用的是括号; select ename, sal, job from emp where ename in ('FORD','SCOTT'); --名字中第二个字是A select ename, sal, job from emp where ename like '_A%'; --转义符,通过escape声明转义符,转义符可以是任意字符串 --insert into emp (empno,ename) values(5566,'JOHN_SMITH'); select ename, empno from emp where ename like'%\_%' escape'\'; --查询某个空值,如果使用comm==null会发现没有结果 select ename, sal, comm from emp where comm is null; --and or not select ename, sal, job from emp where sal>1000 and job ='CLERK'; --查询奖金非null的 select ename, sal, job from emp where comm is not null; --优先级 比较符>not>and>or select ename, sal, job from emp where job='SALESMAN' or sal>2000 and comm is not null; --order by asc desc null的值被默认为最大的 select ename, sal from emp order by sal asc; --使用union并集查询时如果列名不同则使用位置排序 select empno, ename, sal from emp order by 1; --多列排序 select empno, ename, job, sal from emp order by job asc, sal desc; --分组查询 select count(ename) num from emp ; --出现null的值的话不计算在内的 select avg(sal) avg_sal,sum(sal) sum_sal from emp; select max(sal) max_salaary, min(sal) min_salary from emp; --单列分组:查询按部分分组 select deptno,avg(sal) avg_salary, sum(sal), max(sal), min(sal) from emp group by deptno order by deptno; --多列分组:按部门和职位分组 select deptno, job, avg(sal) avg_salary, max(sal) max_salary from emp group by deptno, job order by deptno,job; --rollup()函数,按行小计,把分组计算后的结果,再根据行列统计每行的信息 select deptno, job, avg(sal) avg_salary from emp group by rollup(deptno,job); select deptno, job, avg(sal) avg_salary from emp group by cube(deptno,job); --cube()函数,对每行每列进行小计 CLERK MANAGER PRESIDENT ANALYST SALESMAN total 10 1300 2450 5000 2916 (1300+2450+5000)/3 20 950 2975 3000 2175 (950+2975+3000)/3 30 950 2850 1400 1566 (950+2850+1400)/3 1037 2758 5000 3000 1400 是总的表的平均值2073 --这里的2073不等于total的平均值,每个total可以这么理解total=(a+b+(c+d)/2+e)/4 (c+d)/2相当于两人在同一组中的平均值 -- a,b,c,d,e分别是员工的薪水,c和d是相同岗位和部门的员工,那么tatal就不是这五个员工薪水的平均值了; --having限制分组结果 select deptno, max(sal) max_sal from emp group by deptno having max(sal)>4000; --连接查询 --笛卡儿积:两个表直接相乘 select emp.ename, dept.dname from emp, dept; --等值连接 select emp.ename, emp.job,dept.dname, dept.loc from emp,dept where emp.deptno=dept.deptno; --自连接 通过别名虚拟成两个表 select e.empno, e.ename, manager.empno, manager.ename from emp e, emp manager where e.mgr = manager.empno; --内连接:返回满足条件的记录 外连接:还返回不满足条件的记录 select e.ename, d.dname from emp e inner join dept d on(e.deptno = d.deptno); --左连接 select e.ename, d.dname from emp e left join dept d on(e.deptno = d.deptno); --右连接 select e.ename, d.dname from emp e right join dept d on(e.deptno = d.deptno); --全连接: 不同于笛卡儿积,是左连接和右连接的并集 select e.ename, d.dname from emp e full join dept d on(e.deptno = d.deptno); --子查询 --单行单列子查询 select ename, job from emp where job=(select job from emp where ename='SCOTT'); --多行单列子查询 使用in,any(>any:b比其中一个大就ok),all (其中的所有数据都满足) -- 查询和salesman在同一个部门,却不是SALESMAN的职位 select ename, deptno from emp where deptno in(select deptno from emp where job='SALESMAN') and job !='SALESMAN'; -- 查询比salesman最低工资高的所有人信息 select ename, sal, deptno from emp where sal >any(select sal from emp where job='SALESMAN') and job!='SALESMAN'; --多行多列子查询 --查询和scott相同部门和职位的员工 select ename, job, deptno from emp where (job, deptno ) in (select job, deptno from emp where ename='SCOTT'); --行内视图:把子查询当视图 --查询薪水比本部门平均薪水高的员工 语句一使用子查询,语句二:使用视图 比较容易理解,先查询出每个部门的平均值,再用原语句和结果比较 select ename, sal, deptno from emp e where sal>(select avg(sal) from emp x where x.deptno = e.deptno) order by deptno; select ename, sal, deptno from emp e (select deptno, avg(sal) avg_sal from emp group by deptno) x where e.deptno = x.deptno and e.sal>x.avg_sal order by deptno; --exists语句 只要子查询语句有结果,那么这条主查询语句就有结果 获取有员工的部门信息 select deptno, dname, loc from dept where exists (select * from emp where emp.deptno = dept.deptno); --集合查询 select statement1 [union|union all|intersect|minus] select statemens2 并集 交集 差集 --职位是manager但是薪水低于2500 语句一使用交集,二使用差集 select ename, job, sal from emp where job='MANAGER' intersect select ename, job, sal from emp where sal2500;

 

上述所有查询语句的结果

SQL> @ d:\tempfile\oracle\input.txt; SQL> --对oracle 查询的学习 SQL> --select SQL> --from tble [where condition(s)] SQL> --[group by group_by_expression] SQL> --[order by column[desc|asc] ] SQL> SQL> --emp表 SQL> describe emp; 名称 是否为空? 类型 ----------------------------------------------------- -------- ------------------------------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) SQL> select * 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 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 5566 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> --dept表 SQL> describe dept; 名称 是否为空? 类型 ----------------------------------------------------- -------- ------------------------------------ DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 已用时间: 00: 00: 00.00 SQL> SQL> SQL> --基本查询 SQL> SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 已用时间: 00: 00: 00.00 SQL> SQL> select empno, ename, job from emp; EMPNO ENAME JOB ---------- ---------- --------- 7369 SMITH CLERK 7499 ALLEN SALESMAN 7521 WARD SALESMAN 7566 JONES MANAGER 7654 MARTIN SALESMAN 7698 BLAKE MANAGER 7782 CLARK MANAGER 7788 SCOTT ANALYST 7839 KING PRESIDENT 7844 TURNER SALESMAN 7876 ADAMS CLERK 7900 JAMES CLERK 7902 FORD ANALYST 7934 MILLER CLERK 5566 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> --通过distinct删除重复值 SQL> select job from emp; JOB --------- CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK 已选择15行。 已用时间: 00: 00: 00.00 SQL> select distinct from emp; select distinct from emp * 第 1 行出现错误: ORA-00936: 缺失表达式 已用时间: 00: 00: 00.00 SQL> SQL> --distinct 限制的是后面所有列组合出现的重复值,这里是job和deptbo组合为键值的来判别不同 SQL> select distinct job, deptno from emp; JOB DEPTNO --------- ---------- MANAGER 20 PRESIDENT 10 CLERK 10 SALESMAN 30 ANALYST 20 MANAGER 30 MANAGER 10 CLERK 30 CLERK 20 已选择10行。 已用时间: 00: 00: 00.00 SQL> SQL> --算术表达式 SQL> select empno, ename , sal ,sal*12 year_salary from emp; EMPNO ENAME SAL YEAR_SALARY ---------- ---------- ---------- ----------- 7369 SMITH 800 9600 7499 ALLEN 1600 19200 7521 WARD 1250 15000 7566 JONES 2975 35700 7654 MARTIN 1250 15000 7698 BLAKE 2850 34200 7782 CLARK 2450 29400 7788 SCOTT 3000 36000 7839 KING 5000 60000 7844 TURNER 1500 18000 7876 ADAMS 1100 13200 7900 JAMES 950 11400 7902 FORD 3000 36000 7934 MILLER 1300 15600 5566 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> --别名的使用 SQL> select empno as id , ename name , sal "Salary" ,sal*12 "Annual Salary" from emp; ID NAME Salary Annual Salary ---------- ---------- ---------- ------------- 7369 SMITH 800 9600 7499 ALLEN 1600 19200 7521 WARD 1250 15000 7566 JONES 2975 35700 7654 MARTIN 1250 15000 7698 BLAKE 2850 34200 7782 CLARK 2450 29400 7788 SCOTT 3000 36000 7839 KING 5000 60000 7844 TURNER 1500 18000 7876 ADAMS 1100 13200 7900 JAMES 950 11400 7902 FORD 3000 36000 7934 MILLER 1300 15600 5566 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> SQL> --连接表达式 SQL> select ename || ' 的职位是 ' || job from emp; ENAME||'的职位是'||JOB ------------------------------- SMITH 的职位是 CLERK ALLEN 的职位是 SALESMAN WARD 的职位是 SALESMAN JONES 的职位是 MANAGER MARTIN 的职位是 SALESMAN BLAKE 的职位是 MANAGER CLARK 的职位是 MANAGER SCOTT 的职位是 ANALYST KING 的职位是 PRESIDENT TURNER 的职位是 SALESMAN ADAMS 的职位是 CLERK JAMES 的职位是 CLERK FORD 的职位是 ANALYST MILLER 的职位是 CLERK JOHN_SMITH 的职位是 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> --处理null 如果不处理null,null+任意值还是等于null SQL> select ename , sal ,comm , sal+comm total_salary from emp; ENAME SAL COMM TOTAL_SALARY ---------- ---------- ---------- ------------ SMITH 800 ALLEN 1600 300 1900 WARD 1250 500 1750 JONES 2975 MARTIN 1250 1400 2650 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 TURNER 1500 0 1500 ADAMS 1100 JAMES 950 FORD 3000 MILLER 1300 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> select ename , sal,comm, sal+nvl(comm,0) total_salary from emp; ENAME SAL COMM TOTAL_SALARY ---------- ---------- ---------- ------------ SMITH 800 800 ALLEN 1600 300 1900 WARD 1250 500 1750 JONES 2975 2975 MARTIN 1250 1400 2650 BLAKE 2850 2850 CLARK 2450 2450 SCOTT 3000 3000 KING 5000 5000 TURNER 1500 0 1500 ADAMS 1100 1100 JAMES 950 950 FORD 3000 3000 MILLER 1300 1300 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> --对日历列的处理,默认的显示格式是DD-MON-RR==>两位日-月明-两位年 SQL> --可以使用to_char()对日期格式化 SQL> select ename , hiredate from emp; ENAME HIREDATE ---------- -------------- SMITH 17-12月-80 ALLEN 20-2月 -81 WARD 22-2月 -81 JONES 02-4月 -81 MARTIN 28-9月 -81 BLAKE 01-5月 -81 CLARK 09-6月 -81 SCOTT 19-4月 -87 KING 17-11月-81 TURNER 08-9月 -81 ADAMS 23-5月 -87 JAMES 03-12月-81 FORD 03-12月-81 MILLER 23-1月 -82 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> select ename ,to_char(hiredate,'YYYY-MM-DD') from emp; ENAME TO_CHAR(HI ---------- ---------- SMITH 1980-12-17 ALLEN 1981-02-20 WARD 1981-02-22 JONES 1981-04-02 MARTIN 1981-09-28 BLAKE 1981-05-01 CLARK 1981-06-09 SCOTT 1987-04-19 KING 1981-11-17 TURNER 1981-09-08 ADAMS 1987-05-23 JAMES 1981-12-03 FORD 1981-12-03 MILLER 1982-01-23 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> --to_date对字符串转化为date类,以方便比较日期大小 SQL> select ename, sal, hiredate from emp where hiredate>to_date('1982-01-01','YYYY-MM-DD'); ENAME SAL HIREDATE ---------- ---------- -------------- SCOTT 3000 19-4月 -87 ADAMS 1100 23-5月 -87 MILLER 1300 23-1月 -82 已用时间: 00: 00: 00.00 SQL> SQL> SQL> --限制查询 SQL> SQL> -- where的使用 SQL> select ename , sal from emp where sal SQL> select ename, job from emp where job ='SALESMAN'; ENAME JOB ---------- --------- ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN TURNER SALESMAN 已用时间: 00: 00: 00.00 SQL> SQL> --可以通过to_date()函数转换为date类型比较的 SQL> select ename, hiredate, job from emp where hiredate>'01-1月-82'; ENAME HIREDATE JOB ---------- -------------- --------- SCOTT 19-4月 -87 ANALYST ADAMS 23-5月 -87 CLERK MILLER 23-1月 -82 CLERK 已用时间: 00: 00: 00.00 SQL> SQL> select ename, sal, job from emp where sal between 1500 and 3000;--[1500,3000] 闭区间 2 SQL> --这里的集合使用的是括号; SQL> select ename, sal, job from emp where ename in ('FORD','SCOTT'); ENAME SAL JOB ---------- ---------- --------- SCOTT 3000 ANALYST FORD 3000 ANALYST 已用时间: 00: 00: 00.00 SQL> --名字中第二个字是A SQL> select ename, sal, job from emp where ename like '_A%'; ENAME SAL JOB ---------- ---------- --------- WARD 1250 SALESMAN MARTIN 1250 SALESMAN JAMES 950 CLERK 已用时间: 00: 00: 00.00 SQL> --转义符,通过escape声明转义符,转义符可以是任意字符串 SQL> --insert into emp (empno,ename) values(5566,'JOHN_SMITH'); SQL> select ename, empno from emp where ename like'%\_%' escape'\'; ENAME EMPNO ---------- ---------- JOHN_SMITH 5566 已用时间: 00: 00: 00.00 SQL> SQL> --查询某个空值,如果使用comm==null会发现没有结果 SQL> select ename, sal, comm from emp where comm is null; ENAME SAL COMM ---------- ---------- ---------- SMITH 800 JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 ADAMS 1100 JAMES 950 FORD 3000 MILLER 1300 JOHN_SMITH 已选择11行。 已用时间: 00: 00: 00.00 SQL> --and or not SQL> select ename, sal, job from emp where sal>1000 and job ='CLERK'; ENAME SAL JOB ---------- ---------- --------- ADAMS 1100 CLERK MILLER 1300 CLERK 已用时间: 00: 00: 00.00 SQL> --查询奖金非null的 SQL> select ename, sal, job from emp where comm is not null; ENAME SAL JOB ---------- ---------- --------- ALLEN 1600 SALESMAN WARD 1250 SALESMAN MARTIN 1250 SALESMAN TURNER 1500 SALESMAN 已用时间: 00: 00: 00.00 SQL> --优先级 比较符>not>and>or SQL> select ename, sal, job from emp where job='SALESMAN' or sal>2000 and comm is not null; ENAME SAL JOB ---------- ---------- --------- ALLEN 1600 SALESMAN WARD 1250 SALESMAN MARTIN 1250 SALESMAN TURNER 1500 SALESMAN 已用时间: 00: 00: 00.00 SQL> SQL> --order by asc desc null的值被默认为最大的 SQL> select ename, sal from emp order by sal asc; ENAME SAL ---------- ---------- SMITH 800 JAMES 950 ADAMS 1100 WARD 1250 MARTIN 1250 MILLER 1300 TURNER 1500 ALLEN 1600 CLARK 2450 BLAKE 2850 JONES 2975 FORD 3000 SCOTT 3000 KING 5000 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> --使用union并集查询时如果列名不同则使用位置排序 SQL> select empno, ename, sal from emp order by 1; EMPNO ENAME SAL ---------- ---------- ---------- 5566 JOHN_SMITH 7369 SMITH 800 7499 ALLEN 1600 7521 WARD 1250 7566 JONES 2975 7654 MARTIN 1250 7698 BLAKE 2850 7782 CLARK 2450 7788 SCOTT 3000 7839 KING 5000 7844 TURNER 1500 7876 ADAMS 1100 7900 JAMES 950 7902 FORD 3000 7934 MILLER 1300 已选择15行。 已用时间: 00: 00: 00.00 SQL> --多列排序 SQL> select empno, ename, job, sal from emp order by job asc, sal desc; EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7902 FORD ANALYST 3000 7788 SCOTT ANALYST 3000 7934 MILLER CLERK 1300 7876 ADAMS CLERK 1100 7900 JAMES CLERK 950 7369 SMITH CLERK 800 7566 JONES MANAGER 2975 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 7839 KING PRESIDENT 5000 7499 ALLEN SALESMAN 1600 7844 TURNER SALESMAN 1500 7521 WARD SALESMAN 1250 7654 MARTIN SALESMAN 1250 5566 JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> SQL> SQL> --分组查询 SQL> select count(ename) num from emp ; NUM ---------- 15 已用时间: 00: 00: 00.00 SQL> --出现null的值的话不计算在内的 SQL> select avg(sal) avg_sal,sum(sal) sum_sal from emp; AVG_SAL SUM_SAL ---------- ---------- 2073.21429 29025 已用时间: 00: 00: 00.00 SQL> select max(sal) max_salaary, min(sal) min_salary from emp; MAX_SALAARY MIN_SALARY ----------- ---------- 5000 800 已用时间: 00: 00: 00.00 SQL> --单列分组:查询按部分分组 SQL> select deptno,avg(sal) avg_salary, sum(sal), max(sal), min(sal) from emp group by deptno order by deptno; DEPTNO AVG_SALARY SUM(SAL) MAX(SAL) MIN(SAL) ---------- ---------- ---------- ---------- ---------- 10 2916.66667 8750 5000 1300 20 2175 10875 3000 800 30 1566.66667 9400 2850 950 已用时间: 00: 00: 00.00 SQL> --多列分组:按部门和职位分组 SQL> select deptno, job, avg(sal) avg_salary, max(sal) max_salary from emp group by deptno, job order by deptno,job; DEPTNO JOB AVG_SALARY MAX_SALARY ---------- --------- ---------- ---------- 10 CLERK 1300 1300 10 MANAGER 2450 2450 10 PRESIDENT 5000 5000 20 ANALYST 3000 3000 20 CLERK 950 1100 20 MANAGER 2975 2975 30 CLERK 950 950 30 MANAGER 2850 2850 30 SALESMAN 1400 1600 已选择10行。 已用时间: 00: 00: 00.00 SQL> --rollup()函数,按行小计,把分组计算后的结果,再根据行列统计每行的信息 SQL> select deptno, job, avg(sal) avg_salary from emp group by rollup(deptno,job); DEPTNO JOB AVG_SALARY ---------- --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 2916.66667 20 CLERK 950 20 ANALYST 3000 20 MANAGER 2975 20 2175 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1400 30 1566.66667 2073.21429 已选择15行。 已用时间: 00: 00: 00.00 SQL> select deptno, job, avg(sal) avg_salary from emp group by cube(deptno,job); DEPTNO JOB AVG_SALARY ---------- --------- ---------- 2073.21429 CLERK 1037.5 ANALYST 3000 MANAGER 2758.33333 SALESMAN 1400 PRESIDENT 5000 10 2916.66667 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 2175 20 CLERK 950 20 ANALYST 3000 20 MANAGER 2975 30 1566.66667 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1400 已选择21行。 已用时间: 00: 00: 00.00 SQL> --cube()函数,对每行每列进行小计 SQL> CLERK MANAGER PRESIDENT ANALYST SALESMAN total SP2-0734: 未知的命令开头 "CLERK MANA..." - 忽略了剩余的行。 SQL> 10 1300 2450 5000 2916 (1300+2450+5000)/3 SQL> 20 950 2975 3000 2175 (950+2975+3000)/3 SQL> 30 950 2850 1400 1566 (950+2850+1400)/3 SQL> 1037 2758 5000 3000 1400 是总的表的平均值2073 SQL> --这里的2073不等于total的平均值,每个total可以这么理解total=(a+b+(c+d)/2+e)/4 (c+d)/2相当于两人在同一组中的平均值 SQL> -- a,b,c,d,e分别是员工的薪水,c和d是相同岗位和部门的员工,那么tatal就不是这五个员工薪水的平均值了; SQL> SQL> --having限制分组结果 SQL> select deptno, max(sal) max_sal from emp group by deptno having max(sal)>4000; DEPTNO MAX_SAL ---------- ---------- 10 5000 已用时间: 00: 00: 00.00 SQL> SQL> SQL> SQL> --连接查询 SQL> SQL> --笛卡儿积:两个表直接相乘 SQL> select emp.ename, dept.dname from emp, dept; ENAME DNAME ---------- -------------- SMITH ACCOUNTING ALLEN ACCOUNTING WARD ACCOUNTING JONES ACCOUNTING MARTIN ACCOUNTING BLAKE ACCOUNTING CLARK ACCOUNTING SCOTT ACCOUNTING KING ACCOUNTING TURNER ACCOUNTING ADAMS ACCOUNTING JAMES ACCOUNTING FORD ACCOUNTING MILLER ACCOUNTING JOHN_SMITH ACCOUNTING SMITH RESEARCH ALLEN RESEARCH WARD RESEARCH JONES RESEARCH MARTIN RESEARCH BLAKE RESEARCH CLARK RESEARCH SCOTT RESEARCH KING RESEARCH TURNER RESEARCH ADAMS RESEARCH JAMES RESEARCH FORD RESEARCH MILLER RESEARCH JOHN_SMITH RESEARCH SMITH SALES ALLEN SALES WARD SALES JONES SALES MARTIN SALES BLAKE SALES CLARK SALES SCOTT SALES KING SALES TURNER SALES ADAMS SALES JAMES SALES FORD SALES MILLER SALES JOHN_SMITH SALES SMITH OPERATIONS ALLEN OPERATIONS WARD OPERATIONS JONES OPERATIONS MARTIN OPERATIONS BLAKE OPERATIONS CLARK OPERATIONS SCOTT OPERATIONS KING OPERATIONS TURNER OPERATIONS ADAMS OPERATIONS JAMES OPERATIONS FORD OPERATIONS MILLER OPERATIONS JOHN_SMITH OPERATIONS 已选择60行。 已用时间: 00: 00: 00.00 SQL> --等值连接 SQL> select emp.ename, emp.job,dept.dname, dept.loc from emp,dept where emp.deptno=dept.deptno; ENAME JOB DNAME LOC ---------- --------- -------------- ------------- CLARK MANAGER ACCOUNTING NEW YORK MILLER CLERK ACCOUNTING NEW YORK KING PRESIDENT ACCOUNTING NEW YORK JONES MANAGER RESEARCH DALLAS SMITH CLERK RESEARCH DALLAS SCOTT ANALYST RESEARCH DALLAS FORD ANALYST RESEARCH DALLAS ADAMS CLERK RESEARCH DALLAS WARD SALESMAN SALES CHICAGO TURNER SALESMAN SALES CHICAGO ALLEN SALESMAN SALES CHICAGO JAMES CLERK SALES CHICAGO MARTIN SALESMAN SALES CHICAGO BLAKE MANAGER SALES CHICAGO 已选择14行。 已用时间: 00: 00: 00.00 SQL> --自连接 通过别名虚拟成两个表 SQL> select e.empno, e.ename, manager.empno, manager.ename from emp e, emp manager where e.mgr = manager.empno; EMPNO ENAME EMPNO ENAME ---------- ---------- ---------- ---------- 7902 FORD 7566 JONES 7788 SCOTT 7566 JONES 7844 TURNER 7698 BLAKE 7499 ALLEN 7698 BLAKE 7521 WARD 7698 BLAKE 7900 JAMES 7698 BLAKE 7654 MARTIN 7698 BLAKE 7934 MILLER 7782 CLARK 7876 ADAMS 7788 SCOTT 7698 BLAKE 7839 KING 7566 JONES 7839 KING 7782 CLARK 7839 KING 7369 SMITH 7902 FORD 已选择13行。 已用时间: 00: 00: 00.00 SQL> --内连接:返回满足条件的记录 外连接:还返回不满足条件的记录 SQL> select e.ename, d.dname from emp e inner join dept d on(e.deptno = d.deptno); ENAME DNAME ---------- -------------- CLARK ACCOUNTING MILLER ACCOUNTING KING ACCOUNTING JONES RESEARCH SMITH RESEARCH SCOTT RESEARCH FORD RESEARCH ADAMS RESEARCH WARD SALES TURNER SALES ALLEN SALES JAMES SALES MARTIN SALES BLAKE SALES 已选择14行。 已用时间: 00: 00: 00.00 SQL> --左连接 SQL> select e.ename, d.dname from emp e left join dept d on(e.deptno = d.deptno); ENAME DNAME ---------- -------------- MILLER ACCOUNTING KING ACCOUNTING CLARK ACCOUNTING FORD RESEARCH ADAMS RESEARCH SCOTT RESEARCH JONES RESEARCH SMITH RESEARCH JAMES SALES TURNER SALES BLAKE SALES MARTIN SALES WARD SALES ALLEN SALES JOHN_SMITH 已选择15行。 已用时间: 00: 00: 00.00 SQL> --右连接 SQL> select e.ename, d.dname from emp e right join dept d on(e.deptno = d.deptno); ENAME DNAME ---------- -------------- CLARK ACCOUNTING MILLER ACCOUNTING KING ACCOUNTING JONES RESEARCH SMITH RESEARCH SCOTT RESEARCH FORD RESEARCH ADAMS RESEARCH WARD SALES TURNER SALES ALLEN SALES JAMES SALES MARTIN SALES BLAKE SALES OPERATIONS 已选择15行。 已用时间: 00: 00: 00.00 SQL> --全连接: 不同于笛卡儿积,是左连接和右连接的并集 SQL> select e.ename, d.dname from emp e full join dept d on(e.deptno = d.deptno); ENAME DNAME ---------- -------------- SMITH RESEARCH ALLEN SALES WARD SALES JONES RESEARCH MARTIN SALES BLAKE SALES CLARK ACCOUNTING SCOTT RESEARCH KING ACCOUNTING TURNER SALES ADAMS RESEARCH JAMES SALES FORD RESEARCH MILLER ACCOUNTING JOHN_SMITH OPERATIONS 已选择16行。 已用时间: 00: 00: 00.00 SQL> SQL> --子查询 SQL> --单行单列子查询 SQL> select ename, job from emp where job=(select job from emp where ename='SCOTT'); ENAME JOB ---------- --------- SCOTT ANALYST FORD ANALYST 已用时间: 00: 00: 00.00 SQL> --多行单列子查询 使用in,any(>any:b比其中一个大就ok),all (其中的所有数据都满足) SQL> -- 查询和salesman在同一个部门,却不是SALESMAN的职位 SQL> select ename, deptno from emp where deptno in(select deptno from emp where job='SALESMAN') and job !='SALESMAN'; ENAME DEPTNO ---------- ---------- JAMES 30 BLAKE 30 已用时间: 00: 00: 00.00 SQL> -- 查询比salesman最低工资高的所有人信息 SQL> select ename, sal, deptno from emp where sal >any(select sal from emp where job='SALESMAN') and job!='SALESMAN'; ENAME SAL DEPTNO ---------- ---------- ---------- KING 5000 10 SCOTT 3000 20 FORD 3000 20 JONES 2975 20 BLAKE 2850 30 CLARK 2450 10 MILLER 1300 10 已选择7行。 已用时间: 00: 00: 00.00 SQL> --多行多列子查询 SQL> --查询和scott相同部门和职位的员工 SQL> select ename, job, deptno from emp where (job, deptno ) in (select job, deptno from emp where ename='SCOTT'); ENAME JOB DEPTNO ---------- --------- ---------- FORD ANALYST 20 SCOTT ANALYST 20 已用时间: 00: 00: 00.00 SQL> --行内视图:把子查询当视图 SQL> --查询薪水比本部门平均薪水高的员工 语句一使用子查询,语句二:使用视图 比较容易理解,先查询出每个部门的平均值,再用原语句和结果比较 SQL> select ename, sal, deptno from emp e where sal>(select avg(sal) from emp x where x.deptno = e.deptno) order by deptno; ENAME SAL DEPTNO ---------- ---------- ---------- KING 5000 10 JONES 2975 20 SCOTT 3000 20 FORD 3000 20 ALLEN 1600 30 BLAKE 2850 30 已选择6行。 已用时间: 00: 00: 00.00 SQL> select ename, sal, deptno from emp e (select deptno, avg(sal) avg_sal from emp group by deptno) x 2 where e.deptno = x.deptno and e.sal>x.avg_sal order by deptno; select ename, sal, deptno from emp e (select deptno, avg(sal) avg_sal from emp group by deptno) x * 第 1 行出现错误: ORA-00933: SQL 命令未正确结束 已用时间: 00: 00: 00.00 SQL> SQL> --exists语句 只要子查询语句有结果,那么这条主查询语句就有结果 获取有员工的部门信息 SQL> select deptno, dname, loc from dept where exists (select * from emp where emp.deptno = dept.deptno); DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 已用时间: 00: 00: 00.00 SQL> SQL> --集合查询 select statement1 [union|union all|intersect|minus] select statemens2 并集 交集 差集 SQL> --职位是manager但是薪水低于2500 语句一使用交集,二使用差集 SQL> select ename, job, sal from emp where job='MANAGER' intersect select ename, job, sal from emp where sal select ename, job, sal from emp where job='MANAGER' minus select ename, job, sal from emp where sal>2500; ENAME JOB SAL ---------- --------- ---------- CLARK MANAGER 2450 已用时间: 00: 00: 00.00 SQL> SQL> spool off;

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3