数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle10G关于表操作常用语句详解及随想


发布日期:2020年09月04日
 
Oracle10G关于表操作常用语句详解及随想

最近利用业余时间一直在看Oracle g开发这方面资料 由于以前企业级项目对数据库操作都是基于微软的SQL 版本偏多 所以这段时间也是一个转换过程特意在网上订购一本Oracle Database G SQL Master SQL and PL/SQL 这本书重新完整的 系统的进行梳理一遍总体给我感觉是其实我就是在重新梳理结构化查询语言(Structured Query Language/SQL) SQL 虽然做了一遍重复性工作 但体会也是不同的 类似这本书并没有费了我很大精力 但给我感觉它就是一条细线 把我以前遗留的片段全部关联起来 视野上更加趋于开阔我慢慢才体会到 做程序开发的工作其实可粗可细 我们常常感慨一个技术大牛所作的创造性思维(类似Robert CMartin关于敏捷实践) 其实殊不知他们也是在逐渐积累过程中才有了创造 就想一句话说的没有任何事情是凭空而来那么对于一个做技术出生的人一个完善的知识体系结构是相当重要的 所以我更愿意倾向于一个科班出生的技术人员 目前情况是社会上关于软件开发培训的快餐打乱了行业内这种格局 格局我们没法控制 无论这种格局乱还是没乱但归咎到底还是一个技术人员在实际工作自我完善自己知识体系这种能力和意识 对于他人的指导这种外力的鞭子抽的我们都有惰性 自觉的意识才能真正力量 这种并非一朝一夕的能够成就的 它是一个长时间 同时具有一定量积累才能沉澱出来的 只有不断完善自己知识体系 不断学习才是一个真正技术人员发展上要走长远子路 这也是我考察一个技术人员非常重要的标准

这也是很多经历了入门级别痛苦后程序员 最为迷茫一个问题 以上最近这本书给我一点联想 转入正题

Oracle Database G SQL Master SQL and PL/SQL :书样 随便推荐给各位 内容虽然很简单 但给我感觉细节上讲的很全面 完全可以做为一个日常工作中查询手册也是没有问题的一方面它详细而通用讲述了SQL标准每个细节 同时也有两章是Oracle公司自己扩展语法详细讲解直接形成比对及时将来遇到与SQL标准不同变更 一眼就能看出来

(A)SQL标准与三层

又重新翻看这个结构化查询语言(简称SQL)的来世于前生期间不经让我联想到到以前项目中对于底层数据访问层三层架构思想 他们之间联系 先来看看SQL标准来历:

年时有EFCold博士提出关系型数据库这个概率 听起来早就不新鲜了但是SQL就是在EFCold博士工作基础自上发展而来 其第一个实现就是有IBM在世纪年代中期开发的当时IBM开展了一个成为System R的研究项目SQL 就是从这项目中诞生的 到了年底一家当时成为Relational Software INc的公司(其实大家应该都知道就是现在Oracle公司)发布了第一个商业版本的SQL 随着发展SQL已经被完全标准化了而且获得美国国家标准组织(American Standards Institute ANSI)认证SQL可以用来访问Oracle SQL Server DB和MySQL 数据库直至发展到现在

SQL在发展的实现标准化也为三层分工实现编码与数据库依赖关系解耦 编程语言不在依赖数据库 主要归功于SQL访问数据库的标准化 目前架设一下主流的数据Oracle SqlServer DBMySQL每个都有自己一套数据库访问方式规则 那是多么可怕一件事当切换一个数据库 我们就彻底扔掉了一个数据访问层 那么编码应用程序就死死绑定数据库上而从严格三层定义来说 拿掉任何一层都是可以重用 显示层 业务逻辑层 与数据访问层是没有任何实际依赖的 层于层之间实现时一种独立关系 如果没有SQL语言标准化也就没有实际意义上三层分工实现 现在项目中如果实现底层数据库切换可以做一个简单工厂模式 只需在修改简单配置 代价极小 如果没有SQL 这一切就无从谈起了

(B)附Oracle G中关于表操作

附Oracle G下编码: 内有详细说明其中操作非常简单 不做赘述 对于其他一些关于Oracle G特有属性将在后续后有详细说明

代码

———————创建数据库表成功—————————–

——–ChaRu数据操作详细SQL记录–

——–Author:chenkai Date:::

–oracle中显示日期格式为:DDMONYY dd是代表日 mon是月份前三个字母大写yy 年份最后两位实际上存储年是位 显示的为

