Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

2025-06-19 16:50

本文主要是介绍Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数...

oracle 数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言 (DML - Data Manipulation Language) 来完成的。核心的DML语句包括 INSERT (插入新数据), UPDATE (修改现有数据), 和 DELETE (删除数据)。掌握这些语句是数据库开发和管理的基础。

思维导图

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

一、插入数据 (INSERT)

INSERT 语句用于向表中添加新的行记录。

1.1 插入单行数据,指定所有列的值语法:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • table_name: 要插入数据的表名。
  • (column1, column2, ...): 可选。指定要插入数据的列名列表。如果省略此列表,则 VALUES 子句中必须提供表中所有列的值,并且顺序必须与表中列的定义顺序完全一致。
  • VALUES (value1, value2, ...): 提供要插入的具体值。值的顺序和类型必须与列名列表 (或表定义中的列顺序) 匹配。

代码案例:假设有一个 employees 表:

CREATE TABLE employees (
  employee_id NUMBER(6) PRIMARY KEY,
  first_name VARCHAR2(20),
  last_name VARCHAR2(25) NOT NULL,
  email VARCHAR2(25) NOT NULL UNIQUE,
  hire_date DATE DEFAULT SYSDATE,
  salary NUMBER(8,2)
);

插入一条完整的员工记录:

INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, salary)
VALUES (101, 'John', 'Doe', 'john.doe@example.com', TO_DATE('2023-01-15', 'YYYY-MM-DD'), 60000);

如果省略列名列表 (不推荐,除非非常清楚表结构且列顺序不会改变):

INSERT INTO employees
VALUES (102, 'Jane', 'Smith', 'jane.smith@example.com', TO_DATE('2023-02-20', 'YYYY-MM-DD'), 75000);

1.2 插入单行数据,指定部分列的值

如果某些列允许为 NULL 或有 DEFAULT 值,你可以只插入部分列的数据。

语法:

INSERT INTO table_name (column_a, column_b)
VALUES (value_a, value_b);

代码案例:插入一个员工,只提供必要信息,hire_date 使用默认值,salary 暂时不指定 (将为 NULL):

INSERT INTO employees (employee_id, first_name, last_name, email)
VALUES (103, 'Peter', 'Jones', 'peter.jones@example.com');

1.3 插入多行数据 (INSERT ALL)

Oracle 提供了 INSERT ALL 语句,可以一次性向一个或多个表中插入多行数据。

语法 (插入到同一张表的多行):

INSERT ALL
  INTO table_name (column1, column2, ...) VALUES (value1_row1, value2_row1, ...)
  INTO table_name (column1, column2, ...) VALUES (value1_row2, value2_row2, ...)
  ...
SELECT * FROM dual; -- dual是Oracle的虚拟表,这里用于触发INSERT ALL

代码案例:

INSERT ALL
  INTO employees (employee_id, first_name, last_name, email, salary) VALUE编程S (104, 'Alice', 'Wonder', 'alice.w@example.com', 55000)
  INTO employees (employee_id, first_name, last_name, email, salary) VALUES (105, 'Bob', 'Marley', 'bob.m@example.com', 62000)
SELECT * FROM dual;

1.4 从其他表插入数据 (INSERT INTO … SELECT)

php以将一个 SELECT 语句的查询结果直接插入到另一个表中。

语法:

INSERT INTO target_table (column1, column2, ...)
SELECT source_column1, source_column2, ...
FROM source_table
WHERE condition;

代码案例:假设有一个 employees_archive 表,结构与 employees 类似。将 employees 表中薪水低于50000的员工备份到 employees_archive

INSERT INTO employees_archive (employee_id, first_name, last_name, email, hire_date, salary)
SELECT employee_id, first_name, last_name, email, hire_date, salary
FROM employees
WHERE salary < 50000;

二、修改数据 (UPDATE)

UPDATE 语句用于修改表中已存在行的列值。

2.1 修改特定行的列值语法:

UPDATE table_name
SET column1 = value1,
    column2 = value2,
    ...
WHERE condition;
  • table_name: 要更新的表名。
  • SET column1 = value1, ...: 指定要修改的列及其新值。
  • WHERE condition: 非常重要!指定哪些行需要被更新。如果省略 WHERE 子句,表中所有行的指定列都会被更新,这通常是危险操作。

