SQL是关系数据库的基本操作语言,它是应用程序与数据库进行交互操作的接口,SQL语言包括数据查询语言(SELECT)、数据操纵语言(INSERT、UPDATE、DELETE)、事务控制语言(COMMIT、ROLLBACK、SAVEPOINT)、数据定义语言(CREATE、ALTER、DROP等)、数据控制语言(GRANT、REVOKE)等五个部分
基本查询语句
简单查询语句
在关系数据库中,查询数据是使用SELECT语句来完成的。当检索表数据时,既可以检索所有列的数据,也可以指定检索特定列的数据。检索特定列的数据必须要清楚表的结构,通过使用命令DESCRIBE(可以简写为DESC)显示表结构。如显示部门表dept的表结构:
SQL> DESC dept; Name Type Nullable Default Comments ------ ------------ -------- ------- -------- DEPTNO NUMBER(2) DNAME VARCHAR2(14) Y LOC VARCHAR2(13) Y
SQL> SELECT * FROM dept; DEPTNO DNAME LOC ------ -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
SQL> SELECT deptno, dname FROM dept; DEPTNO DNAME ------ -------------- 10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS
SQL> SELECT ename, TO_CHAR(hiredate, 'YYYY/MM/DD') FROM emp WHERE empno=7788; ENAME TO_CHAR(HIREDATE,'YYYY/MM/DD') ---------- ------------------------------ SCOTT 1987/04/19
SQL> SELECT DISTINCT deptno, job from emp; DEPTNO JOB ------ --------- 20 CLERK 30 SALESMAN 20 MANAGER 30 CLERK 10 PRESIDENT 30 MANAGER 10 CLERK 10 MANAGER 20 ANALYST 9 rows selected
SQL> SELECT sal*12 FROM emp WHERE ename='KING'; SAL*12 ---------- 60000
SQL> SELECT ename AS 姓名, sal*12 年收入 FROM emp WHERE ename='KING'; 姓名 年收入 ---------- ---------- KING 60000
SQL> SELECT ename, sal, comm, sal+comm FROM emp WHERE deptno=30; ENAME SAL COMM SAL+COMM ---------- --------- --------- ---------- ALLEN 1600.00 300.00 1900 WARD 1250.00 500.00 1750 MARTIN 1250.00 1400.00 2650 BLAKE 2850.00 TURNER 1500.00 0.00 1500 JAMES 950.00
SQL> SELECT ename, sal, comm, sal+NVL(comm, 0) 月收入 FROM emp WHERE deptno=30; ENAME SAL COMM 月收入 ---------- --------- --------- ---------- ALLEN 1600.00 300.00 1900 WARD 1250.00 500.00 1750 MARTIN 1250.00 1400.00 2650 BLAKE 2850.00 2850 TURNER 1500.00 0.00 1500 JAMES 950.00 950
SQL> SELECT ename, sal, comm, NVL2(comm, sal+comm, sal) 月收入 FROM emp WHERE deptno=30; ENAME SAL COMM 月收入 ---------- --------- --------- ---------- ALLEN 1600.00 300.00 1900 WARD 1250.00 500.00 1750 MARTIN 1250.00 1400.00 2650 BLAKE 2850.00 2850 TURNER 1500.00 0.00 1500 JAMES 950.00 950
SQL> SELECT ename ||' is a ' || job "Employee Detail" FROM emp WHERE deptno=10; Employee Detail ------------------------- CLARK is a MANAGER KING is a PRESIDENT MILLER is a CLERK
SQL> SELECT job, sal FROM emp WHERE ename='SCOTT'; JOB SAL --------- --------- CLERK 1500.00
SQL> SELECT job, sal FROM emp WHERE ename='scott'; JOB SAL --------- --------- SQL> SELECT job, sal FROM emp WHERE LOWER(ename)='scott'; JOB SAL --------- --------- CLERK 1500.00
SQL> SELECT ename, sal, hiredate FROM emp WHERE hiredate > '01-1月-82'; ENAME SAL HIREDATE ---------- --------- ----------- SCOTT 1500.00 1987/4/19 ADAMS 1100.00 1987/5/23 MILLER 1300.00 1982/1/23
SQL> SELECT ename, sal, hiredate FROM emp WHERE hiredate > TO_DATE('1982-01-01', 'YYYY-MM-DD'); ENAME SAL HIREDATE ---------- --------- ----------- SCOTT 1500.00 1987/4/19 ADAMS 1100.00 1987/5/23 MILLER 1300.00 1982/1/23
SQL> SELECT ename, sal FROM emp WHERE sal BETWEEN 1100 AND 1600; ENAME SAL ---------- --------- ALLEN 1600.00 WARD 1250.00 MARTIN 1250.00 SCOTT 1500.00 TURNER 1500.00 ADAMS 1100.00 MILLER 1300.00
SQL> SELECT ename FROM emp WHERE ename LIKE 'S%'; ENAME ---------- SMITH SCOTT
SQL> SELECT ename FROM emp WHERE ename LIKE '__A%'; ENAME ---------- BLAKE CLARK ADAMS
SQL> SELECT ename FROM emp WHERE ename LIKE '%/_%' ESCAPE '/'; ENAME ---------- FA_MALY
SQL> SELECT ename, sal FROM emp WHERE sal IN(1500, 1250); ENAME SAL ---------- --------- WARD 1250.00 MARTIN 1250.00 SCOTT 1500.00 TURNER 1500.00
SQL> SELECT ename 总裁 FROM emp WHERE mgr IS NULL; 总裁 ---------- KING
SQL> SELECT ename 总裁 FROM emp WHERE mgr=NULL; 总裁 ----------
SQL> SELECT ename, sal FROM emp WHERE deptno=20 AND job='CLERK'; ENAME SAL ---------- --------- SMITH 10.00 SCOTT 1500.00 ADAMS 1100.00
SQL> SELECT ename, sal FROM emp WHERE sal>2500 OR job='MANAGER'; ENAME SAL ---------- --------- FA_MALY 8000.00 JONES 2975.00 BLAKE 2850.00 CLARK 2450.00 KING 5000.00 FORD 3000.00
SQL> SELECT ename, comm FROM emp WHERE comm IS NOT NULL; ENAME COMM ---------- --------- FA_MALY 1000.00 ALLEN 300.00 WARD 500.00 MARTIN 1400.00 TURNER 0.00
SQL> SELECT ename, comm FROM emp WHERE deptno=30 ORDER BY comm; ENAME COMM ---------- --------- TURNER 0.00 ALLEN 300.00 WARD 500.00 MARTIN 1400.00 JAMES BLAKE
SQL> SELECT ename, comm FROM emp WHERE deptno=30 ORDER BY comm DESC; ENAME COMM ---------- --------- BLAKE JAMES MARTIN 1400.00 WARD 500.00 ALLEN 300.00 TURNER 0.00
SQL> SELECT ename, deptno, sal FROM emp ORDER BY deptno, sal DESC; ENAME DEPTNO SAL ---------- ------ --------- FA_MALY 10 8000.00 KING 10 5000.00 CLARK 10 2450.00 MILLER 10 1300.00 FORD 20 3000.00 JONES 20 2975.00 SCOTT 20 1500.00 ADAMS 20 1100.00 SMITH 20 10.00 BLAKE 30 2850.00 ALLEN 30 1600.00 TURNER 30 1500.00 WARD 30 1250.00 MARTIN 30 1250.00 JAMES 30 950.00
SQL> SELECT dname FROM dept ORDER BY deptno DESC; DNAME -------------- OPERATIONS SALES RESEARCH ACCOUNTING
SQL> SELECT deptno, ename, NVL2(comm, sal+comm, sal)*12 年收入 FROM emp WHERE deptno=30 ORDER BY 年收入 DESC; DEPTNO ENAME 年收入 ------ ---------- ---------- 30 BLAKE 34200 30 MARTIN 31800 30 ALLEN 22800 30 WARD 21000 30 TURNER 18000 30 JAMES 11400
SQL> SELECT deptno, ename FROM emp union SELECT deptno, dname FROM dept ORDER BY deptno; DEPTNO ENAME ------ -------------- 10 ACCOUNTING 10 CLARK 10 FA_MALY 10 KING 10 MILLER 20 ADAMS 20 FORD 20 JONES 20 RESEARCH 20 SCOTT 20 SMITH 30 ALLEN 30 BLAKE 30 JAMES 30 MARTIN 30 SALES 30 TURNER 30 WARD 40 OPERATIONS
SQL> SELECT deptno, dname FROM dept 2 UNION 3 SELECT empno, ename FROM emp 4 ORDER BY 1; DEPTNO DNAME ---------- -------------- 10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS 1314 FA_MALY 7369 SMITH 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER
SQL> CREATE table dept2 AS SELECT * FROM dept WHERE 1=2; Table created SQL> CREATE table emp2 AS SELECT * FROM emp WHERE 1=2; Table created
INSERT INTO dept2 VALUES('50', 'IT', 'BJ');
SQL> INSERT INTO emp2(empno, ename, job, mgr, hiredate) VALUES (1234, 'TT', 'C++工程师', 7788, '08-8月-2012');
SQL> INSERT INTO emp2(empno, ename, job, mgr, hiredate) VALUES (5678, 'TT', 'Web工程师', 8899, TO_DATE('2010/08/11', 'YYYY/MM/DD'));
SQL> CREATE table dept3 ( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13) DEFAULT 'BJ' 5 );
SQL> INSERT INTO dept3 VALUES(80, '经融', DEFAULT); 1 row inserted SQL> select * from dept3; DEPTNO DNAME LOC ------ -------------- ------------- 80 经融 BJ
SQL> INSERT INTO dept2(deptno, dname, loc) SELECT * FROM dept; 4 rows inserted
SQL> INSERT /* +APPEND */ INTO dept2(deptno, dname, loc) SELECT * FROM dept;
SQL> INSERT ALL 2 WHEN deptno=10 THEN INTO dept10 3 WHEN deptno=20 THEN INTO dept20 4 ELSE INTO others 5 SELECT * FROM emp; 15 rows inserted SQL> SELECT * FROM dept10; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 1314 FA_MALY CLERK 7788 2012/8/8 8000.00 1000.00 10 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7839 KING PRESIDENT 1981/11/17 5000.00 10 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 SQL> SELECT * FROM dept20; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 10.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7788 SCOTT CLERK 7566 1987/4/19 1500.00 20 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 SQL> SELECT * FROM others; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7900 JAMES CLERK 7698 1981/12/3 950.00 30 6 rows selected
SQL> INSERT FIRST 2 WHEN deptno=10 THEN INTO dept10 3 WHEN deptno=20 THEN INTO dept20 4 WHEN job='CLERK' THEN INTO clerk 5 ELSE INTO others 6 SELECT * FROM emp; 15 rows inserted SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 1314 FA_MALY CLERK 7788 2012/8/8 8000.00 1000.00 10 7369 SMITH CLERK 7902 1980/12/17 10.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT CLERK 7566 1987/4/19 1500.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 15 rows selected SQL> select * from dept10; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 1314 FA_MALY CLERK 7788 2012/8/8 8000.00 1000.00 10 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7839 KING PRESIDENT 1981/11/17 5000.00 10 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 SQL> select * from dept20; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 10.00 20 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7788 SCOTT CLERK 7566 1987/4/19 1500.00 20 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 SQL> select * from clerk 2 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7900 JAMES CLERK 7698 1981/12/3 950.00 30 SQL> select * from others; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
SQL> UPDATE emp SET sal=2460 WHERE ename='SCOTT';
SQL> UPDATE emp SET sal=sal-460, comm=500 WHERE ename='SCOTT';
UPDATE emp SET hiredate=TO_DATE('2012/08/01', 'YYYY/MM/DD') WHERE ename='SCOTT';
SQL> select * from dept3; DEPTNO DNAME LOC ------ -------------- ------------- 80 经融 BJ 90 产品研发 上海 SQL> desc dept3; Name Type Nullable Default Comments ------ ------------ -------- ------- -------- DEPTNO NUMBER(2) Y DNAME VARCHAR2(14) Y LOC VARCHAR2(13) Y 'BJ' SQL> UPDATE dept3 SET loc=DEFAULT WHERE deptno=90; 1 row updated SQL> SELECT * FROM dept3; DEPTNO DNAME LOC ------ -------------- ------------- 80 经融 BJ 90 产品研发 BJ
UPDATE emp SET (sal, comm, job) = (SELECT sal, comm, job FROM emp WHERE ename='SMITH') WHERE ename='SCOTT';
DELETE FROM emp WHERE ename='FA_MALY';
SQL> delete from dept2; 13 rows deleted
SQL> TRUNCATE TABLE others; Table truncated
create table newemp as select * from emp;
SQL> DELETE FROM newemp WHERE deptno=(SELECT deptno FROM dept WHERE dname='SALES'); 6 rows deleted
SQL> UPDATE newemp SET sal=sal*100 WHERE ename='SCOTT'; 1 row updated SQL> SELECT sal FROM newemp WHERE ename='SCOTT'; SAL --------- 1000.00
SQL> SELECT sal FROM newemp WHERE ename='SCOTT'; SAL ---------- 10
SQL> SELECT sal FROM newemp WHERE ename='SCOTT'; SAL ---------- 1000
SQL> savepoint a; Savepoint created SQL> exec dbms_transaction.savepoint('b'); PL/SQL procedure successfully completed
SQL> rollback to a;
SQL> exec dbms_transaction.rollback_savepoint('a'); PL/SQL procedure successfully completed
SQL> rollback;
SQL> exec dbms_transaction.rollback;
SQL> SET TRANSACTION READ ONLY; Transaction set SQL> UPDATE newemp SET sal=800 WHERE ename='SCOTT'; UPDATE newemp SET sal=800 WHERE ename='SCOTT' ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
SQL> UPDATE newemp SET sal=1234 WHERE ename='SCOTT'; 已更新 1 行。
SQL> SELECT sal FROM newemp WHERE ename='SCOTT'; SAL --------- 1000.00
SQL> SELECT max(sal), min(sal) FROM emp; MAX(SAL) MIN(SAL) ---------- ---------- 5000 10
SQL> SELECT avg(sal), sum(sal) FROM emp; AVG(SAL) SUM(SAL) ---------- ---------- 1803.21428 25245
SQL> SELECT count(*) FROM emp; COUNT(*) ---------- 14
SQL> SELECT count(comm) FROM emp; COUNT(COMM) ----------- 4
SQL> SELECT variance(sal), stddev(sal) FROM emp; VARIANCE(SAL) STDDEV(SAL) ------------- ----------- 1783936.95054 1335.641026
SQL> SELECT count(deptno) AS distinct_dept FROM emp; DISTINCT_DEPT ------------- 14 SQL> SELECT count(distinct deptno) AS distinct_dept FROM emp; DISTINCT_DEPT ------------- 3
SQL> SELECT deptno, max(sal), min(sal) FROM emp GROUP BY deptno ORDER BY deptno; DEPTNO MAX(SAL) MIN(SAL) ------ ---------- ---------- 10 5000 1300 20 3000 10 30 2850 950
SQL> SELECT deptno, job, max(sal), avg(sal) FROM emp GROUP BY deptno, job ORDER BY deptno; DEPTNO JOB MAX(SAL) AVG(SAL) ------ --------- ---------- ---------- 10 CLERK 1300 1300 10 MANAGER 2450 2450 10 PRESIDENT 5000 5000 20 ANALYST 3000 3000 20 CLERK 1100 373.333333 20 MANAGER 2975 2975 30 CLERK 950 950 30 MANAGER 2850 2850 30 SALESMAN 1600 1400
SQL> SELECT deptno, avg(sal), max(sal) FROM emp GROUP BY deptno HAVING avg(sal)<2000; DEPTNO AVG(SAL) MAX(SAL) ------ ---------- ---------- 30 1566.66666 2850 20 1419 3000
SQL> SELECT deptno, job FROM emp GROUP BY deptno; SELECT deptno, job FROM emp GROUP BY deptno ORA-00979: 不是 GROUP BY 表达式
SQL> SELECT deptno, job, avg(sal) FROM emp GROUP BY ROLLUP (deptno, job) ORDER BY deptno; DEPTNO JOB AVG(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 2916.66666 20 ANALYST 3000 20 CLERK 373.333333 20 MANAGER 2975 20 1419 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1400 30 1566.66666 1803.21428
SQL> SELECT deptno, job, avg(sal) FROM emp GROUP BY CUBE (deptno, job) ORDER BY deptno; DEPTNO JOB AVG(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 2916.66666 20 ANALYST 3000 20 CLERK 373.333333 20 MANAGER 2975 20 1419 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 1400 30 1566.66666 ANALYST 3000 CLERK 674 MANAGER 2758.33333 PRESIDENT 5000 SALESMAN 1400 1803.21428
SQL> SELECT deptno, job, avg(sal), grouping(deptno), grouping(job) FROM emp GROUP BY CUBE (deptno, job) ORDER BY deptno; DEPTNO JOB AVG(SAL) GROUPING(DEPTNO) GROUPING(JOB) ------ --------- ---------- ---------------- ------------- 10 CLERK 1300 0 0 10 MANAGER 2450 0 0 10 PRESIDENT 5000 0 0 10 2916.66666 0 1 20 ANALYST 3000 0 0 20 CLERK 373.333333 0 0 20 MANAGER 2975 0 0 20 1419 0 1 30 CLERK 950 0 0 30 MANAGER 2850 0 0 30 SALESMAN 1400 0 0 30 1566.66666 0 1 ANALYST 3000 1 0 CLERK 674 1 0 MANAGER 2758.33333 1 0 PRESIDENT 5000 1 0 SALESMAN 1400 1 0 1803.21428 1 1
SQL> SELECT deptno, avg(sal) FROM emp GROUP BY deptno ORDER BY deptno; DEPTNO AVG(SAL) ------ ---------- 10 2916.66666 20 1419 30 1566.66666
SQL> SELECT job, avg(sal) FROM emp GROUP BY job ORDER BY avg(sal); JOB AVG(SAL) --------- ---------- CLERK 674 SALESMAN 1400 MANAGER 2758.33333 ANALYST 3000 PRESIDENT 5000
SQL> SELECT deptno, job, avg(sal) FROM emp GROUP BY GROUPING SETS(deptno, job) ORDER BY deptno, job; DEPTNO JOB AVG(SAL) ------ --------- ---------- 10 2916.66666 20 1419 30 1566.66666 ANALYST 3000 CLERK 674 MANAGER 2758.33333 PRESIDENT 5000 SALESMAN 1400
SQL> SELECT e.ename, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno AND e.empno=7788; ENAME DNAME ---------- -------------- SCOTT RESEARCH
SQL> SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno=10; ENAME SAL GRADE ---------- --------- ---------- KING 5000.00 5 CLARK 2450.00 4 MILLER 1300.00 2
SQL> SELECT manager.ename FROM emp manager, emp worker WHERE manager.empno=worker.mgr AND worker.ename='BLAKE'; ENAME ---------- KING
SQL> SELECT d.dname, e.ename FROM dept d, emp e WHERE d.deptno=e.deptno AND d.deptno=10; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING KING ACCOUNTING MILLER
SQL> SELECT d.dname, e.ename FROM dept d INNER JOIN emp e ON d.deptno=e.deptno AND e.deptno=10; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING KING ACCOUNTING MILLER
SQL> SELECT dname, ename FROM dept NATURAL JOIN emp; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING KING ACCOUNTING MILLER RESEARCH JONES RESEARCH FORD RESEARCH ADAMS RESEARCH SMITH RESEARCH SCOTT SALES WARD SALES TURNER SALES ALLEN SALES JAMES SALES BLAKE SALES MARTIN
SQL> SELECT d.dname, e.ename FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno AND 2 d.deptno=10; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING KING ACCOUNTING MILLER RESEARCH SALES OPERATIONS
SQL> SELECT d.dname, e.ename FROM dept d, emp e WHERE d.deptno=e.deptno(+) AND 2 e.deptno(+)=10; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING MILLER ACCOUNTING KING RESEARCH SALES OPERATIONS
SQL> SELECT d.dname, e.ename FROM dept d RIGHT JOIN emp e ON d.deptno=e.deptno AND d.deptno=10; DNAME ENAME -------------- ---------- ACCOUNTING MILLER ACCOUNTING KING ACCOUNTING CLARK JAMES TURNER BLAKE MARTIN WARD ALLEN FORD ADAMS SCOTT JONES SMITH
SQL> SELECT d.dname, e.ename FROM emp e, dept d WHERE d.deptno(+)=e.deptno AND d.deptno(+)=10; DNAME ENAME -------------- ---------- ACCOUNTING MILLER ACCOUNTING KING ACCOUNTING CLARK JAMES TURNER BLAKE MARTIN WARD ALLEN FORD ADAMS SCOTT JONES SMITH
SQL> SELECT d.dname, e.ename FROM dept d FULL JOIN emp e ON d.deptno=e.deptno AND d.deptno=10; DNAME ENAME -------------- ---------- ACCOUNTING CLARK ACCOUNTING KING ACCOUNTING MILLER RESEARCH SALES OPERATIONS SMITH ALLEN WARD JONES MARTIN BLAKE SCOTT TURNER ADAMS JAMES FORD
SQL> SELECT ename, sal, deptno FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SCOTT'); ENAME SAL DEPTNO ---------- --------- ------ SMITH 10.00 20 JONES 2975.00 20 SCOTT 10.00 20 ADAMS 1100.00 20 FORD 3000.00 20
SQL> SELECT ename, job, deptno FROM emp WHERE job IN(SELECT job FROM emp WHERE deptno=10); ENAME JOB DEPTNO ---------- --------- ------ CLARK MANAGER 10 BLAKE MANAGER 30 JONES MANAGER 20 KING PRESIDENT 10 MILLER CLERK 10 JAMES CLERK 30 ADAMS CLERK 20 SCOTT CLERK 20 SMITH CLERK 20
SQL> SELECT ename, sal, deptno FROM emp WHERE sal > ALL(SELECT sal FROM emp WHERE deptno=30); ENAME SAL DEPTNO ---------- --------- ------ JONES 2975.00 20 KING 5000.00 10 FORD 3000.00 20
SQL> SELECT ename, sal, deptno FROM emp WHERE sal > ANY(SELECT sal FROM emp WHERE deptno=30); ENAME SAL DEPTNO ---------- --------- ------ KING 5000.00 10 FORD 3000.00 20 JONES 2975.00 20 BLAKE 2850.00 30 CLARK 2450.00 10 ALLEN 1600.00 30 TURNER 1500.00 30 MILLER 1300.00 10 WARD 1250.00 30 MARTIN 1250.00 30 ADAMS 1100.00 20
SQL> SELECT ename, sal, deptno FROM emp WHERE sal > (SELECT min(sal) from emp WHERE deptno=30) ORDER BY sal DESC; ENAME SAL DEPTNO ---------- --------- ------ KING 5000.00 10 FORD 3000.00 20 JONES 2975.00 20 BLAKE 2850.00 30 CLARK 2450.00 10 ALLEN 1600.00 30 TURNER 1500.00 30 MILLER 1300.00 10 WARD 1250.00 30 MARTIN 1250.00 30 ADAMS 1100.00 20
SQL> SELECT ename, job, deptno FROM emp WHERE (deptno, job)= 2 (SELECT deptno, job FROM emp WHERE ename='SMITH'); ENAME JOB DEPTNO ---------- --------- ------ SMITH CLERK 20 SCOTT CLERK 20 ADAMS CLERK 20
SQL> SELECT ename, job, deptno FROM emp WHERE (deptno, job) IN 2 (SELECT deptno, job FROM emp WHERE ename='SMITH'); ENAME JOB DEPTNO ---------- --------- ------ ADAMS CLERK 20 SCOTT CLERK 20 SMITH CLERK 20
SQL> SELECT ename, sal, job, deptno FROM emp WHERE EXISTS 2 (SELECT 1 FROM dept WHERE dept.deptno=emp.deptno AND dept.loc='NEW YORK'); ENAME SAL JOB DEPTNO ---------- --------- --------- ------ CLARK 2450.00 MANAGER 10 KING 5000.00 PRESIDENT 10 MILLER 1300.00 CLERK 10
SQL> SELECT e.ename, e.sal, e.deptno, ee.avgsal FROM emp e, 2 (SELECT deptno, avg(sal) avgsal FROM emp GROUP BY deptno) ee 3 WHERE e.sal>ee.avgsal AND e.deptno=ee.deptno; ENAME SAL DEPTNO AVGSAL ---------- --------- ------ ---------- ALLEN 1600.00 30 1566.66666 JONES 2975.00 20 1419 BLAKE 2850.00 30 1566.66666 KING 5000.00 10 2916.66666 FORD 3000.00 20 1419
SQL> INSERT INTO employee SELECT * FROM emp WHERE deptno=20; 5 rows inserted
SQL> UPDATE emp SET(sal, comm)=(SELECT sal, comm FROM emp WHERE ename='SMITH') 2 WHERE job=(SELECT job FROM emp WHERE ename='SMITH'); 5 rows updated
SQL> DELETE FROM employee WHERE deptno=(SELECT deptno FROM dept WHERE dname='ACCOUNTING'); 3 rows deleted
SQL> CREATE TABLE employee AS SELECT * FROM emp WHERE deptno=10; Table created
SQL> CREATE OR REPLACE VIEW v_emp 2 AS 3 SELECT deptno, ename, sal, empno FROM SCOTT.emp 4 WHERE deptno=10; View created
SQL> CREATE MATERIALIZED VIEW v_emp 2 AS 3 SELECT deptno,job,avg(sal) avgsal,sum(sal) sumsal 4 FROM SCOTT.emp GROUP BY cube(deptno, job); Materialized view created SQL> select * from v_emp; DEPTNO JOB AVGSAL SUMSAL ------ --------- ---------- ---------- 1803.21428 25245 CLERK 674 3370 ANALYST 3000 3000 MANAGER 2758.33333 8275 SALESMAN 1400 5600 PRESIDENT 5000 5000 10 2916.66666 8750 10 CLERK 1300 1300 10 MANAGER 2450 2450 10 PRESIDENT 5000 5000 20 1419 7095 20 CLERK 373.333333 1120 20 ANALYST 3000 3000 20 MANAGER 2975 2975 30 1566.66666 9400 30 CLERK 950 950 30 MANAGER 2850 2850 30 SALESMAN 1400 5600
SQL> select sal,ename,job from emp where sal>2500; SAL ENAME JOB --------- ---------- --------- 2975.00 JONES MANAGER 2850.00 BLAKE MANAGER 5000.00 KING PRESIDENT 3000.00 FORD ANALYST SQL> select sal,ename,job from emp where job='MANAGER'; SAL ENAME JOB --------- ---------- --------- 2975.00 JONES MANAGER 2850.00 BLAKE MANAGER 2450.00 CLARK MANAGER
SQL> SELECT sal, ename, job FROM emp WHERE sal>2500 2 UNION 3 SELECT sal, ename, job FROM emp WHERE job='MANAGER'; SAL ENAME JOB --------- ---------- --------- 2450.00 CLARK MANAGER 2850.00 BLAKE MANAGER 2975.00 JONES MANAGER 3000.00 FORD ANALYST 5000.00 KING PRESIDENT
SQL> SELECT sal, ename, job FROM emp WHERE sal>2500 2 UNION ALL 3 select sal,ename,job from emp where job='MANAGER'; SAL ENAME JOB --------- ---------- --------- 2975.00 JONES MANAGER 2850.00 BLAKE MANAGER 5000.00 KING PRESIDENT 3000.00 FORD ANALYST 2975.00 JONES MANAGER 2850.00 BLAKE MANAGER 2450.00 CLARK MANAGER
SQL> SELECT sal, ename, job FROM emp WHERE sal>2500 2 INTERSECT 3 select sal,ename,job from emp where job='MANAGER'; SAL ENAME JOB --------- ---------- --------- 2850.00 BLAKE MANAGER 2975.00 JONES MANAGER
SQL> SELECT sal, ename, job FROM emp WHERE sal>2500 2 MINUS 3 select sal,ename,job from emp where job='MANAGER'; SAL ENAME JOB --------- ---------- --------- 3000.00 FORD ANALYST 5000.00 KING PRESIDENT
SQL> col job format a15; SQL> SELECT LPAD(' ', 3*(LEVEL-1)) || ename ename, 2 LPAD(' ', 3*(LEVEL-1)) || job job FROM emp 3 START WITH mgr IS NULL 4 CONNECT BY mgr=PRIOR empno; ENAME JOB -------------------------------------------------------------------------------- --------------- KING PRESIDENT JONES MANAGER SCOTT CLERK ADAMS CLERK FORD ANALYST SMITH CLERK BLAKE MANAGER ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN TURNER SALESMAN JAMES CLERK CLARK MANAGER MILLER CLERK 14 rows selected SQL> SELECT e.ename,ee.ename boss from emp e, emp ee WHERE ee.empno(+)=e.mgr; ENAME BOSS ---------- ---------- FORD JONES SCOTT JONES JAMES BLAKE TURNER BLAKE MARTIN BLAKE WARD BLAKE ALLEN BLAKE MILLER CLARK ADAMS SCOTT CLARK KING BLAKE KING JONES KING SMITH FORD KING
SQL> SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s 2 WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno=10; ENAME SAL GRADE ---------- --------- ---------- KING 5000.00 5 CLARK 2450.00 4 MILLER 1300.00 2
SQL> SELECT ename, sal, CASE WHEN sal>3000 THEN 5 2 WHEN sal BETWEEN 1200 AND 1400 THEN 2 3 WHEN sal BETWEEN 2000 AND 3000 THEN 4 4 WHEN sal BETWEEN 1400 AND 2000 THEN 3 5 ELSE 1 END grade 6 FROM emp WHERE deptno=10; ENAME SAL GRADE ---------- --------- ---------- CLARK 2450.00 4 KING 5000.00 5 MILLER 1300.00 2
SQL> SELECT ename, sal FROM emp WHERE ename='SMITH'; ENAME SAL ---------- --------- SMITH 1000.00 SQL> SELECT ename, sal FROM emp AS OF TIMESTAMP to_timestamp( 2 '2012-08-08 17:12:00', 'YYYY-MM-DD HH24:MI:SS') 3 WHERE ename='SMITH'; ENAME SAL ---------- --------- SMITH 10.00
SQL> SELECT dname,sum(sal) FROM emp,dept WHERE emp.deptno=dept.deptno 2 GROUP BY dname HAVING sum(sal)>(SELECT sum(sal)*1/3 from emp); DNAME SUM(SAL) -------------- ---------- ACCOUNTING 8750 SALES 9400
使用WITH子句
SQL> WITH summary AS ( 2 SELECT dname, sum(sal) sal_total FROM emp, dept 3 WHERE emp.deptno=dept.deptno GROUP BY dname 4 ) 5 SELECT dname, sal_total FROM summary WHERE sal_total> 6 (SELECT sum(sal_total)*1/3 FROM summary); DNAME SAL_TOTAL -------------- ---------- ACCOUNTING 8750 SALES 9400