Oracle 數據庫數據操作:精通 INSERT, UPDATE, DELETE

作者:IvanCodes
日期:2025年6月18日
專欄:Oracle教程

在 Oracle 數據庫中,對表內數據進行增加、修改和刪除操作是通過數據操作語言 (DML - Data Manipulation Language) 來完成的。核心的DML語句包括 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 ALLINTO 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 ALLINTO employees (employee_id, first_name, last_name, email, salary) VALUES (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)
可以將一個 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_id101 的員工薪水增加 10%:

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

修改 employee_id103 的員工的 first_namesalary

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_salFROM departments_avg_salary dWHERE e.department_id = d.department_id) -- 假設employees表有department_id
WHERE EXISTS (SELECT 1FROM departments_avg_salary dWHERE e.department_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_id105 的員工記錄:

DELETE FROM employees
WHERE employee_id = 105;

刪除所有薪水低于40000的員工:

DELETE FROM employees
WHERE salary < 40000;

3.2 刪除所有行 (謹慎使用)
代碼案例:

DELETE FROM employees;
-- 這會刪除employees表中的所有數據,但表結構依然存在。
-- 如果要快速清空表并且不需要DML的回滾能力,TRUNCATE TABLE employees; 效率更高。

重要提示: 所有的 INSERT, UPDATE, DELETE 操作在默認情況下(取決于您的客戶端工具設置,如SQL*Plus或SQL Developer)不是自動提交的。您需要顯式使用 COMMIT 命令來永久保存更改,或者使用 ROLLBACK 命令來撤銷未提交的更改。如果不提交就關閉會話,未提交的更改通常會自動回滾

總結: INSERT, UPDATE, DELETE日常數據庫操作核心。務必理解它們的語法,特別是 WHERE 子句在 UPDATEDELETE 中的重要性,以避免意外修改或刪除數據


練習題

背景表結構:
假設我們有以下兩個表:

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; 撤銷操作,除非題目特別說明不需要。)

題目:

  1. products 表中插入一條新產品記錄:product_id=1, product_name=‘Super Laptop’, category=‘Electronics’, price=1200.50, stock_quantity=50。
  2. products 表中插入一條新產品記錄,只提供 product_id=2, product_name=‘Basic Mouse’, category=‘Accessories’。假設 price 和 stock_quantity 允許為空或有默認值。
  3. 創建一個名為 special_offers 的新表,其結構包含 product_id, product_name, offer_price。然后從 products 表中選擇所有 category 為 ‘Electronics’ 且 price 大于1000的產品,將其 product_id, product_name 以及 price * 0.9 (作為 offer_price) 插入到 special_offers 表中。(只需寫INSERT INTO…SELECT部分,假設special_offers表已創建)。
  4. products 表中 product_id 為 1 的產品的 price 更新為 1150.00,并將 stock_quantity 減少 5。
  5. products 表中所有 category 為 ‘Accessories’ 的產品的 price 提高10%。
  6. 刪除 products 表中 stock_quantity 為 0 的所有產品記錄。
  7. orders 表中插入一條新的訂單記錄:order_id=1001, product_id=1, customer_name=‘John Smith’, order_date=當前系統日期, quantity_ordered=2。
  8. 更新 orders 表中 order_id 為 1001 的訂單,將其 quantity_ordered 修改為 3。
  9. 假設由于產品 product_id=2 已停產,需要刪除 orders 表中所有與該產品相關的訂單記錄。
  10. 清空 orders 表中的所有數據,但保留表結構。

答案與解析:

  1. 插入新產品到 products
INSERT INTO products (product_id, product_name, category, price, stock_quantity)
VALUES (1, 'Super Laptop', 'Electronics', 1200.50, 50);
  • 解析: 使用了標準的 INSERT INTO ... VALUES 語句,明確指定了所有列名和對應的值。
  1. 插入部分列到 products
INSERT INTO products (product_id, product_name, category)
VALUES (2, 'Basic Mouse', 'Accessories');
  • 解析: 只為指定的列提供了值。未指定的 pricestock_quantity 列將根據表定義獲得默認值或 NULL
  1. 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 表的列對應插入。
  1. 更新特定產品信息:
UPDATE products
SET price = 1150.00,stock_quantity = stock_quantity - 5
WHERE product_id = 1;
  • 解析: 使用 UPDATE 語句,SET 子句指定了要修改的多個列及其新值。WHERE 子句精確定位到 product_id 為 1 的記錄。
  1. 批量更新產品價格:
UPDATE products
SET price = price * 1.10
WHERE category = 'Accessories';
  • 解析: WHERE 子句篩選出所有類別為 ‘Accessories’ 的產品,然后它們的 price 被更新為原價格的1.1倍。
  1. 刪除庫存為0的產品:
DELETE FROM products
WHERE stock_quantity = 0;
  • 解析: DELETE 語句通過 WHERE 子句找到所有 stock_quantity 為 0 的記錄并刪除它們。
  1. 插入新訂單到 orders
INSERT INTO orders (order_id, product_id, customer_name, order_date, quantity_ordered)
VALUES (1001, 1, 'John Smith', SYSDATE, 2);
  • 解析: 插入新的訂單記錄。SYSDATE 是 Oracle 獲取當前系統日期和時間的函數。
  1. 更新特定訂單數量:
UPDATE orders
SET quantity_ordered = 3
WHERE order_id = 1001;
  • 解析: UPDATE 語句根據 order_id 定位到特定訂單,并修改其 quantity_ordered
  1. 刪除特定產品的所有訂單:
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)。
  1. 清空 orders 表數據:
DELETE FROM orders;
  • 解析: 由于沒有 WHERE 子句,此 DELETE 語句將刪除 orders 表中的所有行。表結構會保留。
  • 更高效的替代方案 (不可回滾,但更快,且是DDL操作): TRUNCATE TABLE orders;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

推薦使用的Unity插件(InputSystem)

本文將提供更簡潔的步驟和常見問題解決。 一、極簡入門步驟&#xff1a; 安裝&#xff1a;Package Manager中安裝Input System&#xff08;確保Unity版本在2019.4&#xff09; 創建Input Actions&#xff1a; 在Project窗口右鍵 -> Create -> Input Actions 雙擊打開…

清理 Docker 容器日志文件方法

操作總結與問題解析 一、操作目的與背景 用戶旨在清理 Docker 容器日志文件以釋放服務器存儲空間,主要通過以下命令組合完成操作: 查看容器日志空間占用清空指定容器的日志文件驗證容器運行狀態與日志清理效果二、關鍵命令與輸出解析 1. 查看 Docker 容器日志空間占用 du…

圖片壓縮工具 | 按指定高度垂直切割圖片

OPEN-IMAGE-TINY&#xff0c;一個基于 Electron VUE3 的圖片壓縮工具&#xff0c;項目開源地址&#xff1a;https://github.com/0604hx/open-image-tiny ?? 需求描述 在上一篇文章一段代碼利用 snapdom 將 CSDN 博文轉化為長圖片&#xff08;PNG/JPG/PDF&#xff09;中&…

山東大學軟件學院創新項目實訓開發日志——第十七周(二)

目錄 1.優化前端日歷頁面顯示&#xff0c;增加鼠標懸停顯示當日會議基本信息的效果。 2.優化會議計劃生成與會議PPT生成功能&#xff0c;使得能夠加載多頁docx文件與PDF文件 3.優化了會議PPT生成功能&#xff0c;使得可以上傳多個文件并根據多個文件生成會議PPT 4.修改了識…

Ubuntu 使用kubeadm部署k8s系統組件反復重啟的問題

系統&#xff1a;Ubuntu 24.04 LTS 問題現象&#xff1a;kubeadm init 后系統組件proxy、apiserver、etcd等頻繁掛掉重啟 問題原因&#xff1a;cgroup配置問題 解決方法&#xff1a; 編輯系統cgroup默認配置文件 sudo nano /etc/default/grub 將GRUB_CMDLINE_LINUX_DEFAU…

Oracle獲取執行計劃之EXPLAIN PLAN 技術詳解

#Oracle #執行計劃 #EXPLAIN PLAN 一、引言 在Oracle數據庫性能優化中&#xff0c;?執行計劃&#xff08;Execution Plan&#xff09;?是理解SQL語句如何被數據庫處理的關鍵工具。EXPLAIN PLAN是Oracle提供的一種靜態分析SQL執行路徑的方法&#xff0c;它通過生成邏輯執行…

【論文閱讀】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模態大模型 多模態大模型MultiModal Large Language Models (MM-LLMs) 的發展可以通過一篇綜述了解&#xff1a;MM-LLMs: Re…

vue中computed和watch區別

在 Vue 中&#xff0c;computed 和 watch 都是用來響應式地處理數據變化的工具&#xff0c;但它們的用途和行為有明顯區別。 &#x1f50d; 一句話總結 computed&#xff1a;用于聲明式計算屬性&#xff0c;有緩存。 watch&#xff1a;用于監聽響應式數據的變化并執行副作用邏…

大語言模型:提示詞決定自我反思效果: “檢查回答是否錯誤” “驗證回答是否正確”

大語言模型(LLMs)自我反思的結果很容易受提示詞構造的影響 大型語言模型(LLMs)展現出令人印象深刻的零樣本和少樣本推理能力。有人提出,這些能力可以通過自我反思來提升,即讓大型語言模型反思自己的輸出,以識別和糾正初始回答中的錯誤。然而,盡管有一些證據表明自我反…

