查詢語句實例,無結果集的
--對oracle 查詢的學習 --select <*,column [alias],...> --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<2000; select ename, job from emp where job ='SALESMAN'; --可以通過to_date()函數轉換為date類型比較的 select ename, hiredate, job from emp where hiredate>'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 sal<2500; select ename, job, sal from emp where job='MANAGER' minus select ename, job, sal from emp where sal>2500;
上述所有查詢語句的結果
SQL> @ d:\tempfile\oracle\input.txt; SQL> --對oracle 查詢的學習 SQL> --select <*,column [alias],...> 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<2000; ENAME SAL ---------- ---------- SMITH 800 ALLEN 1600 WARD 1250 MARTIN 1250 TURNER 1500 ADAMS 1100 JAMES 950 MILLER 1300 已選擇8行。 已用時間: 00: 00: 00.00 SQL> 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<2500; ENAME JOB SAL ---------- --------- ---------- CLARK MANAGER 2450 已用時間: 00: 00: 00.00 SQL> 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;