首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL四大語言分類與DML/DDL核心操作實戰指南

     編輯:Oracle 資料庫基礎

SQL四大語言分類架構

類別全稱核心指令核心職能
DQLData Query LanguageSELECT資料查詢
DMLData Manipulation LanguageINSERT/UPDATE/DELETE/MERGE資料操縱
DDLData Definition LanguageCREATE/ALTER/DROP/TRUNCATE/RENAME結構定義
DCLData Control LanguageGRANT/REVOKE權限控制

本文深度聚焦DML與DDL實戰操作。

一、DML核心操作詳細解析

1. INSERT資料插入

-- 完整欄位列表(推薦,結構變更不影響)
INSERT INTO customers(cust_id, state, post_code) 
VALUES ('ARIEL', NULL, '94501');

-- 省略欄位(按COLUMN_ID順序,風險高)
INSERT INTO customers VALUES ('ARIEL', NULL, '94501');

-- 子查詢插入
INSERT INTO dept_summary(deptno, emp_cnt, avg_sal)
SELECT deptno, COUNT(*), AVG(sal) FROM emp GROUP BY deptno;

關鍵規則: 值數量/型別與欄位對應、隱式轉換風險、NULL關鍵字與空字串語意不同。

2. UPDATE資料更新

-- 單表更新
UPDATE order_rollup 
SET (qty, price) = (
  SELECT SUM(qty), SUM(price) 
  FROM order_lines 
  WHERE customer_id = 'KOHL'
)
WHERE cust_id = 'KOHL' 
AND order_period = TO_DATE('01-OCT-2000');

-- 多表更新(Oracle專有)
UPDATE (
  SELECT e.sal AS old_sal, b.bonus_rate
  FROM emp e, bonus_policy b
  WHERE e.deptno = b.deptno
) SET old_sal = old_sal * (1 + bonus_rate);

3. DELETE資料刪除

DELETE FROM po_lines 
WHERE ship_to_state IN ('TX','NY','IL') 
AND order_date < SYSDATE - 365;

風險控制: 生產環境DELETE前必須先SELECT驗證、備份邏輯備份、考慮WHERE ROWNUM <= N分批刪除。

4. TRUNCATE TABLE:DDL層面的極速清空

TRUNCATE TABLE [schema.]table [DROP|REUSE STORAGE];
特性DELETETRUNCATE
語言類別DMLDDL
速度逐行刪除,產生UNDO/REDO極快,重置High Water Mark
回滾可ROLLBACK不可回滾(隱式COMMIT)
觸發器觸發DELETE觸發器不觸發
高水位線不重置重置至初始
外鍵約束受限制父表不可TRUNCATE
空間釋放DROP STORAGE預設釋放REUSE STORAGE保留

5. SELECT FOR UPDATE:行級鎖定

SELECT * FROM emp WHERE deptno = 10 FOR UPDATE [NOWAIT|WAIT n|SKIP LOCKED];

鎖定查詢行,阻塞其他Session UPDATE/DELETE/SELECT FOR UPDATE,允許單純SELECT。

6. LOCK TABLE:表級鎖定

LOCK TABLE inventory IN EXCLUSIVE MODE;  -- 排他鎖
LOCK TABLE inventory IN SHARE MODE;      -- 共享鎖

阻塞該表上所有DML操作,適用於批次維護窗口。

二、DDL核心操作與最佳實踐

物件建立與修改原則

  • 命名規範: 統一前綴、有意義名稱、長度<30字元
  • 儲存參數: 明確指定TABLESPACE、PCTFREE、INITRANS、STORAGE子句
  • 約束策略: PK/FK/UK/NOT NULL/CHECK盡在建表時定義,啟用索引支援
  • 註釋文檔: COMMENT ON TABLE/COLUMN ... IS '...' 建立數據字典

常見DDL操作模式

-- 增加欄位(線上操作,11g+支援DEFAULT值元數據更新)
ALTER TABLE emp ADD (email VARCHAR2(100) DEFAULT 'unknown@company.com');

-- 修改欄位(注意資料相容性)
ALTER TABLE emp MODIFY (salary NUMBER(10,2) NOT NULL);

-- 刪除欄位(12c+支援SET UNUSED延遲物理刪除)
ALTER TABLE emp DROP COLUMN old_flag;

-- 重命名
RENAME old_table TO new_table;
ALTER TABLE emp RENAME COLUMN ename TO emp_name;

三、實戰避坑指南

⚠ 高危操作清單:
  • 無WHERE條件的UPDATE/DELETE → 全表修改/刪除
  • 生產庫直接DROP TABLE → 資料永久遺失
  • 大表ALTER TABLE ADD COLUMN NOT NULL無DEFAULT → 鎖表久、易失敗
  • TRUNCATE父表 → ORA-02266錯誤
  • DDL隱式COMMIT打破事務邊界 → 邏輯不一致

四、效能優化建議

  • 批次DML使用FORALL + BULK COLLECT,減少Context Switch
  • 大量INSERT採用APPEND Hint + NOLOGGING(配合備份策略)
  • 分區表利用PARTITION EXTENSION語法精準操作分區
  • 統計資訊收集:DBMS_STATS.GATHER_TABLE_STATS 替代 ANALYZE

總結

掌握DML/DDL的語法細節、行為差異(特別是DELETE vs TRUNCATE、DML vs DDL隱式提交)、鎖機制與效能特徵,是資料庫開發與管理的核心基本功。建立標準化操作手冊,嚴格執行變更管理流程,可消除90%以上的人為操作風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved