Oracle的DML语言必备基础知识qingsongdo

前提是咱们都已经对常用的数据操纵语言非常熟悉了,对标准SQL:

SELECT子句--指定查询结果集的列

DROM子句--指定查询来自哪个表或者试图

[WHERE子句]--指定查询的条件

[GROUPBY子句]--指定查询结果集的分组的条件

[HAVING子句]--指定分组或者集合的查询条件

[ORDERBY子句]--对查询的排列顺序

[UNION子句]--多个SELET语句组合,得到结果集的并集

掌握的比较熟悉了。

下面是我参考《Oracle学习笔记》整理的可能会对咱们平时的开发有帮助的SQL基础:

准备工作:

CREATETABLEdept(

deptnoNUMBER(20),--部门编号

NAMEVARCHAR2(20)--部门名称

);

CREATETABLEemp(

empnoNUMBER(20),--员工编号

empnameVARCHAR2(100),--员工姓名

deptnonumber(20)--所属部门

INSERTINTOdeptVALUES('1','新农保组');

INSERTINTOdeptVALUES('2','老农保组');

INSERTINTOempVALUES('1','杨以通','1');

INSERTINTOempVALUES('2','杨敬义','1');

INSERTINTOempVALUES('3','曹艳芳','1');

INSERTINTOempVALUES('4','郝岔蕾','1');

INSERTINTOempVALUES('5','王炜','1');

INSERTINTOempVALUES('6','陈字文','1');

INSERTINTOempVALUES('7','某某人','3');

1、Oracle中ROWNUM的使用

SELECT*FROMempWHEREROWNUM=1;--可以查询到数据

SELECT*FROMempWHEREROWNUM=2;--不能查询到数据

SELECT*FROMempWHEREROWNUM<3;--可以查询到数据

SELECT*FROMempWHEREROWNUM>3;--不能查询到数据

SELECT*FROMempWHEREROWNUMBETWEEN2AND5;--不能查询

1)新农保系统内的分页功能的实现

SELECT*

FROM(SELECTROWNUMASMYROWNUM,C.*FROM(

SELECT*FROMEMP--这个地方是咱们写的SQL语句

)C)

WHEREMYROWNUM<=5--分页的结束值

ANDMYROWNUM>1--分页的开始值

系统里面,凡是在JSP里面对LIST进行分页的地方,均会采用上面的方式将咱们编写的SQL语句进行封装一下,从而可以支持数据的分页显示。

2)ROWNUM与排序不是对应的

SELECTROWNUM,emp.*FROMempORDERBY3;

相应的结果:

可以看出来,ROWNUM并不是1,2,3,4,5那样子顺序排列下去,也就是ROWNUM这个伪列仍旧是在数据取出来的时候就产生了该列,排序并不会改变该列的顺序,所以,ROWNUM与排序操作之间并不存在必然的联系。

2、实现模糊查询中的通配符

在整个新农保系统的SQL代码中模糊查询通配符基本上都是%,例如:

SELECT*FROMempWHEREempnameLIKE'%艳%';

其实还有其他的通配符:

通配符

含义

%

包含零个或者多个任意字符的字符串

_

任意单个字符

任意单个字符(啥时候用在LIKE子句中怎么用)

#

表示0-9的数字(啥时候用在LIKE子句中怎么用)

[]

指定范围或者集合中的任意单个字符,例如[a-f]表示a~f中的一个字符

(啥时候用在LIKE子句中怎么用)

3、HAVING子句和WHERE子句的区别

HAVING子句和WHERE子句的区别在于:WHERE子句搜索条件在进行分组操作之前进行,而HAVING子句则是在分组操作之后应用,HAVING的语法和WHERE的语法类似,HAVING可以包含聚合函数,这也从一个方面说明HAVING子句是在分组操作之后进行的。

4、连接查询的内连接、外连接、交叉连接

1)内连接

内连接根据每个表共有的列的值来匹配两个表中的列,只有每个表中都存在相同的记录才会出现在结果集中,在内连接中,两个表没有主次之分。在内连接中,出了用‘=’还可以使用INNERJOIN来定义表内部的连接关系,内连接是咱们最常用的一种连接了,以下两种方式得到的结果是一样的:

SELECT*FROMempa,deptbWHEREa.deptno=b.deptno;

SELECT*FROMempaINNERJOINdeptbONa.deptno=b.deptno;

2)外连接

①左外连接

SELECT*FROMemp,deptWHEREemp.deptno=dept.deptno(+);

SELECT*FROMempLEFTOUTERJOINdeptONemp.deptno=dept.deptno;

SELECT*FROMempLEFTJOINdeptONemp.deptno=dept.deptno;

②右外连接

右外连接以连接(JOIN)子句右侧的表为主表,主表中的所有的记录都将出现在结果集中,如果主表中的记录在左表中没有匹配的记录,则结果集中右表的记录为NULL,右外连接可以使用RIGHTOUTERJOIN或者RIGHTJOIN来定义,以下三个操作的结果是一致的:

