【Oracle】Oracle系列之七--表的创建与管理
文章目录
- 往期回顾
- 前言
- 1. 表的创建
- 2. 表的修改
- 3. 表中数据的增删改查
- (1)插入数据
- (2)删除数据
- (3)更新数据
- 4. 表的Merge
- 5. 表的删除
- 6. 表的重命名
- 7. 表的索引
- (1)B树索引
- (2)位图索引
- (3)函数索引
- (4)全文索引
- 8. 表的约束
- (1)主键约束
- (2)外键约束
- (3)唯一约束
- (4)CHECK约束
- 9. dual表
往期回顾
- 【Oracle】Oracle系列–Oracle数据类型
- 【Oracle】Oracle系列之二–Oracle数据字典
- 【Oracle】Oracle系列之三–Oracle字符集
- 【Oracle】Oracle系列之四–用户管理
- 【Oracle】Oracle系列之五–Oracle表空间
- 【Oracle】Oracle系列之六–Oracle表分区
前言
表是Oracle数据库中最基础的存储对象,用于存储数据。本文主要介绍了Oracle表的创建与管理,包括表的创建、修改、删除、重命名,表的索引、约束以及表中数据的增、删、改、查等基本操作。
1. 表的创建
在Oracle数据库中,创建表需要使用CREATE TABLE语句:
CREATE TABLE table_name
(column1 datatype [ NULL | NOT NULL ],column2 datatype [ NULL | NOT NULL ],...columnN datatype [ NULL | NOT NULL ]
);
其中,table_name是要创建的表的名称,column1 ~ columnN是表中的列名,datatype是数据类型,NULL和NOT NULL表示该列是否允许为空。
如创建一个名为student的表,包含学生的姓名、性别、年龄和学号四个字段,使用以下语句:
CREATE TABLE student
(name VARCHAR2(50) NOT NULL,gender CHAR(1) NOT NULL,age NUMBER(3),num VARCHAR2(20) PRIMARY KEY
);
上述语句创建了一个名为student的表,包含四个字段:name(姓名)、gender(性别)、age(年龄)和num(学号)。其中,name和gender字段不允许为空,age字段允许为空,num字段为主键,用于唯一标识每个学生。
创建表的其他参数:
- PCTFREE 保留空间
- PCTUSED 从表中删除数据,使得数据块空间不断减少,减少至40%时,可再次插入数据(PCTFREE与PCTUSED之和越接近100%,数据块空间利用率越高)。
- INITRANS 初始事务数量
- MAXTRANS 最大的事务并发数量
- CACHE 指定将表中的数据放在数据库高速缓存中,默认NOCACHE。对于较小、访问频繁的表,使用CACHE,在用户第一次访问表中数据时,整个表被加载到数据库高速缓存。
- LOGGING 默认情况下,用户在表上执行DDL和DML都会产生重做日志。如果不希望产生重做日志,使用NOLOGGING子句。
- COMPRESS 使用该子句,一个数据块中两行完全相同的数据将被压缩为一行。
创建表的时候插入数据
create table tt as select id,name from table1;
create table t1 parallel 8 nologging compress as select * from table1;
创建临时表
临时表为事务级,事务提交或回滚时,数据即被删除
create global temporary table t1(name varchar(10)) on commit delete rows;
临时表为会话级,表中数据一致保留直到当前会话结束。
create global temporary table t1(name varchar(10)) on commit preserve rows;
2. 表的修改
实际开发中可能需要对已有的表进行修改,如添加新的列、删除已有的列、修改列的数据类型等。Oracle提供了ALTER TABLE语句来实现这些操作:
ADD用于添加新的列
ALTER TABLE table_name
ADD (column_name datatype [ NULL | NOT NULL ],column_name datatype [ NULL | NOT NULL ],...);
DROP COLUMN用于删除已有的列
ALTER TABLE table_name DROP COLUMN column_name;
MODIFY用于修改列的数据类型
ALTER TABLE table_name
MODIFY (column_name datatype [ NULL | NOT NULL ]);
如对于之前创建的student表,添加一个新的字段address:
ALTER TABLE student
ADD (address VARCHAR2(100) NULL);
上述语句在student表中添加了一个新的字段address,数据类型为VARCHAR2,长度为100,允许为空。
3. 表中数据的增删改查
(1)插入数据
使用INSERT语句向表中插入数据:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
其中,table_name是要插入数据的表的名称,column1、column2、column3等是表中的列名,value1、value2、value3等是要插入的数据值。
例如向student表中插入一条数据,可以使用以下语句:
INSERT INTO student (name,gender, age,num)
VALUES ( 'John','M',20,01);
该语句将向student表中插入一条数据,包含name为’John’、gender为’M’、age为20、num为01的记录。
向目标表插入源表数据
插入数据时,如果源表和目标表字段名、字段数量、字段顺序都相同:
insert into table1 select * from table2;
否则 使用:
insert into table1(col1, col2, ..., coln) select col1, col2, ..., coln from table2;
(2)删除数据
使用DELETE语句从表中删除数据:
DELETE FROM table_name WHERE condition;
其中,table_name是要删除数据的表的名称,condition是删除记录的条件。
例如从student表中删除age大于等于25的记录,可以使用以下语句:
DELETE FROM student WHERE age >= 25;
(3)更新数据
使用UPDATE语句更新表中的数据:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
其中,table_name是要更新数据的表的名称,column1、column2等是要更新的列名,value1、value2等是要更新的数据值,condition是更新记录的条件。
例如将student表中id为1的记录的age更新为21,可以使用以下语句:
UPDATE student
SET age = 21
WHERE id = 1;
(4)查询数据
使用SELECT语句从表中检索数据,例如查询student表中i所有年龄大于26岁的学生信息:
SELECT * FROM student WHERE age > 20;
4. 表的Merge
Merge用于需要使用SQL语句同时进行Insert/Update的操作,也就是说当存在记录时就更新(Update),不存在数据时就插入(Insert)。
执行Merge前:
执行以下语句:
Merge Into products t
Using newproducts s
On (t.product_id=s.product_id)
When Matched Then
Update Set t.product_name=s.product_name,t.Category=s.Category
When Not Matched Then
Insert Values(s.product_id,s.product_name,s.Category)
其中,insert和update是可选的,UPDATE 和INSERT后面可以跟WHERE子句,UPDATE子句后面可以跟delete来去除一些不需要的行。在ON条件中可以使用常量来insert所有的行到目标表中,不需要连接到源表和目标表。
5. 表的删除
使用TRUCATE TABLE语句清除表中所有内容,保留结构:
truncate table table_name;
使用DROP TABLE语句删除某个表:
DROP TABLE table_name;
例如删除之前创建的student表:
DROP TABLE student;
上述语句将删除名为student的表及其所有数据。在执行DROP TABLE语句前,应确保该表不再被其他对象所使用,否则会抛出错误。
使用purge彻底删除表
6. 表的重命名
使用RENAME语句修改表名:
RENAME table_name TO new_table_name;
例如将之前创建的student表重命名为new_student:
RENAME student TO new_student;
1
7. 表的索引
数据库索引的作用是减少读数据所需的磁盘访问次数,加快数据访问速度,提高数据库性能。
索引提供指向存储在表的指定列中的数据值的指针,可快速定位需要的数据,从而提高查询效率。如果没有索引,查询需要扫描整个表,将花费大量时间和资源。
Oracle索引由一系列存储在磁盘上的索引项组成,索引项第一列是索引键(keyval),第二列是行指针(ROWID)。
ROWID由数据库自动生成,包含18个字符串:
OOOOOO/FFF/BBBBBB/RRR对应数据库对象编号/数据文件编号/数据块号/行号。
Oracle数据库中有多种类型的索引,包括B树索引、位图索引、函数索引、全文索引等。
(1)B树索引
Oracle默认为B树,是Oracle数据库中最常用的索引类型。它是一种平衡树结构,可以快速定位需要的数据。B树索引通常由一个或多个列组成,这些列存储了数据库表中的数据。当查询需要访问这些数据时,B树索引可以帮助快速定位它们。
B树索引的优点是查询速度快,适用于大多数查询场景。但B树索引维护成本高,当表中的数据发生变化时,需要更新索引,这将影响数据库的性能。
(2)位图索引
位图索引是一种用于处理大量重复数据的索引类型。它将每个索引值映射到一个位图,每个位图表示一个索引值是否存在。当查询需要访问这些数据时,位图索引可以帮助快速定位它们。
位图索引的优点是适用于处理大量重复数据的查询场景,可以显著提高查询效率。但是,位图索引不适用于处理不重复的数据,且索引维护成本高。
(3)函数索引
函数索引是一种用于处理函数表达式的索引类型。它将函数表达式的计算结果存储在索引中,当查询需要访问这些数据时,函数索引可以帮助快速定位它们。
函数索引的优点是适用于处理函数表达式的查询场景,可以显著提高查询效率。但是,函数索引的缺点是索引维护成本高,且只适用于特定的函数表达式。
(4)全文索引
全文索引是一种用于处理文本数据的索引类型。它将文本数据分解为单词,并将每个单词映射到一个索引值。当查询需要访问这些数据时,全文索引可以帮助快速定位它们。
全文索引的优点是适用于处理文本数据的查询场景,可以显著提高查询效率。但是,全文索引的缺点是索引维护成本高,且需要特定的全文搜索引擎。
当字段取值较多时,如证件号码,则应使用B-Tree索引
当字段值取值较少的情况下,如性别,应使用位图索引
在Oracle中可以为表中的列创建索引。例如,在student表的num列上创建一个名为“idx_num”的索引:
CREATE INDEX idx_num ON student(num);
8. 表的约束
数据库中,约束是用来保证数据的完整性和一致性的规则。Oracle数据库通过使用约束来限制表中数据的输入和更改,使得数据库中存储的数据是结构正确的,并且可以被其他程序和用户正确地共享和查询。
(1)主键约束
主键约束是用来唯一标识表中每个记录的一种方式,即主键必须在表中具有唯一性,不能为NULL,且只能定义一个主键约束。主键通常用来建立关系型数据库之间的连接。
建立主键约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name PRIMARY KEY (column1, column2);
如对于student表,建立主键约束:
Alter Table student Add Constraint pk_num Primary Key (num);
(2)外键约束
外键约束用于在表之间建立一对多或多对多的关系,它指明了一个表中的某个字段必须引用另一个表中的主键约束。外键值必须在引用表中存在或者为空值。
创建外键约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name FOREIGN KEY (column1) REFERENCES other_table(column2);
(3)唯一约束
唯一约束用于确保某个字段或一组字段中的值是唯一的。与主键不同,唯一约束允许 null 值。
创建唯一约束:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2);
(4)CHECK约束
创建CHECK约束:
Alter Table nn Add Constraint ck_emp_n2 Check(n2='男' Or n2='女')
9. dual表
dual是一个虚拟表,用来构成select的语法规则。
查看表结构:
desc dual;
oracle保证dual里面永远只有一条记录,查询表数据:
select * from dual;
Dual属于SYS schema,以PUBLIC SYNONYM的方式供其他数据库USER使用
SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE
常见用途如下:
select user from dual; #查看当前用户
select SYS_CONTEXT('USERENV','TERMINAL') from dual; #调用系统函数
SQL> select your_sequence.nextval from dual; #得到序列下一个值
SQL> select your_sequence.currval from dual; #得到序列当前值
SQL> select 7*9 from dual; #计算器
相关文章:
【Oracle】Oracle系列之七--表的创建与管理
文章目录 往期回顾前言1. 表的创建2. 表的修改3. 表中数据的增删改查(1)插入数据(2)删除数据(3)更新数据 4. 表的Merge5. 表的删除6. 表的重命名7. 表的索引(1)B树索引(2…...
C/C++运算符超详细讲解(系统性学习day5)
目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念: 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…...
Android 遍历界面所有的View
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…...
建筑能源管理(1)——建筑能源管理的概念
1、什么是建筑能源管理 目前,主要有三种不同的类型能源管理: (1)节约型能源管理 又称“减少能耗型”能源管理。这种管理方式着眼于能耗数量上的减少,采取限制用能的措施。例如,在非人流高峰时段停开部分电梯、在室外气温特别高时…...
SpringSecurity
明文存储密码,前加{noop}...
C++ vector模拟实现
目录 一.默认成员函数 二.扩容相关函数 三.[]重载 四.修改函数 五.迭代器 继上次写完string之后,可以写一个vector练练手以及熟悉其底层。vector是一个顺序表,相比普通数组不同点在于顺序表的数据必须是连续存放的。 一.默认成员函数 string是只存放字符…...
BUUCTF:[GYCTF2020]FlaskApp
Flask的网站,这里的功能是Base64编码解码,并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN,那应该是开启了Debug模式的,解密栏那里随便输入点什么报错看看,直接报错了,并且该Flask开启了Debug模式&am…...
好玩的调度技术
好玩的调度技术 文章目录 好玩的调度技术前言一、乱金柝-空间剥离二、拖拽编辑三、全端兼容 前言 最近感觉自己抑郁了,生态技术实在太庞大太复杂,所以我决定先停一段时间,在停下写生态的这两天写了几个调度的小玩意换换脑子,很有…...
Android 自定义加解密播放音视频(m3u8独立加密)
文章目录 背景加密流程音视频解密音视频播放结语 背景 当涉及App内部视频的时候,我们不希望被别人以抓包的形式来爬取我们的视频大视频文件以文件方式整个加密的话需要完全下载后才能进行解密当前m3u8格式虽然支持加密,但是ts格式的小视频可以独立播放的…...
常见的文件格式
一、C:\fakepath\新建文本文档.txt [object String] 实现方式: <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…...
浏览器输入url后回车展开过程
当你在浏览器中输入一个URL并敲下回车后,浏览器会执行一系列步骤来访问并展示网页。下面是浏览器访问网页的一般流程: DNS解析:浏览器首先会提取URL中的主机名,然后向DNS服务器发送请求,将主机名解析为对应的IP地址。这…...
Docker 容器创建命令说明
使用命令如下: docker run -itd --name=cluster -v /home/ClusterApp/cluster:/home/ClusterApp/cluster --restart=always --privileged=true -p 12000:12000 python:3.8 命令说明: docker run 创建一个容器并运行 docker run --help 可以查看所有的参数: 命令中参数说明 -…...
西瓜书读书笔记整理(六)—— 第六章 支持向量机
第六章 支持向量机 6.1 间隔与支持向量6.1.1 什么是支持向量机6.1.2 支持向量与间隔6.1.3 支持向量机的求解过程 6.2 对偶问题(dual problem)6.2.1 什么是对偶问题6.2.2 如何求解支持向量机的对偶问题 6.3 核函数(kernel function)…...
蓝桥杯每日一题2023.9.23
4961. 整数删除 - AcWing题库 题目描述 分析 注:如果要进行大量的删除操作可以使用链表 动态求最小值使用堆,每次从堆中取出最小值的下标然后在链表中删除 注意long long 代码解释: while(k --){auto t q.top();q.pop();res t.first;i…...
C语言数组和指针笔试题(三)(一定要看)
目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个…...
leetcode11 盛水最多的容器
题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 示例 输入:[1,8,6,2,5,4,8,…...
进入数据结构的世界
数据结构和算法的概述 一、什么是数据结构二、什么是算法三、如何去学习数据结构和算法四、算法的时间复杂度和空间复杂度4.1 算法效率4.2 大O的渐进表示法4.3 时间复杂度4.4 空间复杂度4.5 常见复杂度对比 一、什么是数据结构 数据结构是计算机存储、组织数据的方式。&#x…...
stm32之看门狗
STM32 有两个看门狗,独立看门狗和窗口看门狗,独立看门狗又称宠物狗,窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同…...
纤维蛋白单体(FM)介绍
纤维蛋白单体(FM)是血栓形成的早期产物,是纤维蛋白原(Fibrinogen,Fbg)在凝血酶(Thrombin)的作用下,脱掉肽A(Fibrinopeptide A,Fp A)与…...
知识图谱实战导论:从什么是KG到LLM与KG/DB的结合实战
前言 本文侧重讲解: 什么是知识图谱LLM与langchain/数据库/知识图谱的结合应用 比如,虽说基于知识图谱的问答 早在2019年之前就有很多研究了,但谁会想到今年KBQA因为LLM如此突飞猛进呢 第一部分 知识图谱入门导论 //待更.. 第二部分 LLM与…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
