數據庫中的對象
表TABLE | 基本的存儲單元 由行【數據】和列【字段】組成。 |
視圖VIEW | 邏輯上代表一個和多個表中的數據的子集。 |
序列 | 數字值的生成器 |
索引 | 提高某些查詢的性能 |
同義詞 | 給出對象的替代名稱 |
數據表
表明和列明的命名規則:
- 必須以字母開頭
- 長度必須是1-30個字符
- 只能包含A-Z a-z 0-9 _ $ #等字符和特殊字符
- 不能與同一個用戶擁有的其他對象重名 同一個用戶 或者同一個schema下只能有一張這個名字表
- 不能是ORACLE的保留字
CREATE TABLE 建表語句
必須具有以下條件才能使用此命令:
- CREATE TABLE權限
- 一個可以使用的表空間存儲區
SCHEMA.TABLE_NAME: 絕對名稱 完整名稱 比如說hr.employees。
CREATE TABLE emp ( id number(10) primary key, name varchar2(20), property varchar2(20) default 'SLQ');
數據庫中的表的分類:
用戶表:是由用戶創建和維護的表的集合,這種表包含了用戶維護的數據。
數據字典表:是由ORACLE SERVER創建和維護的表的集合,包含數據庫信息。
- USER_XXXX 包含了當前數據庫用戶所擁有的對象的信息。
- ALL_XXXX 包含了當前數據庫用戶可以訪問的所有的模式對象的信息。
- DBA_XXXX 包含了所有數據庫對象信息,只有具有DBA角色的用戶才嫩而過訪問的這些視圖
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';