SELECT*FROMemp,deptWHEREemp.deptno(+)=dept.deptno;

SELECT*FROMempRIGHTOUTERJOINdeptONemp.deptno=dept.deptno;

SELECT*FROMempRIGHTJOINdeptONemp.deptno=dept.deptno;

③完整外部连接

完整外部连接包含连接表中的所有的行,无论他们是否匹配。在Oracle中可以使用FULLOUTERJOIN或者FULLJOIN关键字定义完整外部连接。

SELECT*FROMempFULLOUTERJOINdeptONemp.deptno=dept.deptno;

SELECT*FROMempFULLJOINdeptONemp.deptno=dept.deptno;

结果如下:

3)交叉连接

SELECT*FROMempCROSSJOINdept;

结果如下:

这个结果得到的是两个表之间进行操作的笛卡尔积,交叉连接基本上不会被用到,除非你想穷举两个表之间有多少种记录组合,关键字CROSSJOIN是让两个表进行组合,所以不需要ON关键字来指定两个表的连接关系。

5、EXISTS关键字的使用

从效率上分析,是选择IN还是选择EXISTS?

IN到EXISTS的转换:

--使用IN来写的代码,Oracle先转换为多表连接,如果不能转换,则先执行SELECTDEPTNOFROMDEPTWHEREDEPT.DEPTNO=1部分,然后执行外面的那一块

FROMEMP

WHEREEMP.DEPTNOIN(SELECTDEPTNOFROMDEPTWHEREDEPT.DEPTNO=1);

--使用EXITS来实现的两个表之间的连接,Oracle先执行外面的循环SELECT*FROMEMP,在此过程中,去关联检索DEPT表中的内容,根据EXISTS子句的内容看该列是否在DEPT中存在,如果存在则返回TRUE,如果不存在则返回FALSE,因此EXITS后面SELECT1还是SELECT100都是一样的

FROMEMPA

WHEREEXISTS(SELECT1

FROMDEPT

WHEREDEPT.DEPTNO=1

ANDDEPT.DEPTNO=A.DEPTNO);

6、UNION关键字的使用

使用UNION挂件子组合两个查询的结果集,结合的基本规则如下:

①所有查询中的列数和列的顺序必须要一致

②数据类型必须要兼容

使用UNION关键字进行合并查询的时候,数据库引擎会自动过滤掉结果集中的重复记录。

使用UNIONALL关键字进行合并查询的时候,数据库引擎就不会过滤结果集中的重复数据,因此在执行效率上将UNIONALL比UNION要高上很多。

7、SELECTDECODE语句的使用

在新农保系统中,经常会用到SELECTDECODE语句,例如查询该人是男,还是女?如果代码表SELECT*FROMAA10WHEREAAA100=UPPSER(‘’);的结果集比较小,就没有必要再关联上一张代码值表(视情况),直接使用DECODE函数:

SELECTAAC001,

AAC002,

AAC003,

DECODE(AAC004,'1','男','2','女','未知')ASaac004

FROMAC01;

DECODE函数的语法如下:

DECODE(<输入值>,<值1>,<结果1>[,<值2>,<结果2>…][,<默认结果>])

说明:

如果输入值等于值1,则DECODE函数返回值1,如果输入值等于值2,则DECODE函数返回值2,依次类推.如果参数列表中没有输入值相等的,则DECODE的函数返回默认结果。

8、在SELECT语句中使用CASE函数

SELECT

CASE

WHENempno=1THENempname||'懒洋洋'

WHENempno=3THENempname||'小屁孩'

ELSEempname

END

FROMemp;

查询的结果:

使用CASE函数可以实现与DECODE同样的功能,但是CASE函数有更强大的作用,尤其是在搜索、统计功能方面,语法如下:

WHEN<逻辑表达式1>THEN<结果1>

[WHEN<逻辑表达式2>THEN<结果2>…]

[ELSE<默认结果>]

9、保存查询结果、在正式库修改数据之前备份要操作的表

我们在开库修改某一个表的数据的时候,除了要保存执行的脚本,以及保存相应的文档的同时,也需要丢该表进行备份工作。从而能够在万一出现错误的时候,保留恢复的依据,这是一个比较好的习惯。例如:

我们即将对AC43表进行UPDATE或者DELETE操作,除了保存相应的执行脚本,还应当对AC43表进行整体的备份。备份语句如下:

CREATETABLEac43_20110816ASSELECT*FROMac43;

这样就在数据库中建立了一张新表ac43_20110816。

CREATETABLE语句的格式如下:

CREATETABLE<新的表名>AS

……

10、修改数据的时候,避免唯一性约束列

首先为EMP的EMPNO字段增加唯一性约束:

ALTERTABLEemp

ADDCONSTRAINTuk_empno

UNIQUE(empno);

然后对EMP的EMPNO列进行UPDATE或者INSERT操作:

INSERTINTOempVALUES('1','羊羊羊','1');