select * from customers

insert into customers(customer_idfirst_namelast_namephone)

values(chenkaige′);

insert into customers(customer_idfirst_namelast_namephone)

values(marik陈凯′);

update customers set first_name=chenkaiunion where customer_id=

delete from customers where customer_id=

–如果误删除了数据库记录 可以回滚数据

rollback;

insert into customers(customer_id first_name last_namephone)

values(再次ChaRu数据fuck Again′)

–ChaRu数据进行单引号和双引号

insert into customers(customer_id first_namelast_name)

values( 测试单引号BeiJing单引成功了)

insert into customers(customer_id first_namelast_name)

values( 测试双引号The Great Wall LED)

select * from customers

–从一个表向另一个表复制行 (快速的植入数据注意修改了主键为) 能用select union 测试不成功 可以使用 i新增的merge语句来快速转移

insert into customers(customer_idfirst_namelast_name)

select first_namelast_name from customers where customer_id=

–使用merger来合并行数据 Oracle i版本引入了Merge关键之来合并数据

–可以用来将一个表的行合并到另一个表中(如果在转换中需要处理等等 在合并数据)

create table product_change

(

product_id integer constraint change_pk primary key

product_typeid integer constraint product_type_fkid references product_type(product_id)

name varchar() not null

description varchar()

price number()

);

–需求是这样:对于Product 和product_change两个表中product_id相同的行将Product中各列里值修改成Product_change对应的值 如果product_id存在

–并匹配 进行更新修改 如果不存在则在Product表ChaRu记录数据 即可 使用merge来操作

merge into products pro

using product_change pc on(

proproduct_id=pcproduct_id

)

–当匹配时修改

when matched then

update set

proproduct_typeid=pcproduct_typeid

proproduct_name=pcname

proproduct_content=pcdescription

proproduct_price=pcprice

–当不匹配是 ChaRu数据

when not matched then

insert(proproductidproproduct_typeidproproduct_nameproproduct_contentproproduct_price)

values

(

pcproduct_id

pcproduct_typeid

pcname

pcdescription

pcprice

);

–操作完成

–merger into 子句指明了合并操作的目标表(要合并到的表) 命名成一个别名 pro 下面都用这个来替代

–using on子句指定了一个表连接 上面指定的Product表中Product——id和Product——change表中Product_id建立连接

–when matched then 当一行数据满足了Using…on条件时执行操作 同理而言下面操作

–使用update语句修改行

–定义一个变量

variable average_product_prices number

update products set price=prices* returning avg(price) into:average_product_prices;

–使用默认值 测试成功

create table userdefaultdemo

(

demo_id integer constraint demo_pk primary key

datestatus varchar() default no placed its take not null

last_modifieddate date default sysdate not null

);

drop table userdefaultdemo

insert into userdefaultdemo(demo_id)

values()

–在更新或ChaRu数据使用Default关键字来设置修改列的值

update userdefaultdemo

set datestatus=default where demo_id=

select * from userdefaultdemo

–Oracle g中创建指定用户并连接数据到数据库

–默认在chendb数据库中创建一个用户

create user testuser identified by testpass;

–testuser为创建用户用户名

–testpass为创建用户登录密码

–对用户授权限

–登录数据库 connect权限 创建类似一些诸如表结构的数据 resource权限 权限由特权用户(例如DBA)使用Grant语句授予的

grant connectresource to testuser;

–to 指定为授权的用户

–新用户连接数据库chendb

connect testuser/testpass–有语法错误

–新用户创建表(完整的简化版本的创建表语法)

create [global temporary] table table_name

(

colum_name type [constraint constraint_def default default_exp]

)

[on commit {delete | preserve} rows]–控制临时表的有效期 delete说明这些行在事务的末尾就要被删除 preserve说明要在会话末尾删除这些行 默认值为Delete

tablespace tab_space;–设定数据库占用空间大小

–global temporary 指定说明当前表的行都是临时的 称之为临时表 临时表对当前所有会话都是可见的但是这些行只是特定于某个会话

–在Oracle官方上真正完整语法远远比这个要复杂 简化只是常用的设置 以上述语法创建表

create table order_status

(

id integer constraint order_status_pk primary key

status varchar()

last_modified date default sysdate

);

–下面创建一个临时表

create global temporary table test_orderstatus