【iReport】實際開發中,解決iReport中打印圖片不顯示問題

ireport 中增加圖片&#xff0c;添加上屬性&#xff0c;但是運行時報錯如下&#xff0c;是屬性logoPath沒有聲明到map中 1. Parameter not found : logoPath net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not fo…

【MySQL進階】常用MySQL程序

目錄 一. mysqlcheck——表維護程序 1.1.作用 1.2 注意事項 1.3 使用方法 1.4 常用選項 1.5 mysqlcheck的特殊使用 二. mysqldump——數據庫備份程序 2.1.作用 2.2 注意事項 2.3 使用方法 2.4 常用選項 三. mysqladmin——MySQL 服務器管理程序 3.1.作用 3.2 使用…

EMQX高效存儲消息到MySQL指南

配置 EMQX 存儲消息到 MySQL EMQX 可以通過規則引擎和數據橋接功能將消息和事件存儲到 MySQL 數據庫。以下是具體實現方法&#xff1a; 創建 MySQL 數據表 在 MySQL 中創建用于存儲消息的表結構&#xff1a; CREATE TABLE mqtt_messages (id int(11) NOT NULL AUTO_INCREME…

springboot項目,利用docker打包部署

Windows WSL2 Docker Desktop 部署 SpringBoot 項目指南 &#xff08;沒有安裝docker的&#xff0c;如果是windows家庭中文版的&#xff0c;可以看我上一篇帖子&#xff1a;windows家庭版安裝docker和redis-CSDN博客&#xff09; 本教程將說明如何在 Windows 系統 下&#…

MO+內核32位普冉單片機PY32F003開發板

PY32F003開發板是基于普冉半導體PY32F003微控制器設計的低成本入門級開發工具&#xff0c; PY32F003系列微控制器采用高性能的 32 位ARM Cortex-M0內核&#xff0c;寬電壓工作范圍的 MCU。嵌入高達32Kbytes flash 和 4Kbytes SRAM 存儲器&#xff0c;最高工作頻率 32MHz。PY32…

MySql 用存儲過程刪除所有用戶表

用拼接語句總是會出問題 -- 1. 禁用外鍵約束&#xff08;防止級聯刪除失敗&#xff09;[1]() SET SESSION FOREIGN_KEY_CHECKS 0; -- 2. 生成并執行刪除語句&#xff08;替換 your_database_name&#xff09; SELECT CONCAT(DROP TABLE IF EXISTS , TABLE_NAME, ;) -- 預覽語…

Java八股文——MySQL「鎖篇」

講一下MySQL里有哪些鎖&#xff1f; 面試官您好&#xff0c;MySQL中的鎖機制非常豐富&#xff0c;它是保證數據一致性和并發安全的核心。我通常會從鎖的粒度&#xff08;加鎖范圍&#xff09; 和鎖的模式&#xff08;功能&#xff09; 這兩個維度來理解它們。 第一維度&#…

B站精品課程

【Python并發編程】線程&#xff0c;進程&#xff0c;協程&#xff0c;線程安全&#xff0c;多線程&#xff0c;死鎖&#xff0c;線程池等與案例解析&#xff0c;從入門到精通 https://www.bilibili.com/video/BV1EfdcYmEff/?spm_id_from333.337.search-card.all.click&v…

# ubuntu中安裝使用五筆輸入法

先 清理舊輸入法并重新安裝 fcitx5 五筆輸入法&#x1f447; &#x1f4e6; 第一步&#xff1a;清理舊的 Fcitx5 及相關輸入法組件 sudo apt purge fcitx* mozc* ibus* -y sudo apt autoremove --purge -y&#x1f4dd; 說明&#xff1a; fcitx* 會清除舊版本 Fcitx/Fcitx5。…

LSM樹與B+樹優缺點分析

1. LSM樹優化了順序寫&#xff0c;因此寫性能很好&#xff0c;但在查詢上&#xff1a; 需要從Level 0到Level n一直順序查下去。極端情況是LSM樹中不存在該數據&#xff0c;則需要遍歷L0->Ln&#xff0c;最后返回空集。 解決方法是用布隆過濾器優化查詢。 2. B樹范圍查詢性…

【成都魚住未來身份證】 身份證讀取與解析———未來之窗行業應用跨平臺架構——智能編程——仙盟創夢IDE

讀取身份證開發配置 function readerid魚住未來科技(){const webUrl http:// "127.0.0.1:30004" /api/info$.ajax({url: webUrl,type: GET,dataType: json,success: function (result) {// processContent.text(web api接口&#xff1a; webUrl 讀取身份證信息…