Oracle 19C學習 - 13. 創建與管理表


數據庫中的對象

表TABLE   基本的存儲單元 由行【數據】和列【字段】組成。
視圖VIEW 邏輯上代表一個和多個表中的數據的子集。  
序列 數字值的生成器
索引 提高某些查詢的性能
同義詞 給出對象的替代名稱

 

 

 

 

 

 

數據表

表明和列明的命名規則:

  • 必須以字母開頭
  • 長度必須是1-30個字符
  • 只能包含A-Z a-z 0-9 _ $ #等字符和特殊字符
  • 不能與同一個用戶擁有的其他對象重名 同一個用戶 或者同一個schema下只能有一張這個名字表
  • 不能是ORACLE的保留字

CREATE TABLE 建表語句

必須具有以下條件才能使用此命令:

  • CREATE TABLE權限
  • 一個可以使用的表空間存儲區
CREATE TABLE [SCHEMA.] Table_Name (
                              column_name_1 data_type default value column_constraint,
                              column_name_2 data_type default value column_constraint,
                              ..., table_constraint );

SCHEMA.TABLE_NAME: 絕對名稱 完整名稱 比如說hr.employees。
DEFAULT選項:指定列的默認值,默認數據類型必須與列數據類型一致

CREATE TABLE emp (
                 id number(10) primary key,
                 name varchar2(20),
                 property varchar2(20) default 'SLQ');

 

數據庫中的表的分類:
用戶表:是由用戶創建和維護的表的集合,這種表包含了用戶維護的數據。
數據字典表:是由ORACLE SERVER創建和維護的表的集合,包含數據庫信息。
 
ORACLE中常見的數據字典表:
  • USER_XXXX 包含了當前數據庫用戶所擁有的對象的信息。
  • ALL_XXXX    包含了當前數據庫用戶可以訪問的所有的模式對象的信息。
  • DBA_XXXX   包含了所有數據庫對象信息,只有具有DBA角色的用戶才嫩而過訪問的這些視圖
 
例如:
  SELECT TABLE_NAME FROM USER_TABLES;/SELECT TNAME FROM TAB;  查詢當前用戶所有用的表名。
 
COL TABLE_NAME FOR A10
SELECT table_name FROM user_tables;

TABLE_NAME
----------
EMP
 
 

 V$ 動態性能視圖:反映數據庫服務器的性能、內存和鎖等相關的動態。

SELECT instance_name, status, startup_time
FROM v$instance;

INSTANCE_NAME    STATUS       STARTUP_TIME
---------------- ------------ -------------------
orcl             OPEN         2021-05-24 21:55:43

 

ORACLE主要常見的數據類型
char(x):定長字符串,會用空格填充來達到其最大長度。最多可以存儲2,000字節的信息。如果創建表時,不指定CHAR長度,則默認為1。
VARCHAR2(x) 變長字符串,與CHAR類型不同,它不會使用空格填充至最大長度。VARCHAR2最多可以存儲4,000字節的信息。
LONG 可變長度字符串,最大大小為2GB-1。
RAW / LONG RAW: 原始二進制數據 2000bytes or 2GB 的原始二進制數據
NUMBER(P,S)是最常見的數字類型。P是Precison的英文縮寫,即精度縮寫,表示有效數字的位數,最多不能超過38個有效數字。S是Scale的英文縮寫,可以使用的范圍為-84~127。
INTEGER是NUMBER的子類型,它等同於NUMBER(38,0),用來存儲整數。若插入、更新的數值有小數,則會被四舍五入。