(

id integer constraint order_statustest_pk primary key

status varchar()

last_modifieddate date default sysdate

)

on commit preserve rows;–只针对临时表设置当会话结束就删除临时表行数据(Oracle会话如何定义?)

–向临时表ChaRu数据

insert into test_orderstatus(idstatus)

values(chenkaiunion 测试临时表数据)

select * from test_orderstatus

–当我们断开当前测试用户Testuser 关于数据库chendb连接时 会话就消失 那么关于这个临时表自动被删除

disconnect –断开

connect testuser/testpass–再次连接查看临时表是否存在

select * from test_orderstatus

–获得关于表自身一些信息

–查询上面刚刚创建两个表

select table_nametablespace_nametemporary from user_tables

where table_name in (order_statustest_orderstatus)

–上述查询时一个系统字典表user_tables[其中列 table_name 表名 tablespace_name存储该表的表空间(数据库用来存储诸如表子类对象的地方)名 ]

–[temporary 说明该表是否是临时表 如果是则Y 不是则为N]

select * from user_tables

–获取表中列的信息

–从user_tab_colums中获取

select table_name column_namedata_typedata_lengthdata_precisiondata_scale from user_tab_columns where table_name=CHENTEST –[表名为全大写]

–对User_tab_colums系统字典表中 Data_precision【如果为数字列指定了精度 该列就是查询出精度】 datascale【数字列小数部分的位数】

–修改表信息

–alert table 主要用于 添加/删除/修改列

–添加/删除 约束

–启用禁用约束

–查看对表或列建立的约束信息

–添加列

alter table test_orderstatus add operator_name varchar();–报错【试图访问已经交由事务处理的临时表】 临时表不能别修改

alter table order_status add operator_name varchar();

select * from order_status–成功

–修改列【列长度/ 但前提是该列的长度是可以修改的例如 char/Varchar】

–【修改数字列的精度】

–【修改列数据类型】

–【修改列的默认值】

alter table order_status modify status varchar();–[长度由增加成] –成功

alter table order_status modify status varchar();–【长度由缩小成 注意当前表没有任何数据】 –成功

–ChaRu数据

insert into order_status(id status) values(chenkai);

select * from order_status

–再次缩小列status长度

alter table order_status modify status varchar();–成功了 怪哉!

–【只有在表中没有任何行货所有列都为空值是才可以减少列的长度】 但成功了

alter table order_status add newnumber number();–添加新列

–【修改新添加数字列的精度】

alter table order_status modify newnumber number();–成功

–同上【只有在表中没有任何行货所有列都为空值是才可以减少数字列的精度】

–【修改列数据类型】

alter table order_status modify newnumber char();–【由number类型修改char】

–【如果表中还没有任何行或列都为空值 就可以将列修改为任何一中数据类型【包括更短的数据类型】否则只能修改一种兼容的类型类似Varchar 修改成Varchar

–【但前提是不能缩短列的长度 才能转换 类似不能将date修改成number类型】

alter table order_status add newdefault varchar() default chenkaiunion 默认数据;–【如果第一次修改 新列中没有值全部添加了默认值】

insert into order_status(idstatus) values(测试)

–【修改列默认值】

alter table order_status modify newdefault default ;–【修改后只对新添加的列 起了新的默认值作用】

select * from order_status

–【删除列】

alter table order_status drop column operator_name ;–成功

–【添加约束】

–【表示出Oracle中所有约束控制如下:】

–check 【指定一列或一组列必须满足的约束】

–primary key /foreign key /unique/readonly /not null

–check option 指定对视图执行的DML操作必须满足子查询的条件 后有详解

Aqizhong从Oracle i版本开始独立引入了一个Merge语句用来快速简单将一个表的合并到另外一个表中实现的是跨表间数据库合并操作值得注意 Merge into子句指明了合并操作的目标表 Using……on子句其实实现的是一个表连接 上面例子能看出 而When Matched then 当匹配Using…on子句条件时操作 同理When not Matched then 实在不匹配是操作

B:Oracle G 数据库基本同SQL 其中有个Check Option指定对视图执行的DML操作必须满足子查询条件 详细请查看官方的Oracle SQl手册不在赘述

C:在表修改中默认值 数据类型 数字类的精度等 控制上有详细说明 同SQL雷同出较多 Oracle G 注意已经注明 参考上编码

               

上一篇:Oracle在Linux下的安装小结

下一篇:用sqlplus为oracle创建用户和表空间