代码案例:将 employee_id 为 101 的员工薪水增加 10%:

UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = 101;

修改 employee_id 为 103 的员工的 first_name 和 salary

UPDATE employees
SET first_name = 'Pete',
    salary = 52000
WHERE employee_id = 103;

2.2 修改所有行的列值 (谨慎使用)代码案例:

给所有员工的薪水普调增加500 (假设所有员工都适用):

UPDATE employees
SET salary = salary + 500;
-- 再次强调:没有WHERE子句会更新所有行,操作前务必确认!

2.3 使用子查询更新数据

SET 子句中的值或 WHERE 子句中的条件可以来源于子查询。

代码案例:假设有一个 departments_avg_salary 表 (department_id, avg_sal)。将 employees 表中每个员工的薪水更新为其所在部门的平均薪水 (仅为示例,实际逻辑可能更复杂)。

-- 仅为语法示例,实际逻辑可能需要更复杂的关联更新
UPDATE employees e
SET e.salary = (SELECT d.avg_sal
                FROM departments_avg_salary d
                WHERE e.department_id = d.department_id) -- 假设employees表有department_id
WHERE EXISTS (SELECT 1
              FROM departments_avg_salary d
              WHERE e.departXYLuWment_id = d.department_id);

更常见的做法是使用 Oracle 的 MERGE 语句进行复杂的关联更新。

三、删除数据 (DELETE)

DELETE 语句用于从表中删除一行或多行记录。

3.1 删除特定行语法:

DELETE FROM table_name
WHERE condition;
  • table_name: 要删除数据的表名。
  • WHERE condition: 非常重要!指定哪些行需要被删除。如果省略 WHERE 子句,表中所有行都会被删除 (效果类似 TRUNCATE TABLE,但 DELETE 可以回滚,TRUNCATE 通常不行且更快,不过 TRUNCATE 不是本节重点)。

代码案例:删除 employee_id 为 105 的员工记录:

DELETE FROM employees
WHERE employee_id = 105;

删除所有薪水低于40000的员工:

DELETE FROM employees
WHERE salary < 40000;

3.2 删除所有行 (谨慎使用)代码案例:

DELETE FROM employees;
-- 这会删除employees表中的所有数据,但表结构依然存在。
-- 如果要快速清空表并且不需要DML的回滚能力,TRUNCATE TABLE employees; 效率更高。

重要提示: 所有的 INSERTUPDATEDELETE&npythonbsp;操作在默认情况下(取决于您的客户端工具设置,如SQL*Plus或SQL Developer)不是自动提交的。您需要显式使用 COMMIT 命令来永久保存更改,或者使用 ROLLBACK 命令来撤销未提交的更改。如果不提交就关闭会话,未提交的更改通常会自动回滚。

总结: INSERTUPDATEDELETE 是日常数据库操作的核心。务必理解它们的语法,特别是 WHERE 子句在 UPDATE 和 DELETE 中的重要性,以避免意外修改或删除数据。

练习题

背景表结构:假设我们有以下两个表:

create table products (
product_id NUMBER PRIMARY KEY, 
product_name VARCHAR2(100), 
category VARCHAR2(50), 
price NUMBER(8,2), 
stock_quantity NUMBER);
create table orders (
order_id NUMBER PRIMARY KEY, 
product_id NUMBER, 
customer_name VARCHAR2(100), 
order_date DATE, 
quantity_ordered NUMBER, 
FOREIGN KEY (product_id) REFERENCES products(product_id));

请为以下每个场景编写相应的SQL DML语句。 (提交您的DML语句后,记得使用 COMMIT; 保存更改,或 ROLLBACK; 撤销操作,除非题目特别说明不需要。)