UPDATEempSETempno=4WHEREempnameLIKE'杨_通';

都会有一个提示:

插入或修改都不能违反唯一性约束条件XAXNB.UK_EMPNO。

ALTERTABLEempDROPCONSTRAINTuk_empno;--删除该约束条件

11、修改数据的时候,不能违法检查性约束

首先在EMP的表上,添加一个检查性约束,检查条件为empno<10;

ADDCONSTRAINTck_empnoCHECK(empno<10);

然后执行以下语句:

INSERTINTOempVALUES('10','羊羊羊','1');

UPDATEempSETempno=10WHEREempnameLIKE'杨_通';

则会出现一个提示:

ALTERTABLEempDROPCONSTRAINTck_empno;--删除该检查约束

12、修改数据的时候,不能违反外键约束

首先准备数据:

①UPDATEempSETdeptno=2WHEREempno=7;目的是防止在创建外键的时候,找不到dept对应的主键。

②altertableDEPTaddconstraintpkprimarykey(DEPTNO);给DEPT表增加一个主键,这样子EMP的外键才能指向DEPT的主键。

③ALTERTABLEemp

ADDCONSTRAINTfk_emp

FOREIGNKEY(deptno)REFERENCESdept(deptno);增加外键约束

进行如下操作:

INSERTINTOempVALUES('10','羊羊羊','4');

UPDATEempSETdeptno=10WHEREempnameLIKE'杨_通';

则会有如下提示产生:

ALTERTABLEempDROPCONSTRAINTfk_emp;--删除EMP表上的外键约束

13、如何删除表中的数据(TRUNCATE)

可以使用DELETE语句删除表中的所有的数据。DELETE语句的语法结构如下:

DELETEFROM<表名>WHERE<删除条件>

例如删除EMP和DEPT表中的数据:

DELETEFROMDEPTWHEREDEPTNO<4;

DELETEFROMEMPWHEREEMPNO<3;

如果要删除表中的所有的记录,而不记录单个行的删除操作的话,就可以使用TRUNCATETABLE操作。TRUNCATETABLE语句的语法结构如下:

TRUNCATATABLE<表名>

需要注意的事情是:

②TRUNCATE使用有危险,因为默认COMMIT,一旦删除,不容易找回。使用DELETE的时候,请务必带上、带对条件!!

THE END
1.新农合如何使用信件编号: 20241208002 信件类型: 我要咨询 来信标题: 新农合如何使用 来信时间: 2024-12-08 19:31 来信内容: 新农合缴费之后,去医院看病怎么报销,可以报销哪些医院,外市或者外省的医院可以吗,可以报销哪些药品,报销比例是多少,感谢解答。 回复内容答复情况: 答复单位:芜湖市人社局 答复时间:2024-12-09 09:20 https://rsj.wuhu.gov.cn/content/article/8668327
2.广东新农保缴费180元一年怎么交,使用指标公式技术选股的炒股高手这位炒股高手精通各种股票软件平台下的指标公式,运用180天均线策略进行选股,他将分享如何利用这一策略来挑选有潜力的股票。 ,理想股票技术论坛https://www.55188.com/search-%B9%E3%B6%AB%D0%C2%C5%A9%B1%A3%BD%C9%B7%D1180%D4%AA%D2%BB%C4%EA%D4%F5%C3%B4%BD%BB.html
3.老家交了78年农保,现在单位又交了社保,家里的农保怎么办?如果你在单位的社保缴费满了15年,那么,家里的农保是可以转入职工养老保险的。 大家好,我是社保专家思之想之,老家交了78年的农保,现在单位又交了社保,家里的农保怎么办呢? 你所说的农保就是指现在的城乡居民养老保险,而你在单位参加的是职工养老保险,按照国家的规定,不能够重复参保,养老金也不能够领取两份儿。https://www.55xw.net/show-426545.html
4.西湖益联保投保的相关问题我们都帮你问到了答案杭州新闻中心问:如何使用医保个人历年账户余额投保? 答:订单在支付环节,可选择“个账支付”按钮,确认支付。但需要对个账缴费人姓名、身份证、手机号进行同一人校验,且医保个人历年账户余额足够支付保费,否则将会导致支付失败。 问:怎么给家人购买? 答:“西湖益联保”鼓励为直系亲属(父母、配偶、子女)或近亲属参保,但被保险人须https://hznews.hangzhou.com.cn/chengshi/content/2021-01/22/content_7897609_2.html
5.运城人才网新农保制度实施时,已年满60周岁、未享受城镇职工基本养老保险待遇的,可以直接按月领取基础养老金,但其符合参保条件的子女应当参保缴费;45周岁以上(含45周岁)人员,应按年足额缴费,也允许补缴(补缴部分不享受政府补贴),累计缴费年限不得超过15年;45周岁以下人员,应按年足额缴费,累计缴费不得少于15年。 https://www.ycsrcsc.com/a/web/article/descNewsInfo?id=0b61a83229e648cc81710e6e45cff3d7&type=122