Oracle?11g數(shù)據(jù)庫常用對(duì)象創(chuàng)建與管理方法詳解
引言
在Oracle數(shù)據(jù)庫的浩瀚世界里,數(shù)據(jù)本身固然重要,但如何高效地組織、訪問和管理這些數(shù)據(jù),才是發(fā)揮其強(qiáng)大威力的關(guān)鍵。這一切都離不開數(shù)據(jù)庫對(duì)象。無論是初入行的DBA還是后端開發(fā)人員,熟練掌握Oracle常用對(duì)象的創(chuàng)建與管理都是一項(xiàng)核心技能。
本文將帶您系統(tǒng)地了解Oracle 11g中幾種最常用的數(shù)據(jù)庫對(duì)象,包括表、視圖、序列、索引和同義詞。我們將通過清晰的語法示例和實(shí)用的管理技巧,助您夯實(shí)基礎(chǔ),提升數(shù)據(jù)庫操作能力。
一、表(Table):數(shù)據(jù)的基石
表是數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的基本單位,由行和列組成。設(shè)計(jì)良好的表結(jié)構(gòu)是高效數(shù)據(jù)庫系統(tǒng)的前提。
1. 創(chuàng)建表
使用 CREATE TABLE 語句,你需要定義列名、數(shù)據(jù)類型和約束。
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 NOT NULL,
salary NUMBER(8,2),
department_id NUMBER(4),
-- 定義外鍵約束,關(guān)聯(lián)到部門表
CONSTRAINT fk_dept_id
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
);關(guān)鍵點(diǎn):
數(shù)據(jù)類型:
NUMBER,VARCHAR2,DATE,CLOB,BLOB等。約束:
PRIMARY KEY,FOREIGN KEY,NOT NULL,UNIQUE,CHECK。約束保證了數(shù)據(jù)的完整性和一致性。
2. 管理表
修改表(ALTER TABLE): 用于添加、修改或刪除列,以及添加或刪除約束。
-- 添加新列 ALTER TABLE employees ADD (phone_number VARCHAR2(15)); -- 修改列數(shù)據(jù)類型 ALTER TABLE employees MODIFY (salary NUMBER(9,2)); -- 刪除列 ALTER TABLE employees DROP COLUMN phone_number; -- 添加約束 ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary > 0);
- 刪除表(DROP TABLE):
DROP TABLE employees; -- 謹(jǐn)慎使用!會(huì)刪除表結(jié)構(gòu)和所有數(shù)據(jù)。 DROP TABLE employees CASCADE CONSTRAINTS; -- 同時(shí)刪除與之相關(guān)的引用完整性約束
- 重命名表(RENAME):
RENAME employees TO emp_backup;
- 截?cái)啾恚═RUNCATE TABLE): 快速刪除表中所有數(shù)據(jù),不可回滾,并釋放表空間。
TRUNCATE TABLE emp_backup;
二、視圖(View):虛擬的邏輯窗口
視圖是基于一個(gè)或多個(gè)表的查詢結(jié)果集。它本身不存儲(chǔ)數(shù)據(jù),像一個(gè)預(yù)定義的查詢窗口,簡化了復(fù)雜查詢,增強(qiáng)了數(shù)據(jù)安全性。
1. 創(chuàng)建視圖
CREATE OR REPLACE VIEW vw_emp_dept AS
SELECT e.employee_id,
e.first_name || ' ' || e.last_name AS full_name,
e.salary,
d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > 10000;
2. 管理視圖
查詢視圖: 像查詢普通表一樣。
SELECT * FROM vw_emp_dept;
- 刪除視圖:
DROP VIEW vw_emp_dept;
優(yōu)點(diǎn):
簡化操作: 將復(fù)雜的多表查詢封裝成一個(gè)簡單的視圖。
安全性: 可以只暴露視圖中的特定列給用戶,隱藏敏感數(shù)據(jù)。
邏輯獨(dú)立性: 即使底層表結(jié)構(gòu)發(fā)生變化,只需修改視圖定義,而不影響應(yīng)用程序。
三、序列(Sequence):自動(dòng)編號(hào)發(fā)生器
序列是一個(gè)數(shù)據(jù)庫對(duì)象,用于生成唯一的、連續(xù)的整數(shù)編號(hào),通常為主鍵字段提供值。
1. 創(chuàng)建序列
CREATE SEQUENCE seq_emp_id INCREMENT BY 1 -- 每次增加1 START WITH 1000 -- 從1000開始 NOMAXVALUE -- 無最大值(或 MAXVALUE 9999) NOCYCLE -- 不循環(huán) CACHE 20; -- 緩存20個(gè)序列值以提高性能
2. 使用序列
NEXTVAL: 獲取序列的下一個(gè)值。CURRVAL: 獲取序列的當(dāng)前值(必須先使用NEXTVAL)。
INSERT INTO employees (employee_id, first_name, last_name, email) VALUES (seq_emp_id.NEXTVAL, '張', '三', 'zhangsan@example.com'); SELECT seq_emp_id.CURRVAL FROM dual;
3. 管理序列
-- 修改序列(不能修改START WITH,通常用于修改增量、緩存值等) ALTER SEQUENCE seq_emp_id INCREMENT BY 2; -- 刪除序列 DROP SEQUENCE seq_emp_id;
四、索引(Index):加速查詢的引擎
索引是一種提高數(shù)據(jù)檢索速度的數(shù)據(jù)庫結(jié)構(gòu),類似于書的目錄。
1. 創(chuàng)建索引
單列索引:
CREATE INDEX idx_emp_last_name ON employees(last_name);
- 復(fù)合索引:
CREATE INDEX idx_emp_dept_salary ON employees(department_id, salary DESC);
- 唯一索引:(通常由UNIQUE或PRIMARY KEY約束自動(dòng)創(chuàng)建,也可手動(dòng))
CREATE UNIQUE INDEX idx_emp_email ON employees(email);
2. 管理索引
-- 重建索引(優(yōu)化索引性能) ALTER INDEX idx_emp_last_name REBUILD; -- 刪除索引 DROP INDEX idx_emp_last_name;
索引使用場(chǎng)景:
經(jīng)常出現(xiàn)在
WHERE、JOIN、ORDER BY子句中的列。表的數(shù)據(jù)量很大。
注意事項(xiàng):
索引會(huì)占用存儲(chǔ)空間。
會(huì)降低
INSERT,UPDATE,DELETE數(shù)據(jù)的速度,因?yàn)樗饕残枰S護(hù)。
五,作業(yè)
1.Views表:
| Column Name | Type |
| article_id | int |
| author_id | int |
| viewer_id | int |
| view_date | data |
此表可能會(huì)存在重復(fù)行。(換句話說,在 SQL 中這個(gè)表沒有主鍵)
此表的每一行都表示某人在某天瀏覽了某位作者的某篇文章。
請(qǐng)注意,同一人的 author_id 和 viewer_id 是相同的。
請(qǐng)查詢出所有瀏覽過自己文章的作者。
結(jié)果按照作者的 id 升序排列。
查詢結(jié)果的格式如下所示:
輸入:
-- 創(chuàng)建 Views 表
CREATE TABLE Views (
article_id INT,
author_id INT,
viewer_id INT,
view_date DATE
);
-- 插入示例數(shù)據(jù)
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (1, 3, 5, DATE '2019-08-01');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (1, 3, 6, DATE '2019-08-02');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (2, 7, 7, DATE '2019-08-01');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (2, 7, 6, DATE '2019-08-02');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (4, 7, 1, DATE '2019-07-22');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (3, 4, 4, DATE '2019-07-21');
INSERT INTO Views (article_id, author_id, viewer_id, view_date) VALUES (3, 4, 4, DATE '2019-07-21');
-- 查詢驗(yàn)證
SELECT * FROM Views;輸入結(jié)果:

輸出:
SELECT DISTINCT author_id AS id FROM Views WHERE author_id = viewer_id ORDER BY author_id;
輸出結(jié)果:

2、表:Tweets
| Column Name | Type |
| tweet_id | int |
| content | varchar |
在 SQL 中,tweet_id 是這個(gè)表的主鍵。
content 只包含字母數(shù)字字符,'!',' ',不包含其它特殊字符。
這個(gè)表包含某社交媒體 App 中所有的推文。
查詢所有無效推文的編號(hào)(ID)。當(dāng)推文內(nèi)容中的字符數(shù)嚴(yán)格大于 15 時(shí),該推文是無效的。
以任意順序返回結(jié)果表。
查詢結(jié)果格式如下所示:
輸入:
-- 創(chuàng)建 Tweets 表
CREATE TABLE Tweets (
tweet_id INT PRIMARY KEY,
content VARCHAR2(4000)
);
-- 插入示例數(shù)據(jù)
INSERT INTO Tweets (tweet_id, content) VALUES (1, 'Vote for Biden');
INSERT INTO Tweets (tweet_id, content) VALUES (2, 'Let us make America great again!');
-- 查詢驗(yàn)證
SELECT * FROM Tweets;輸入結(jié)果:

輸出:
SELECT tweet_id FROM Tweets WHERE LENGTH(content) > 15;
輸出結(jié)果:

