Oracle系列之七:表的创建与管理

news2024/11/24 15:36:21

Oracle表的创建与管理

  • 1. 表的创建
  • 2. 表的修改
  • 3. 表中数据的增删改查
  • 4. 表的Merge
  • 5. 表的删除
  • 6. 表的重命名
  • 7. 表的索引
  • 8. 表的约束
  • 9. dual表

表是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是数据类型,NULLNOT 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%时,可再次插入数据(PCTFREEPCTUSED之和越接近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)

在这里插入图片描述
其中,insertupdate是可选的,UPDATEINSERT后面可以跟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;

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; #计算器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像处理:双边滤波算法

今天主要是回顾一下双边滤波,我曾经在这篇——图像处理:推导五种滤波算法中推导过它,其中包含了我自己写的草稿图。 目录 双边滤波算法原理 (1)空间域核 (2)值域核 理解双边滤波 空域权重​…

Reactor模型在库存指令模块中的运用

Reactor是一种高性能网络模型,在netty、redis、nginx、kafaka、memcached等重要组件,以及唯品会自研的OSP框架都有应用,Reactor模型在提升性能和解耦方面都做得非常好,其编程思想也可以运用到业务系统的开发当中,本文主…

VUE:常见的面试题和答案

1. Vue组件的生命周期有哪些,它们的执行顺序是什么? 答:Vue组件的生命周期包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy和destroyed等。它们的执行顺序如下: beforeCreate -> created ->…

21从零开始学Java之while与do-while循环的用法有什么不同?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家讲解了循环的概念,并重点给大家讲解了for循环的使用…

腾讯轻联流程运行错误如何排查问题?

我们在使用腾讯轻联时,会发现有些流程并没有运行成功,例如我们希望数据可以及时同步到腾讯文档,流程也有执行,但是却执行失败了,那么如何排查问题呢? 其中有几类常见问题 1. 流程不运行的问题请查看&…

【WCH】基于STM32F1标准库程序烧录到CH32F203中运行方法

【WCH】基于STM32标准库程序烧录到CH32F203中运行方法📌相关篇《关于CH32F203程序下载方式说明》 ✨看到CH32F203手册上写的该芯片也是ARM Cortex-M3内核,那么上层代码应该也是兼容的,为例证实这一点,开干,先来一个简单…

C++---状态机模型---大盗阿福(每日一道算法2023.4.11)

注意事项: 建议先了解状态机的基本定义:状态机-百度百科。 题目: 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N 家店铺,每家店中都有一些现金。 阿福事先调查得知&…

实验手册 - 第8周DataFrame API/Spark SQL

目录标题实验1实验内容绘制散点图将数据保存到MySQL# import os # os.getcwd() import findspark findspark.init() from pyspark.sql import SparkSessionspark SparkSession.builder.getOrCreate()实验1 实验内容 通过DataFrame API或者Spark SQL对数据源进行修改列类型、…

malloc hook进行内存泄漏检测

记录下使用malloc的hook形式,写个小的demo,并记录遇到的问题 1. 实现代码: CMakeLists.txt和相应的memory_leak.cpp文件 cmake_minimum_required(VERSION 3.14) project(demo)set(_SRCmemory_leak.cpp)add_library(memory_leak SHARED ${_S…

不要轻视Facebook Messenger的客户服务

大多数现代品牌都意识到,在客户最活跃的数字渠道中保持活跃至关重要。如今全球有超过 2亿人使用社交消息应用程序与他人在线联系。特别是Facebook Messenger,每月有1亿用户 -占世界人口的3%! 有这么多人使用Facebook Messenger,通…

UE5.1.1创建C++工程失败解决办法

闲来无事,更新了一下UE5.1.1,妈蛋创建C项目居然失败, 错误截图如下: 妈蛋,后面一堆乱码,鬼知道是啥错误! 咋解决?步步高打火机,直接复制第一段的Running后面的代码到cmd…

仿真创新大赛—国三省一 智能鱼缸(proteus)(stm32)

⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩去年下半年参加了全国仿真创新大赛,也是取得了国赛三等奖,省赛一等奖的好成绩。 ⏩本篇文章对我们的参赛作品《智能鱼缸》做一个简介。 ⏩感…

UE4/5多人游戏详解(加入游戏会话,数值key和value,寻找IP地址)

目录 加入游戏会话 找到会话 加入会话 代码: 设置会话key和value 代码: 在寻找会话中添加匹配: 代码: 寻找IP地址: 代码: 回调函数onJoinSessionComplete实现: 代码: 测试…

分立机器基站接入核心网并调试可用解决之路

问题描述 在两台机器上,分别为服务器A与主机B,其中服务器A上部署OAI核心网,主机B上部署容器版ueransim。两机器用一根网线连接。两台机器的连接如此:但是ueransim无法接入核心网。 解决思路1——机器网卡设置到192.168.70.0网段…

常用AI网站精简版

1.ChatGPT:ChatGPThttps://chat.openai.com/ 2.Discord社区:(AI绘图midjourney)Discord | Midjourney AI生图https://discord.com/channels/@me3.文心一言:

套利策略样本外跟踪

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 专享策略No.2 | 商品股指通用套利策略(一) 日线版本: 15分钟版本: 专享02模型开发步骤: 1.计算套利品种价比的高开低收,不是价差。 2.计…

231:vue+openlayers绘制点、点击此点弹出坐标复制和取消功能

第231个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目绘制点、点击此点弹出坐标复制和取消功能,这里面的复制功能采用了ue-clipboard2插件。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 示例效果 配置方式 1)查看基础设置:ht…

【数据挖掘与商务智能决策】第八章 K近邻算法

第八章 K近邻算法 1.K近邻算法简单代码演示 import pandas as pd df pd.read_excel(葡萄酒.xlsx) df原始样本酒精含量(%)苹果酸含量(%)分类0样本15201样本26102样本34103样本48314样本51021 # 特征变量和目标变量的切分 X_train df[[酒精含量(%),苹果酸含量(%)]] y_train …

安灯电子看板实时反馈产线上的生产状态

安灯电子看板是一种用于显示生产线运行情况的电子显示设备。它可以实时显示生产线的运行状态、异常信息以及工人的呼叫请求等信息,以便管理人员及时采取措施,保证生产线的正常运行。 安灯电子看板可以实现对生产线上各个环节的实时监控,并能够…

AutoGPT使用

windows和mac都可以使用 1,安装python 10 https://www.tutorialspoint.com/how-to-install-python-in-windows 2,下载AutoGPT代码 通过git克隆AutoGPT项目,git clone https://github.com/Torantulino/Auto-GPT.git如果没有安装git的同学就…