創建和管理表
對象:
表(TABLE)基本的存儲單位,由行和列組成。
表名和列名(使用規則):
必須是字母開頭;
必須是1-30的字符長度;
只能包括A-Z,a-z,0-9,_,$,#;
在同一個用戶下不能頭重名的對象;
不能是ORACLE的保留字;
創建需求
必須有:
CREATE TABLE 權限;
足夠的存儲空間;
語法:
CREATE TABLE [SCHEMA(方案).]TABLE
(COL DATATYPE [DEFAULT默認值][]);
當前用戶所有的表
select table_name from user_tables;
當前用戶所有的對象:
desc user_objects
當前用戶對象的別名:
select * from cat;
字段類型:
VARCHAR(size) 變長字符串類型
CHAR(size) 定長字符串類型
NUMBER(p,s)p位整數,s位小數
DATE
DATETIME 秒級最多可以到小數點後的9位
TIMESTAMP 帶有小數秒的日期
TIMESTAMP WITH TIME ZONE 帶時區的類型
TIMESTAMP WITH LOCAL TIME ZONE 帶時區的並會進行時區轉換的類型(同一時間在不 同地區看到的時間)
INTERVAL YEAR TO MONTH 按年和月的間隔存儲的類型
INTERVAL ‘123-2’ TEAR(3) TO MONTH
INTERVAL DAY TO SECOND 按天、小時、分和秒的間隔存儲的類型
INTERVAL
LONG 變長的長字符串類型
CLOB 字符類型 4GIGABYTES
RAW 二進制類型與CHAR對應
LONG RAW 二進制類型與LONG對應
BLOB
BFILE 以文件的形式存儲在操作系統中
ROWID 表中行的唯一地址(行地址)
方案:一個用戶所有對象的命名集合。
如果想訪問其他用戶或方案的表要加上用戶或方案作爲前綴。
必須指明:
表名稱;
列名,列類型和長度;
用戶表:
被用戶創建和維護的一些表;
包括了用戶自己的信息;
數據字典表:
被ORACLE數據庫創建和維護的一些表;
包括了數據庫的信息;
CTAS(子查詢建表):
CREATE TABLE table_name
[(col,coltype,..)]
as subquery(子查詢);
創建的表的列的數目匹配子查詢的列的數目。
使用子查詢的列的名字和默認值定義表。
注:
*、被創建表的字段名要遵循如果沒有字段別名和子查詢中沒設置別名的話,使用子查詢中的列名;
如果有別名,使用別名;如果有字段列表([(col,coltype,..)]),在被創建的表中使用字段列表;
*、有字段列表與子查詢的列要匹配。
*、當沒有字段列表的時候,而在子查詢中有表達式的時候一定要在表達式後要加上別名。
*、只會把屬性當中的非空屬性複製過來,其他的比如約束條件、關聯...都不會複製過來。
使用ALTER TABLE 語句可以:
*、在表中增加一個新列
語法:ALTER TABLE table add (col datatype [default],...,....);
新增加的字段一定是放在表的最後。
*、修改表字段的類型和長度
ALTER TABLE table modify (col datatype [default],...,....);
對默認值的修改只會影響到新插入的行。
如果字段下有值的話,類型的修改成功率很小(要修改數據類型,要修改的列必須爲空,即沒有數據項)。
CHAR類型不能修改長度。
*、刪除表字段
ALTER TABLE table DROP COLUMN (COLUMN_NAME_LIST);
9I2版可以修改列名
*、SET UNUSED 設置字段爲不可用。
原理:清楚掉字典信息(撤消存儲空間),不可恢復。
可以使用 SET UNUSED 選項標記一列或者多列不可用。
使用DROP SET UNUSED 選項刪除被被標記爲不可用的列。
語法:
ALTER TABLE table SET UNUSED (COLlist多個) 或者 ALTER TABLE table SET UNUSED COLUMN col單個;
ALTER TABLE table DROP UNUSED COLUMNS;
刪除表:
刪除關聯:drop table table_name cascade;
改對象名:
RENAME 對象原名 TO 要改的對象名;
注:
必須是對象的所有者才能進行改名的操作。
截取:
不能回滾;
刪除表中所有數據;
釋放存儲空間;
語法:
TRUNCATE TABLE 表名稱;
DELETE 也可以刪除所有行,但:
可以回滾。
不釋放存儲空間。
給表加註釋:COMMENT
comment on table table_name is '註釋內容';
約束條件:
如果經常用到約束條件的話,最好自己命名。
當定義約束的時候可以將定義的語句作爲CREATE TABLE 中的參數的一部分來完成。
表級別約束定義:
CONSTRAINT 約束名 約束條件(字段名)
約束在表上強制了規則。
如果有參照的花,約束防止表的刪除。
ORACLE支持的約束條件:
NOT NULL 非空
特點:唯一一個只能在列級定義的約束條件。
UNIQUE 唯一
允許有空值(空值不做比較);
特點:當創建約束的時候,系統會自動創建對應其的索引。
PRIMARY KEY 主鍵
特點:當創建約束的時候,系統會自動創建對應其的索引。
在一個表中只允許一個主鍵。
FOREIGN KEY 外鍵
外鍵參照的一定是主表的主鍵或唯一鍵;
保證子表外鍵字段的值一定是主表中的被參照字段值的真子集;
當主表字段被參照的時候,其值不允許被直接刪除。
CONSTRAINT 約束名 FOREIGN KEY (外鍵字段名) REFERENCES 主表名(主表字段名);
如果在字段列表中定義外鍵就可以不寫 FOREIGN KEY 關鍵字。
如下格式:CONSTRAINT 約束名 REFERENCES 主表名(主表字段名);
ON DELETE CASCADE 當主表的行被刪除的時候,要刪除子表中參照主表的行。
ALTER TABLE TABLE_NAME DROP (PK) CASCADE CONSTRAINTS;把作爲主鍵的字段也同時刪除了。
ON DELETE SET NULL 當主表的行被刪除的時候,轉換子表中的參照值爲空。
CHECK
定義一個每行都必須滿足的條件。
CREATE TABLE table_name
(
....
salary number(10,2),
CONSTRAINT 約束名 CHECK(SALARY>0),
....
);
約束的使用:
約束的命名:給約束命名或者ORACLE服務器將使用SYS_Cn的格式爲約束命名。
創建時期:
在創建表的同時或者在建表之後。
定義級別:
可以在表級定義或列級定義。
在數據字典中可以查看約束。
使用ALTER TABLE 語句:
*、添加或者刪除約束條件,但是不能修改約束條件。
就算列名上已經有約束條件,還可以繼續添加約束條件的。
添加: ALTER TABLE table_name ADD [CONSTRAINT ] 約束名 約束條件(column);
刪除: ALTER TABLE table_name drop constraint 約束名;
ALTER TABLE table_name PRIMARY KEY CASCADE;刪除主鍵的時候,不用約束名。
*、啓動或禁用約束條件
ALTER TABLE table_name Disable constraint 約束名; 禁用
ALTER TABLE table_name ENABLE constraint 約束名; 啓用
*、通過MODIFY添加 NOT NULL 約束條件(因爲NOT NULL爲列級約束,只能用MODIFY添加)。
ALTER TABLE table_name MODIFY(col type NOT NULL);
查看約束條件:
//desc user_constraints
OWNER 擁有者;
CONSTRAINT_NAME 約束名稱
CONSTRAINT_TYPE 約束類型
SEARCH_CONDITION check的條件
select constraint_name, constraint_type,search_condition,status
from user_constraint where table_name='b';
視圖 (VIEW) 一個或多個表的數據集的邏輯表示(虛表,不存儲數據)。
視圖不能提高查詢的性能。
分類:
簡單
數目:一個
函數:不包含
分組數據:不包含
可以做DML操作
複雜
數目:一個或多個
函數:包含
分組數據:包含
不一定能做DML操作
視圖也可以用DESC描述。
創建視圖:
CREATE [or replace(修改視圖)] [force/noforce] VIEW view_name(col coltype ,.......)
as
subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY[CONSTRAINT constraint]];
USER_VIEWS 關於視圖的字典
修改視圖:
CREATE OR REPLACE 原視圖名 (字段列表)
AS 子查詢;
包含:
GROUP BY
DISTINCT
ROWNUM
不能對視圖進行刪除操作;
包含:
GROUP BY
DISTINCT
ROWNUM
通過表達式定義的列
不能對視圖進行修改操作;
包含:
GROUP BY
DISTINCT
ROWNUM
通過表達式定義的列
在視圖中沒有包含基表中的 NOT NULL 列
不能對視圖進行插入操作;
使用視圖的原因;
爲了限制對數據的訪問;
爲了使複雜的查詢變得簡單;
提供了數據的獨立性;
提供了對相同數據的不同顯示;
使用WITH CHECK OPTION 子句創建視圖
創建視圖時通過 WITH CHECK OPTION 子句確保執行的DML語句不會引起數據不出現在視圖上。
在對視圖做DML操作的時候,一定要符合WHERE子句中的條件。
CREATE OR REPLACE VIEW empvu20 as select * from employees
where check option constraint [empvu20_ck];
WITH READ ONLY
不可以進行DML操作;
刪除視圖:
DROP VIEW view_name;
行內視圖:
是一個在SQL語句中使用的帶有別名的子查詢,該子查詢放在FROM之後;
TOP-N:
select [col_list],rownum rank(排名)
from (select [col_list] from table_name order by top-n_col)
where rownum<=n;
序列(SEPUENCE)產生的順序數字,單向遞增或單向遞減,且步長相同。
索引(INDEX)用於提高查詢性能。
同義詞(SYNONYM)對象的別名。
create public synonym e for hr.employees;
user_synonyms;
創建同義詞要有權限,訪問的時候也需要權限。