FLOAT(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從 1 到 126。
BINARY_FLOAT 是 32 位、 單精度浮點數字數據類型。
BINARY_DOUBLE 是為 64 位,雙精度浮點數字數據類型。


CLOB 存放較長的字符串數據 最大大小為(4GB-1)*DB_BLOCK_SIZE的參數[數據塊的大小](8-128TB)
BLOB 它存儲非結構化的二進制數據大對象,它可以被認為是沒有字符集語義的比特流,一般是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進制數據。(8-128TB)
BFILE 二進制文件,存儲在數據庫外的系統文件,只讀的,數據庫會將該文件當二進制文件處理

 
DATE:DATE是最常用的數據類型,日期數據類型存儲日期和時間信息。Oracle 存儲以下信息: 世紀、 年、 月、 日期、 小時、 分鍾和秒。一般占用7個字節的存儲空間。
TIMESTAMP 時間戳:這是一個7字節或12字節的定寬日期/時間數據類型。它與DATE數據類型不同,因為TIMESTAMP可以包含小數秒,帶小數秒的TIMESTAMP在小數點右邊最多可以保留9位。
TIMESTAMP WITH TIME ZONE 這是TIMESTAMP類型的變種,它包含了時區偏移量的值
TIMESTAMP WITH LOCAL TIME ZONE 包含了時區的偏移量 不過ORACLE按用戶所在本地會話時間返回數據。

INTERVAL YEAR TO MONTH 這種數據類型通過使用YEAR 和 MONTH日期時間字段存儲一個時段。 默認的精度為2位數年數,如果間隔超過99年,定義字段的時候,需要INTERVAL YEAR(3) TO MONTH。
INTERVAL DAY TO SECOND 這種數據類型用於按照 日、 小時、 分、 秒存儲時間段。默認的精度為2位數天數,如果間隔超過99天,定義字段的時候,需要INTERVAL YEAR(3) TO MONTH。

 

關於三種Timestamp數據類型的實驗:

CREATE TABLE date_test (
               time1 timestamp,
               time2 timestamp with time zone,
               time3 timestamp with local time zone);

INSERT INTO date_test values (sysdate, sysdate, sysdate);

select * from date_test;

26-MAY-21 07.43.24.000000 PM  --timestamp
26-MAY-21 07.43.24.000000 PM +08:00   --timestamp with time zone
26-MAY-21 07.43.24.000000 PM  --timestamp with local time zone

--timestamp與timestamp with local time zone的結果相同

 

 

關於INTERVAL YEAR TO MONTH 的實驗:

CREATE TABLE emp_retire (
                        id number(10) primary key,
                        hire_date date,
                        retire_date INTERVAL YEAR TO MONTH);

--插入INTERVAL為30年
INSERT INTO emp_retire VALUES (1, TO_DATE('2002-11-20', 'YYYY-MM-DD'), INTERVAL '30' YEAR);

--插入INTERVAL為300月
INSERT INTO emp_retire VALUES (2, TO_DATE('2000-5-20', 'YYYY-MM-DD'), INTERVAL  '300'  MONTH);

--插入INTERVAL為一年6個月
INSERT INTO emp_retire VALUES (3, TO_DATE('2000-1-1', 'YYYY-MM-DD'), INTERVAL  '1-6' YEAR TO  MONTH);

--查詢數據結果

ID HIRE_DATE                        RETIRE_DATE
---------- -------------------- --------------------
         1 2002-11-20 00:00:00  +30-00
         2 2000-05-20 00:00:00  +25-00
         3 2000-01-01 00:00:00  +01-06

--使用date與interval合並
SELECT 'EMPLOYEE ID' || ID || ' WILL RETIRE ON ' || 
TO_CHAR(hire_date + retire_date, 'YYYY-MM-DD') AS "DESC" 
FROM EMP_RETIRE;


DESC
-----------------------------------------
EMPLOYEE ID1 WILL RETIRE ON 2032-11-20
EMPLOYEE ID2 WILL RETIRE ON 2025-05-20
EMPLOYEE ID3 WILL RETIRE ON 2001-07-01

 

 

關於INTERVAL DAY TO SECOND的實驗

CREATE TABLE test_time (
                    current_time date,
                    time_interval INTERVAL DAY(3) TO SECOND);


INSERT INTO test_time VALUES (sysdate, INTERVAL '999' DAY(3));  --超過99天,需要DAY(3)
INSERT INTO test VALUES (sysdate, INTERVAL '5 5:00' DAY TO MINUTE);
INSERT INTO test_time VALUES (sysdate, INTERVAL '100 12:00:00' DAY(3) TO SECOND);


--查詢數據
CURRENT_TIME         TIME_INTERVAL
-------------------- --------------------
2021-05-26 20:21:34  +199 00:00:00.000000
2021-05-26 20:22:38  +999 00:00:00.000000
2021-05-26 20:33:23  +100 12:00:00.000000

--合並時間與INTERVAL DAY TO SECOND
SELECT (CURRENT_TIME + TIME_INTERVAL) AS "DESC" FROM test_time;

DESC
-------------------
2021-12-11 20:21:34
2024-02-19 20:22:38
2021-09-04 08:33:23

 

CTAS創建表 CREATE TABLE AS SELECT

CREATE TABLE T2 AS SELECT * FROM T1;  ---復制表結構和表數據
CREATE TABLE T2_1 AS SELECT * FROM T1 WHERE 1 = 2; ---只復制表結構
CREATE TABLE T2_2 AS SELECT * FROM T1 WHERE 1 = 1; ---復制表結構和表數據

 

ALTER TABLE語句
1. 添加新列
2. 修改現有列
3 為新列定義默認值
4 刪除列

ALTER TABLE (表名) ADD (列名 數據類型);

--增加兩列數據
ALTER TABLE emp ADD (
                  age number(3),
                  comments varchar2(200) );

 

ALTER TABLE (表名) MODIFY (列名 數據類型);

修改列的時候注意如下幾點:
1 可以增大數字的寬度和精度
2 可以增大數字列或字符列的寬度
3 只有在列只包含空值或表沒有行時才可以減少列的寬度
4 只有在列只包含空值時 才能更改數據類型
5 只有列只包含空值或沒有減少列的大小時,才可以將CHAR該成VARCHAR2。或將VARCHAR2改成CHAR
6 對列的默認值的更改影響以后對表的插入操作

SQL> alter table emp modify (
                    id char(12));

SQL> alter table emp modify (
                    hire_date date default To_date('2021-05-01', 'YYYY-MM-DD'


ALTER TABLE (表名) DROP COLUMN (列名);

刪除列的時候注意如下幾點:
1 要刪除的可以包含數據 也可以是空或者NULL
2 使用ALTER TABLE語句時 每次盡量刪除一個列
3 必須至少還剩下一個列
4 列一旦被刪除 就不能恢復

ALTER TABLE employees DROP COLUMN age;

 

 

SET UNUSED / DROP UNUSED COLUMNS
可以使用SET UNUSED選項講一個或多個列標記為不適用
可以使用DROP UNUSED COLUMNS 刪除標記為不可用的列

SQL> ALTER TABLE employees SET UNUSED (AGE);

Table altered.

SQL> ALTER TABLE employees DROP UNUSED COLUMNS;

Table altered.

 


ALTER TABLE (當前表名) RENAME TO (新表名);

改名時注意:
1 確認符合命名規范
2 名字不能重復
3 必須是該對象的所有者

ALTER TABLE emp RENAME TO employees;

 

 

TRUNCATE TABLE語句

DDL刪除表的內容的方法

1 刪除表的所有內容 且不可再恢復
2 釋放該表所有的存儲空間 降低高水位線

TRUNCATE TABLE employees;

Table truncated.

 

 

DROP TABLE語句

DROP TABLE不是把表真正的刪除了 而是把表改個名放到了回收站里。

DROP TABLE 表名 PURGE 真正的刪除表,不進入回收站。

回收站內操作:

PURGE TABLE 表名 徹底清空回收站內的表

PURGE RECYCLEBIN  徹底清空回收站

--DROP TABLE + PURGE TABLE

SQL> DROP TABLE test;

Table dropped.

SQL> PURGE TABLE test;

Table purged.

--DROP TABLE PURGE

DROP TABLE employees PURGE;

Table dropped.

 

 

COMMENT ON 給表名和列名添加備注

COMMENT ON TABLE employees IS 'This is a employee table';

 

COMMENT ON COLUMN employees.id IS 'This column records identity';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM