pl/sql sql语句
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
1. 确定表结构:desc
desc emp
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4)
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y
2. 检索日期:默认是以”DD-MON-YY”的方式检索显示。如果想以其他方式显示则需要使用TO_CHAR函数。
select ename,TO_CHAR(hiredate,'YYYY-MM-DD') FROM emp
ENAME TO_CHAR(HIREDATE,'YYYY-MM-DD')
---------- ------------------------------
SMITH 1980-12-17
ALLEN 1981-02-20
WARD 1981-02-22
JONES 1981-04-02
3. 可以为检索出的列设置别名:注别名为双引号
select ename AS "姓名",sal AS "工资" From emp
姓名 工资
---------- ---------
SMITH 2000.00
ALLEN 1600.00
WARD 1250.00
JONES 2975.00
4. 处理NULL值:如果没有给某列提供数值则其默认为NULL
NVL(exp1,exp2)如果exp1为NULL则返回exp2
NVL2(exp1,exp2,exp3)如果exp1不是NULL则返回exp2,否则返回exp3
5. 显示有意义的查询结果可以连接字符串
SELECT ename||' '||'is a '||' '||job AS "Employee detail" FROM emp;
Employee detail
--------------------------
SMITH is a CLERK
ALLEN is a SALESMAN
WARD is a SALESMAN
JONES is a MANAGER
6. where子查询中使用日期
以下使符合默认日期格式的。
select ename,sal,hiredate FROM emp
2 WHERE hiredate > '01-1月-82';
ENAME SAL HIREDATE
---------- --------- -----------
MILLER 1300.00 1982-1-23
MARY 1983-10-20
以下是使用特定日期格式的
SELECT ename,sal,hiredate FROM emp
WHERE hiredate > TO_DATE('1982-01-01','YYYY-MM-DD');
ENAME SAL HIREDATE
---------- --------- -----------
MILLER 1300.00 1982-1-23
MARY 1983-10-20
7. 在where中使用IN操作符
SQL> SELECT ename,sal FROM emp WHERE sal IN (800,1250);
ENAME SAL
---------- ---------
WARD 1250.00
MARTIN 1250.00
使用IS NULL ,逻辑操作符。
8. order by 子句:默认为升序排列
使用多列排列
普通排列:
SELECT ename,sal,comm FROM emp WHERE deptno=30
order by sal ASC;
ENAME SAL COMM
---------- --------- ---------
JAMES 950.00
WARD 1250.00 500.00
MARTIN 1250.00 1400.00
TURNER 1500.00 0.00
ALLEN 1600.00 300.00
多列排列
SELECT ename,sal,comm FROM emp WHERE deptno=30
order by sal ASC,comm DESC;
ENAME SAL COMM
---------- --------- ---------
JAMES 950.00
MARTIN 1250.00 1400.00
WARD 1250.00 500.00
TURNER 1500.00 0.00
ALLEN 1600.00 300.00
注:还可选择非检索项,列别名,列位置编号进行排序。
Insert语句
9. 使用DEFAULT提供数据:存在默认值则使用默认值不存在默认值则使用NULL
INSERT INTO dept VALUES(60,'MARKET',DEFAULT)
10. 使用子查讯插入数据,用VALUES子句插入数据只能插入一行内容,而使用子查讯语句则可以插入多行内容。
INSERT INTO employee (empno,ename,sal,deptno)
SELECT empno,ename,sal,deptno FROM emp
WHERE deptno=20
直接装载
INSERT /*+APPEND*/INTO employee (empno,ename,sal,deptno)
SELECT empno,ename,sal,deptno FROM emp
WHERE deptno=20;
In direct-path INSERT, data is appended to the end of the table, rather than using existing space currently allocated to the table. As a result, direct-path INSERT can be considerably faster than conventional INSERT.
11. 多表插入
使用ALL提供多表插入
INSERT ALL
WHEN deptno=10 THEN INTO dept10
WHEN deptno=20 THEN INTO dept20
ELSE INTO other
SELECT * FROM emp
使用FIRST提供多表插入:如果数据满足先前条件并且已经被插入则不会被插入。
更新数据:
12. 更新多行数据
UPDATE emp SET sal=sal*1.1,comm=sal*0.1
WHERE deptno=20;
更新日期:
UPDATE emp SET hiredate=TO_DATE('1987-02-02','YYYY-MM-DD');
更新关联数据:使用子查询可以降低网络开销
UPDATE emp SET (job,sal,comm)=(
SELECT job,sal,comm FROM emp WHERE ename='SMITH')
WHERE ename='SCOTT';
复制表数据:当时用触发器时当表A数据发生改变,表B数据也需要修改
UPDATE employee SET deptno=
(SELECT deptno FROM emp WHERE empno=7788)
WHERE job=(SELECT job FROM emp WHERE empno=7788)
13. 删除数据:使用DELETE删除表的所有数据时并不会释放表所占用的空间,使用TRUNCATE TABLE不仅会删除表的数据,还会释放表段所所占用的空间。
TRUNCATE TABLE emp
14. 删除数据子查询
DELETE FROM emp WHERE empno=
(select empno FROM emp WHERE dname=’SALES’);
使用事务控制语句:
14. 设置保存点
savepoint a;
exec dbms_transaction.savepoint(‘a’);
15. 执行回退到a
Rollback to a;
exec dbms_transaction.rollback_savepoint(‘a’);
16. 取消全部事务
rollback;
exec dbms_transaction.rollback;
分组函数:
17. GROUP BY指定分组。分组函数用于显示,having 用于限制分组显示结果。
注:如果选择列表中同时包含列,表达式,分组函数,那么这些列表达式分组函数必须在group by 子句中。当同时存在GROUP BY ,ORDER BY,HAVING子句时,ORDER BY 子句放在末尾。
显示方差与标准偏差
SELECT variance(sal),stddev(sal) FROM emp;
VARIANCE(SAL) STDDEV(SAL)
------------- -----------
1473364.15719 1213.822127
取消重复值
SELECT count(distinct deptno) AS distinct_dept FROM emp;
DISTINCT_DEPT
-------------
3
多列分组每个部门,每个岗位的平均工资
SELECT deptno,job,avg(sal) FROM emp
GROUP BY deptno,job;
DEPTNO JOB AVG(SAL)
------ --------- ----------
20 CLERK 3000
30 SALESMAN 1400
20 MANAGER 3272.5
30 CLERK 950
10 PRESIDENT 5000
CLERK
30 MANAGER 2850
10 CLERK 1300
10 MANAGER 2450
20 ANALYST 3300
18.产生横向及纵向的统计结果使用ROLLUP和CUBE
ROLLUP在原有统计结果上增加横向统计结果
SELECT deptno,job,avg(sal) FROM emp
GROUP BY ROLLUP (deptno,job);
DEPTNO JOB AVG(SAL)
------ --------- ----------
CLERK
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 2916.66666
20 CLERK 3000
20 ANALYST 3300
20 MANAGER 3272.5
20 3190.83333
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400
30 1566.66666
2310.20833
CUBE在原有ROLLUP结果的基础上在增加纵向统计结果
SELECT deptno,job,avg(sal) FROM emp
GROUP BY CUBE (deptno,job);
DEPTNO JOB AVG(SAL)
------ --------- ----------
2310.20833
CLERK
CLERK 1750
ANALYST 3300
MANAGER 2857.5
SALESMAN 1400
PRESIDENT 5000
10 2916.66666
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 3190.83333
20 CLERK 3000
20 ANALYST 3300
20 MANAGER 3272.5
30 1566.66666
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400
GROUP SETS:合并多个分组的结果】
1.SELECT deptno,avg(sal) FROM emp GROUP BY deptno;
DEPTNO AVG(SAL)
------ ----------
30 1566.66666
20 3190.83333
10 2916.66666
2.SQL> SELECT job,avg(sal) FROM emp GROUP BY job;
JOB AVG(SAL)
--------- ----------
CLERK 1750
SALESMAN 1400
PRESIDENT 5000
MANAGER 2857.5
ANALYST 3300
3. SELECT job,avg(sal) FROM emp
GROUP BY GROUPING SETS(deptno,job);
JOB AVG(SAL)
--------- ----------
CLERK 1750
SALESMAN 1400
PRESIDENT 5000
MANAGER 2857.5
ANALYST 3300
1566.66666
3190.83333
2916.66666
连接查询:基于两个或两个以上表的查询。FROM子句指定两个或两个以上的表。当表之间存在重名字段时应加上表名为前缀。
使用相等连接执行主从查询
SELECT e.ename,e.sal,d.dname FROM emp e,dept d
WHERE e.deptno=d.deptno;
ENAME SAL DNAME
---------- --------- --------------
SMITH 3000.00 RESEARCH
ALLEN 1600.00 SALES
WARD 1250.00 SALES
JONES 3272.50 RESEARCH
MARTIN 1250.00 SALES
BLAKE 2850.00 SALES
CLARK 2450.00 ACCOUNTING
KING 5000.00 ACCOUNTING
TURNER 1500.00 SALES
JAMES 950.00 SALES
FORD 3300.00 RESEARCH
MILLER 1300.00 ACCOUNTING
使用不等连接执行查询
SELECT a.ename,a.sal,b.grade FROM emp a,salgrade b
WHERE a.sal BETWEEN b.losal AND b.hisal;
自连接:主要用于显示自参照表中的上下级关系,或层次关系.
SELECT manager.ename FROM emp manager ,emp worker
WHERE manager.empno=worker.mgr
AND worker.ename='BLAKE';
ENAME
----------
KING
左连接,右连接,全连接,内连接,交叉连接,自连接
左右连接实际说是我们联合查询的结果以哪个表为准~
SELECT e.ename,d.dname from emp e right join dept d
on e.deptno=d.deptno;
以dept表为准。Dept表中有的deptno才会被显示出来。
SELECT e.ename,d.dname from emp e left join dept d
on e.deptno=d.deptno;
以emp表为准。emp表中有的deptno才会被显示出来。
全连接 full join 或者 full outer join,为二个表中的数据都出来,这里演示效果与上一样!
http://www.cnblogs.com/eflylab/archive/2007/06/25/794278.html
内连接 inner join 或者 join;它为返回字段ID同时存在于表emp 和 dept中的记录
子查讯:
多行子查询:
IN匹配子查询中的任何一个即可。
SELECT ename,job,sal,deptno FROM emp WHERE job IN
(SELECT distinct job FROM emp WHERE deptno=10);
ALL匹配子查询中的所有值
SELECT ename,sal,deptno FROM emp WHERE sal>all
(SELECT sal FROM emp WHERE deptno=30);
ENAME SAL DEPTNO
---------- --------- ------
SMITH 3000.00 20
JONES 3272.50 20
KING 5000.00 10
FORD 3300.00 20
ANY匹配子查询中任何一个
SELECT ename,sal,deptno FROM emp WHERE sal>any
(SELECT sal FROM emp WHERE deptno=30);
ENAME SAL DEPTNO
---------- --------- ------
KING 5000.00 10
FORD 3300.00 20
JONES 3272.50 20
SMITH 3000.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
多列子查询:
成对比较、非成对比较
SELECT ename,job,sal,deptno FROM emp WHERE (deptno,job)=
(SELECT deptno,job FROM emp WHERE ename='SMITH');
ENAME JOB SAL DEPTNO
---------- --------- --------- ------
SMITH CLERK 3000.00 20
相关子查询:需要引用主查询表列的子查询语句
SELECT ename,job,sal,deptno FROM emp WHERE EXISTS
(SELECT 1 FROM dept WHERE dept.deptno=emp.deptno
AND dept.loc=' NEW YORK ');
ENAME JOB SAL DEPTNO
---------- --------- --------- ------
MILLER CLERK 1300.00 10
KING PRESIDENT 5000.00 10
CLARK MANAGER 2450.00 10
在FORM子句中使用子查询
显示高于部门平均工资的雇员信息
SELECT ename,job,sal FROM emp,
(SELECT deptno,avg(sal) avgsal FROM emp
GROUP BY deptno) dept
WHERE emp.deptno=dept.deptno AND sal>dept.avgsal;
ENAME JOB SAL
---------- --------- ---------
ALLEN SALESMAN 1600.00
JONES MANAGER 3272.50
BLAKE MANAGER 2850.00
KING PRESIDENT 5000.00
FORD ANALYST 3300.00
合并查询:合并多个SELECT语句的结果,使用UNION(取消重复值),UNION ALL(不取消重复值),INTERSECT,MINUS
对于LOB,VARRAY,嵌套表列无效
对于LONG列,无效
如果选择列表包含了表达式,则必须要为其指定列别名。
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION
SELECT ename,sal,job FROM emp WHERE job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
FORD 3300.00 ANALYST
JONES 3272.50 MANAGER
KING 5000.00 PRESIDENT
复杂查询:
使用CASE表达式
SELECT ename,sal,CASE WHEN sal>3000 THEN 3
WHEN sal > 2000 THEN 2 ELSE 1 END GRADE
FROM emp WHERE deptno=10;
ENAME SAL GRADE
---------- --------- ----------
CLARK 2450.00 2
KING 5000.00 3
MILLER 1300.00 1
使用WITH子句重用子查询
查询部门工资总和高于雇员工资总和1/3的部门名及工资总和
SELECT dname,SUM(sal) AS dept_total FROM emp,dept
WHERE emp.deptno=dept.deptno GROUP BY dname
HAVING SUM(sal) >
(SELECT SUM(sal)*1/3 FROM emp,dept
WHERE emp.deptno=dept.deptno);
DNAME DEPT_TOTAL
-------------- ----------
RESEARCH 9572.5
SALES 9400
WITH summary AS(
SELECT dname,SUM(sal) AS dept_total FROM emp,dept
WHERE emp.deptno=dept.deptno GROUP BY dname
)
SELECT dname,dept_total FROM summary WHERE dept_total>
(SELECT SUM(dept_total)*1/3 FROM summary);
DNAME DEPT_TOTAL
-------------- ----------
RESEARCH 9572.5
SALES 9400
pl/sql sql语句相关推荐
- SQL语句、PL/SQL语句、SQL*PLUS语句结束符号
(1)SQL语句以:或者/结束语句. (2)PL/SQL语句以/结束语句. (3)SQL*PLUS语句以换行符结束语句.
- oracle里面cat,Oracle 12c 中推荐使用 catcon.pl 执行SQL脚本
https://www.cndba.cn/dave/article/225https://www.cndba.cn/dave/article/225 1 说明 在Oracle 12c中,Orac ...
- sqlplus与oracle交互过程中_格式化命令的设置.,sql plus 与Oracle交互常用令与sql plus语句...
类型:电子教程大小:8.5M语言:中文 评分:8.3 标签: 立即下载 第 4 页 编辑sql buffer中的sql语句 15.编辑sql buffer中的sql语句 EDI[T] 16.显示sql ...
- PL/SQL----pl/sql块
PL/SQL ```sql DECLARE---声明部分BEGIN---执行部分 ---必选EXCEPTION---异常处理部分 END;/ DECLARE ```sql BEGINDBMS_OUTP ...
- 三种常见的SQL插入语句
SQL插入语句是最常见的SQL语句之一,下面将为您介绍三种最常见的SQL插入语句,供您参考,如果您对SQL语句方面感兴趣的话,不妨一看. 我们在插入数据到数据库中的时候,常用的SQL插入语句如下: I ...
- SQL查询语句 select 详解
查询select: 1.单表查询 2.多表查询 3.嵌套查询分类 1)单表查询 2)多表查询 A.连接查询 B.子查询 ①一般子查询 ②相关子查询*************************** ...
- MySQL番外篇:一条SQL查询语句是如何执行的?
在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...
- SQL查询语句总是先执行SELECT?你们都错了。。。
来源 | infoq.cn/article/Oke8hgilga3PTZ3gWvbg 很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否 ...
- R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库、将dplyr语法查询语句翻译为SQL查询语句
R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库.将dplyr语法查询语句翻译为SQL查询语句 目录
- 当我们输入一条SQL查询语句时,发生了什么?
我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于 MySQL 的学习也是这样.平时我们使用数据库,看到的通常都是一个整体.比如,你有个最简单 ...
最新文章
- 所引用的程序集没有强命名解决方法
- protobuf编码
- XmlHttpRequest 对象详解
- javaone_JavaOne 2015 –又一年,又向前迈进了一步
- 如何正确实现 Java 中的 HashCode
- numpy维度交换_数据分析-gt;基本操作numpy(1)
- (STTN)Learning Joint Spatial-TemporalTransformations for Video Inpainting
- 微软服务器延迟,经过六个多月的延迟,微软终于推出Hyper-V Server 2019
- 以太网的分层架构_以太网矩阵(Ethernet Fabric)简介
- lame编译 android,Android编译Lame的全平台so库方案2,并实现转码mp3
- oracle rac 12514,ORA-12514: 错误解决一例
- Microsoft 提供的 USB 驱动程序
- 你可能不知道的iOS性能优化建议(来自前Apple工程师)
- Java抽象类与接口的运用
- 错排问题(排列组合习题)
- 微软亚洲研究院推出“人立方”人物关系搜索
- python如何取0到无穷大_python如何表示无穷大
- 使用FullCalendar做一个自己的日程管理(二)- 事件篇
- (半成品)Excel文件按要求导出至模板excel中(含配套数据)
- 3G内存 android7.0卡,这年头竟然还有 1GB 内存的手机?还能运行 Android 7.0?!
热门文章
- 高频宽带功率放大器(频率:10KHZ-1MHZ 功率:400-800W)
- 记住这10个学习资源网站,让你受益一生,还可以省学费
- 聊聊下班后的时光No.24
- 水泥厂堆取料机无线通讯方案
- rn android mac打包,React-Native之MAC平台Android apk打包流程
- 企业应该如何引入竞聘上岗机制?
- 半监督领域自适应之CCSA--Unified Deep Supervised Domain Adaptation and Generalization
- dw6能编译asp吗_dreamweaver运行asp文件的方法
- COMODO Firewall v6.1
- 关于计算机的英语谜语,computer的英语谜语