3、表:Visits
| Column Name | Type |
| visit_id | int |
| customer_id | int |
visit_id 是該表中具有唯一值的列。
該表包含有關(guān)光臨過購物中心的顧客的信息
| Column Name | Type |
| transaction_id | int |
| visit_id | int |
| amount | int |
transaction_id 是該表中具有唯一值的列。
此表包含 visit_id 期間進(jìn)行的交易的信息。
有一些顧客可能光顧了購物中心但沒有進(jìn)行交易。請(qǐng)你編寫一個(gè)解決方案,來查找這些顧客的 ID ,以及他們只光顧不交易的次數(shù)。
返回以 任何順序 排序的結(jié)果表。
返回結(jié)果格式如下例所示。
輸入:
-- 創(chuàng)建 Visits 表
CREATE TABLE Visits (
visit_id INT PRIMARY KEY,
customer_id INT
);
-- 創(chuàng)建 Transactions 表
CREATE TABLE Transactions (
transaction_id INT PRIMARY KEY,
visit_id INT,
amount INT
);
-- 插入 Visits 示例數(shù)據(jù)
INSERT INTO Visits (visit_id, customer_id) VALUES (1, 23);
INSERT INTO Visits (visit_id, customer_id) VALUES (2, 9);
INSERT INTO Visits (visit_id, customer_id) VALUES (4, 30);
INSERT INTO Visits (visit_id, customer_id) VALUES (5, 54);
INSERT INTO Visits (visit_id, customer_id) VALUES (6, 96);
INSERT INTO Visits (visit_id, customer_id) VALUES (7, 54);
INSERT INTO Visits (visit_id, customer_id) VALUES (8, 54);
-- 插入 Transactions 示例數(shù)據(jù)
INSERT INTO Transactions (transaction_id, visit_id, amount) VALUES (2, 5, 310);
INSERT INTO Transactions (transaction_id, visit_id, amount) VALUES (3, 5, 300);
INSERT INTO Transactions (transaction_id, visit_id, amount) VALUES (9, 5, 200);
INSERT INTO Transactions (transaction_id, visit_id, amount) VALUES (12, 1, 910);
INSERT INTO Transactions (transaction_id, visit_id, amount) VALUES (13, 2, 970);
-- 查詢驗(yàn)證
SELECT * FROM Visits;
SELECT * FROM Transactions;輸入結(jié)果:

輸出:
SELECT v.customer_id, COUNT(*) AS count_no_trans FROM Visits v LEFT JOIN Transactions t ON v.visit_id = t.visit_id WHERE t.transaction_id IS NULL GROUP BY v.customer_id ORDER BY count_no_trans DESC, v.customer_id;
輸出結(jié)果:

總結(jié)
到此這篇關(guān)于Oracle 11g數(shù)據(jù)庫常用對(duì)象創(chuàng)建與管理方法詳解的文章就介紹到這了,更多相關(guān)Oracle 11g對(duì)象創(chuàng)建與管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle查看SQL執(zhí)行計(jì)劃的常見方法總結(jié)
在日常的運(yùn)維工作中,SQL優(yōu)化是DBA的進(jìn)階技能,SQL優(yōu)化的前提是要看SQL的執(zhí)行計(jì)劃是否正確,這篇文章主要介紹了Oracle查看SQL執(zhí)行計(jì)劃的常見方法,需要的朋友可以參考下2025-08-08
Oracle中nvl()和nvl2()函數(shù)實(shí)例詳解
NVL函數(shù)的功能是實(shí)現(xiàn)空值的轉(zhuǎn)換,根據(jù)第一個(gè)表達(dá)式的值是否為空值來返回響應(yīng)的列名或表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于Oracle中nvl()和nvl2()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05
Oracle數(shù)據(jù)庫中創(chuàng)建自增主鍵的實(shí)例教程
Oracle的字段自增功能,可以利用創(chuàng)建觸發(fā)器的方式來實(shí)現(xiàn),接下來我們就來看看Oracle數(shù)據(jù)庫中創(chuàng)建自增主鍵的實(shí)例教程,需要的朋友可以參考下2016-05-05
Oracle通過RMAN備份至MinIO且防止數(shù)據(jù)刪除的詳細(xì)步驟
本文提供了一個(gè)簡單的測(cè)試方案,用于將Oracle數(shù)據(jù)庫通過RMAN備份到MinIO,并重點(diǎn)配置MinIO以防止備份文件被誤刪除,方案涵蓋了環(huán)境準(zhǔn)備、MinIO和RMAN的配置、防誤刪功能測(cè)試以及恢復(fù)驗(yàn)證等步驟,需要的朋友可以參考下2026-03-03
Oracle創(chuàng)建自增字段--ORACLE SEQUENCE的簡單使用介紹
在oracle中sequence就是所謂的序列號(hào),每次取的時(shí)候它會(huì)自動(dòng)增加,一般用在需要按序列號(hào)排序的地方接下來為大家介紹下Oracle創(chuàng)建自增字段方法感興趣的各位可不要錯(cuò)過了哈2013-03-03