题目:

  • 向 products 表中插入一条新产品记录:product_id=1, product_name=‘Super Laptop’, category=‘Electronics’, price=1200.50, stock_quantity=50。
  • 向 products 表中插入一条新产品记录,只提供 product_id=2, product_name=‘Basic Mouse’, category=‘Accessories’。假设 price 和 stock_quantity 允许为空或有默认值。
  • 创建一个名为 special_offers 的新表,其结构包含 product_id, product_name, offer_price。然后从 products 表中选择所有 category 为 ‘Electronics’ 且 price 大于1000的产品,将其 product_idproduct_name 以及 price * 0.9 (作为 offer_price) 插入到 special_offers 表中。(只需写INSERT INTO…SELECT部分,假设special_offers表已创建)。
  • 将 products 表中 product_id 为 1 的产品的 price 更新为 1150.00,并将 stock_quantity 减少 5。
  • 将 products 表中所有 category 为 ‘Accessories’ 的产品的 price 提高10%。
  • 删除 products 表中 stock_quantity 为 0 的所有产品记录。
  • 向 orders 表中插入一条新的订单记录:order_id=1001, product_id=1, customer_name=‘John Smith’, order_date=当前系统日期, quantity_ordered=2。
  • 更新 orders 表中 order_id 为 1001 的订单,将其 quantity_ordered 修改为 3。
  • 假设由于产品 product_id=2 已停产,需要删除 orders 表中所有与该产品相关的订单记录。
  • 清空 orders 表中的所有数据,但保留表结构。

答案与解析:

  • 插入新产品到 products
INSERT INTO products (product_id, product_name, category, price, stock_quantity)
VALUES (1, 'Super Laptop', 'Electronics', 1200.50, 50);
  • 解析: 使用了标准的 INSERT INTO ... VALUES 语句,明确指定了所有列名和对应的值。
  • 插入部分列到 products
INSERT INTO products (product_id, product_name, category)
VALUES (2, 'Basic Mouse', 'Accessories');
  • 解析: 只为指定的列提供了值。未指定的 price 和 stock_quantity 列将根据表定义获得默认值或 NULL
  • 从 products 插入到 special_offers:(假设 编程special_offers 表已创建,结构:product_id NUMBER, product_name VARCHAR2(100), offer_price NUMBER(8,2))
INSERT INTO special_offers (product_id, product_name, offer_price)
SELECT product_id, product_name, price * 0.9
FROM products
WHERE category = 'Electronics' AND price > 1000;
  • 解析: 使用 INSERT INTO ... SELECT 结构。SELECT 语句从 products 表筛选数据,并计算 offer_price。查询结果的列与 special_offers 表的列对应插入。
  • 更新特定产品信息:
UPDATE products
SET price = 1150.00,
    stock_quantity = stock_quantity - 5
WHERE product_id = 1;
  • 解析: 使用 UPDATE 语句,SET 子句指定了要修改的多个列及其新值。WHERE 子句精确定位到 product_id 为 1 的记录。
  • 批量更新产品价格:
UPDATE products
SET price = price * 1.10
WHERE category = 'Accessories';
  • 解析: WHERE 子句筛选出所有类别为 ‘Accessories’ 的产品,然后它们的 price 被更新为原价格的1.1倍。
  • 删除库存为0的产品:
DELETE FROM products
WHERE stock_quantity = 0;
  • 解析: DELETE 语句通过 WHERE 子句找到所有 stock_quantity 为 0 的记录并删除它们。
  • 插入新订单到 orders
INSERT INTO orders (order_id, product_id, customer_name, order_date, quantity_ordered)
VALUES (1001, 1, 'John Smith', SYSDATE, 2);
  • 解析: 插入新的订单记录。SYSDATE 是 Oracle 获取当前系统日期和时间的函数。
  • 更新特定订单数量:
UPDATE orders
SET quantity_ordered = 3
WHERE order_id = 1001;
  • 解析: UPDATE 语句根据 order_id 定位到特定订单,并修改其 quantity_ordered
  • 删除特定产品的所有订单:
DELETE FROM orders
WHERE product_id = 2;
  • 解析: DELETE 语句删除 orders 表中所有 product_id 为 2 的订单。由于 orders.product_id 有外键约束引用 products.product_id,如果 products 表中 product_id=2 的记录也需要删除,通常需要先删除 orders 中的相关记录 (或者外键设置了级联删除 ON DELETE CASCADE)。
  • 清空 orders 表数据:
DELETE FROM orders;
  • 解析: 由于没有 WHERE 子句,此 DELETE 语句将删除 orders 表中的所有行。表结构会保留。
  • 更高效的替代方案 (不可回滚,但更快,且是DDL操作): TRUNCATE TABLE orders;

到此这篇关于Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE的文章就介绍到这了,更多相关Oracle INSERT, UPDATE, DELETE内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155131

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别