長期基於 Microsoft SQL Server 2000/2005 進行開發,轉向 Oracle 10g 不僅是語法的切換,更是對關係型數據庫核心——結構化查詢語言(SQL)的系統性重審。通過研讀《Oracle Database 10g SQL Master SQL and PL/SQL》,我將碎片化的經驗串聯成完整知識體系,體會到「沒有任何技術是憑空而來」的真諦:扎實的知識結構才是技術人員走得遠的基石。
嚴格意義上的三層架構(表現層、業務邏輯層、數據訪問層)要求層間無實際依賴。SQL 標準化使得:
-- 創建表
CREATE TABLE employees (
emp_id NUMBER(6) PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(8,2) CHECK (salary > 0),
dept_id NUMBER(4) REFERENCES departments(dept_id)
) TABLESPACE users PCTFREE 10;
-- 修改表結構
ALTER TABLE employees ADD (email VARCHAR2(100));
ALTER TABLE employees MODIFY (name VARCHAR2(80));
ALTER TABLE employees DROP COLUMN email;
ALTER TABLE employees RENAME COLUMN emp_id TO employee_id;
RENAME employees TO staff; -- 修改表名
-- 註釋
COMMENT ON TABLE staff IS '員工基本信息表';
COMMENT ON COLUMN staff.name IS '員工姓名';
-- 插入(支援序列自增)
INSERT INTO staff (employee_id, name, salary, dept_id)
VALUES (seq_staff.NEXTVAL, '張三', 8500.00, 10);
-- 批量插入
INSERT INTO staff (employee_id, name, salary, dept_id)
SELECT seq_staff.NEXTVAL, ename, sal, deptno FROM emp_backup;
-- 更新(多表關聯更新)
UPDATE staff s
SET (s.salary, s.dept_id) = (
SELECT b.new_sal, b.new_dept
FROM bonus_adjust b
WHERE b.emp_id = s.employee_id
)
WHERE EXISTS (SELECT 1 FROM bonus_adjust b WHERE b.emp_id = s.employee_id);
-- 刪除(條件刪除)
DELETE FROM staff WHERE hire_date < DATE '2010-01-01';
COMMIT 提交或 ROLLBACK 回滾。TRUNCATE TABLE 為 DDL,隱式提交,高速釋放空間,不可回滾。REGEXP_LIKE、REGEXP_SUBSTR、REGEXP_REPLACE、REGEXP_INSTR。ROW_NUMBER、RANK、DENSE_RANK、LAG/LEAD、FIRST/LAST_VALUE 等支援窗口子句。AS OF TIMESTAMP、VERSIONS BETWEEN 實現歷史數據查詢。JOIN ... ON 而非 (+)),僅在必要時使用 Oracle 專有擴展。MERGE 替換 INSERT+UPDATE)提升可維護性與性能。技術成長沒有捷徑,唯有在長期實踐中不斷完善知識體系、形成自覺學習習慣,才能從「會用」進化為「精通」。希望本文對正在經歷類似轉型的開發者有所啟發。