Oracle 10g數據庫基礎之基本DDL和DML語句sql
--
資料參考:張烈
張建中《數據庫管理員培訓講義》
表的基本操做數據庫
表有名稱。express
表由行和列組成安全
表是存放數據的最基本對象服務器
咱們將通常的表叫作heap table(堆表),其含義爲雜亂無章的存儲數據,堆表是數據庫的重要組織網絡
形式。它有別於索引組織表和cluster表。oracle
表的名稱規則ide
標準ASCII碼能夠描述函數
字母開頭學習
30個字母內
不能是保留字
能夠包含大小寫字母,數字,_,$,#
不能和所屬用戶的其它對象重名。千萬不要使用漢語作表和列的名稱,由於漢語是ascii碼所不能描述
的,ORACLE的核心是ASCII編寫的,你使用漢語只是一時痛快,後患無窮。
Select object_name,object_type from user_objects;
user_objects
當前用戶所擁有的全部對象。不包含你創建的
public
對象。
select table_name from user_tables;
user_tables
你本身的表,你有一切的權利。你所擁有的表。
select * from tab;
tab你所擁有的表和視圖,顯示的較簡潔,列較少。
查詢數據
SQL語言中最主要、最核心的部分是它的查詢功能即SELECT語句。查詢語言用來對已經存在於數據庫中的數據按照特定的組合、條件表達式或次序進行檢索。SELECT語句的完整語法以下:
SELECT [ALL|DISTINCT]] select_list
[INTO new_table_]
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC|DESC]]
插入數據
INSERT語句能夠實現往數據庫表中插入記錄。有兩種方法能夠向一張表中插入數據。一種是用VA L U E S選擇,直接給各字段賦值;二是經過一條查詢語句,把從其餘表或視圖中選取的數據插入。INSERT語句的完整語法以下:
I N S E RT [INTO ]
{ TABLE_NAME | VIEW_NAME}[
(
C O L U M N _ L I S T
)
]
{ VALUES| VALUES_LIST | SELECT_STAT E M E N T }
1.插入全部值
當向表中全部列都插入新數據時,能夠省略列名錶,可是必須保證VALUES後的各數據項位置同表定義時順序一致。例如:
INSERT AUTHORS VALUES ( '123-45-6789 ','YANG','ZH','900555_1212')
2.插入部分值
當向表中插入部分數據時,應在列名錶處寫出各個字段的順序。例如:
INSERT PUBLISHERS (PUB_ID,PUB_NAME) VALUES('9975','UNBOUND PRESS')
3.插入缺省值選項
方法一:爲全部列插入缺省值
語法:INSERT TABLENAME DEFAULT VALUES
這種語法要求全部列必須具備IDENTITY屬性、TIMESTAMP類型、容許NULL或賦有DEFAULT值。
方法二:爲列插入缺省值
該列必須具備TIMESTAMP類型、容許NULL或賦有DEFAULT值。
INSERT shippers(companyname,phone)
VALUES ('yangzh coffee co.', DEFAULT )
4.用SELECT插入多行
能夠用查詢語句從其餘表或視圖中選出要插入的數據,並將它插入到表中。語法以下:
INSERT TABLE_NAME
SELECT COLUMN_LIST
FROM TABLE_LIST
WHERE SEARCH_CONDITIONS
修改數據
UPDATE語句實現更新數據庫。其完整語法以下:
UPDATE { TABLE_NAME | VIEW_NAME}
SET [ { TABLE_NAME | VIEW_NAME}]
{COLUMN_LIST | VARIABLE_LIST }=expression
[WHERE CLAUSE]
例如:
update discounts set discount=discount+0.10 where lowqty>=100
刪除數據
DELETE實現刪除數據庫表中的記錄,其完整語法以下:
DELETE [FROM] TABLE_NAME WHERE SEARCH_CONDITIONS
例如:
delete sales where datediff(year,ord_date,getdate())>=3
實驗1:創建簡單的表,並對錶進行簡單ddl操做
該實驗的目的是掌握簡單的ddl語法.學習創建表,修改表,驗證表,刪除表
Create table
語句創建表
要指明表的名稱
列的名稱
列的數據類型
列的寬度
是否有默認值
常見的數據類型
Char(n)定長
Varchar2(n)
變長,最大到
4000
Number(p,s)
Date
Long
Lob
raw
在現有表的基礎上創建表
SQL> Create table t2
2 as select ename name,sal salary from emp;
Table created
SQL>
當t2誕生時就會有子查詢中所查出的數據。
若是想改變列的名稱,請用別名。
若是不想要數據,只創建表結構,請加一個假條件。
SQL> Create table t3 (c1,c2,c3) as
2 Select ename,empno,sal from emp where 9=1;
Table created
SQL>
修改表結構
若是列爲null,能夠隨便修改列的類型和寬度。
若是有數據,修改會受到限制。但不會破壞數據。
若是不改變數據類型,只改變寬度的話加大是能夠的。
SQL> alter table t1 modify(name char(4));
Table altered
SQL> alter table t2 modify(name char(8));
Table altered
修改表的名稱, 必須是表的owner才能夠修改表名稱
SQL> rename t1 to t_1;
Table renamed
SQL> desc t_1;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
NAME CHAR(4) Y
SALARY NUMBER(5) Y 0
CONTENT CHAR(4 CHAR) Y
HIREDATE DATE Y
SQL>
修改列的名稱(10g才能夠)
SQL> alter table t3 rename column c1 to name;
Table altered
表註釋
SQL> comment on table emp is 'employee table';
Comment added
SQL> select COMMENTS from user_tab_comments where table_name='EMP';
COMMENTS
--------------------------------------------------------------------------------
employee table
SQL>
列註釋
SQL> select COMMENTS from user_tab_comments where table_name='EMP';
COMMENTS
--------------------------------------------------------------------------------
employee table
SQL>
SQL>
SQL> COMMENT ON COLUMN EMP.SAL IS '員工工資';
Comment added
SQL> select COMMENTS from user_col_comments
2 where table_name='EMP' AND column_name='SAL';
COMMENTS
--------------------------------------------------------------------------------
員工工資
SQL>
刪除(丟棄)表
SQL> Select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T3 TABLE
T2 TABLE
T_1 TABLE
7 rows selected
SQL> Drop table t2;
Table dropped
並無將表真的刪除,只是改了名稱。
SQL> Select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
T3 TABLE
BIN$uHlWiyacnb/gQKjAWGURmg==$0 TABLE
T_1 TABLE
7 rows selected
SQL>
顯示回收站的信息(在oracle服務器上,不要使用客戶端)
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T2 BIN$uHlWiyacnb/gQKjAWGURmg==$0 TABLE 2012-05-18:15:01:42
SQL> SELECT * FROM USER_RECYCLEBIN;
OBJECT_NAME ORIGINAL_NAME OPERATION
------------------------------ -------------------------------- ---------
TYPE TS_NAME CREATETIME
------------------------- ------------------------------ -------------------
DROPTIME DROPSCN PARTITION_NAME CAN CAN
------------------- ---------- -------------------------------- --- ---
RELATED BASE_OBJECT PURGE_OBJECT SPACE
---------- ----------- ------------ ----------
BIN$uHlWiyacnb/gQKjAWGURmg==$0 T2 DROP
TABLE USERS 2012-05-18:15:01:11
2012-05-18:15:01:42 493680 YES YES
52504 52504 52504 8
將回收站的表還原
SQL> FLASHBACK TABLE t2 TO BEFORE DROP;
Flashback complete.
還原表的同時修改表的名稱。
FLASHBACK TABLE T2 TO BEFORE DROP RENAME TO TT2;
清空回收站內指定的表
PURGE TABLE T2;
清除當前用戶的回收站,不會影響其它用戶的回收站
PURGE RECYCLEBIN;
繞過回收站,完全的刪除表,在10G前是沒有回收站的,就是完全的刪除。回收站內沒有的表是不容易恢復的,我只能取備份來恢復了。
Drop table t2 PURGE;
SQL> show recyclebin;
SQL> drop table t3;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T3 BIN$wEsyWUQxfzngQKjAWGUZqg==$0 TABLE 2012-05-18:15:06:51
SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> show recyclebin;
SQL>
知識點
創建表
修改表
註釋表
更名稱
丟棄表
恢復丟棄的表
初步認識數據字典
數據操做語言
dml
Data Manipulation Language
(
dml)
從無到有 insert into
數據變化 update set
刪除數據 delete where
表的融合 merge into
實驗2:dml語句,插入刪除和修改表的數據
該實驗的目的是掌握DML語法.插入刪除和修改表中的數據.
insert into
語句
insert into
語句
Insert into t1(c1,c2,c3) values(v1,v2,v3);
要點關鍵字寫全,列的個數和數據類型要匹配。
這種語法每次只能插入一行。
可使用函數
Insert into t1(c2) values(sysdate);
將當前的日期插入。
隱式插入null
在插入中沒有列出的列,就會被插入NULL,若是該列有DEFAULT值,那麼就插入默認值。
Insert into dept(deptno) values(50);
其中dname,loc沒有說明,都爲null.
顯式插入null
明確的寫出該列的值爲NULL
Insert into dept values(60,null,null);
Insert into dept(loc,dname,deptno) values(null,null,70);
日期和字符串
日期格式敏感
當插入的列爲日期的時候,最好強制轉化爲日期類型,默認的轉換在環境變化的時候會報錯。
Insert into t3(hiredate) values(to_date('080599 ' ,'mmddrr');
字符串大小寫敏感
Insert into t2(c1) values('BEIJING ');
Insert into t2(c1) values('beijing ');
子查詢插入
不加values關鍵字,一次能夠插入多行
列的類型和位置要匹配
Insert into d1 select * from dept;
Insert into emp2 select * from emp where deptno=30;
Update
語句
修改表中的數據
Update emp set sal=sal+1;
Update emp set sal=2000 where empno=7900;
Update emp set comm=null where deptno=30;
用子查詢來更新
SQL> create table emp2 as select * from emp;
Table created
創建EMP2表,和EMP表的結構,數據都相同
SQL> alter table emp2 add(dname varchar2(10));
Table altered
將emp2表結構修改,增長一列。該列的值爲null
SQL> update emp2 set dname=(select dname from dept where dept.deptno=emp2.deptno);
14 rows updated
使用相互關聯子查詢來更新emp2表的dname列。
使用default值進行表的修改
SQL> create table t1(c1 number(2) default 10,c2 char(10) default 'bj');
Table created
SQL> insert into t1(c1)values(20);
1 row inserted
SQL> select * from t1;
C1 C2
--- ----------
20 bj
SQL> update t1 set c1=default;
1 row updated
SQL> select * from t1;
C1 C2
--- ----------
10 bj
SQL>
若是沒有指定default的值,那麼爲null值。
Delete
刪除行
Delete t1;--
全部的行都刪除。
Delete emp2 where sal>2000;
將符合條件的行刪除
事務的概念和事務的控制
該實驗的目的是瞭解事務的概念,提交回退和控制事務.
Transaction
事務的概念
開始:第一個dml語句
結束:commit或者rollback
未完成的事務能夠撤消
未完成的事務,其它會話看不到結果,只能看到已經提交的結果。
維護事務須要鎖和回退段的參與
提交事務
commit
1. 手工直接提交commit
2.自動提交
ddl,dcl語句
exit退出sqlplus
3.提交後
事務結束
釋放鎖和回退
其它用戶能夠看到結果,修改過的結果
撤消事務
rollback
1. 手工直接撤消rollback
2.自動撤消
網絡或數據庫崩潰
強制退出sqlplus
3.撤消後
事務結束
修改前的數據恢復了
釋放鎖和回退
其它用戶能夠看到結果,未修改的結果
實驗3:在表上創建不一樣類型的約束
約束就是指對插入數據的各類限制,例如:人員的姓名不能爲空,人的年齡只能在0~150歲之間。約束能夠對數據庫中的數據進行保護。約束能夠在建表的時候直接聲明,也能夠爲已建好的表添加約束。
約束
(constraint)
保證數據的有效
保證數據的安全
能夠本身書寫代碼
使用觸發器
使用oracle提供的五類約束
該實驗的目的是掌握oracle提供的五種約束.
Not null
定義在表的列上,代表該列必需要有值,不能爲null
能夠在創建表的時候說明
也能夠在表創建後修改成not null
能夠給約束指定名稱。
若是不指定名稱,數據庫會給一個系統自動指定名稱,SYS_C#######
User_constraints,user_cons_columns
能夠查看到約束的信息
創建表的時候指定not null約束
SQL> CREATE TABLE person
2 (
3 pid NUMBER ,
4 name VARCHAR(30) NOT NULL
5 ) ;
Table created
SQL> --
插入數據
SQL> INSERT INTO person(pid,name) VALUES (11,'
張三
');
1 row inserted
SQL> INSERT INTO person(pid) VALUES (12);
INSERT INTO person(pid) VALUES (12)
ORA-01400: cannot insert NULL into ("SCOTT"."PERSON"."NAME")
SQL> --
錯誤的數據,會受到約束限制,沒法插入
SQL> create table t1 (name char(9) not null,
2 telenum char(8) constraint t1_tele_nl not null);
Table created
SQL> desc t1;
Name Type Nullable Default Comments
------- ------- -------- ------- --------
NAME CHAR(9)
TELENUM CHAR(8)
創建表的時候指明非空約束,一個是系統命名,一個是咱們命名。
SQL> select CONSTRAINT_NAME,CONSTRAINT_type,TABLE_NAME,
column_name from user_constraints natural join user_cons_columns;
咱們經過數據字典來驗證咱們的實驗結果。
創建表後指定not null約束。要使用modify語法。你不指定名稱,數據庫本身命名。
SQL> drop table t1;
Table dropped
SQL> create table t1 as select * from dept;
Table created
SQL> alter table t1 modify(dname not null);
Table altered
SQL> desc t1;
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(2) Y
DNAME VARCHAR2(14)
LOC VARCHAR2(13) Y
惟一約束
UNIQUE
列的值不能重複
能夠爲NULL
是用索引來維護惟一的
索引的名稱和約束的名稱相同
創建表的時候指定UNIQUE約束
SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
2 (
3 pid NUMBER PRIMARY KEY NOT NULL ,
4 name VARCHAR(30) NOT NULL ,
5 tel VARCHAR(50) UNIQUE
6 ) ;
Table created
SQL>
SQL> --
插入數據
SQL> INSERT INTO person(pid,name,tel) VALUES (11,'
張三
','1234567');
1 row inserted
SQL> --
電話重複了
SQL> INSERT INTO person(pid,name,tel) VALUES (12,'
李四
','1234567');
INSERT INTO person(pid,name,tel) VALUES (12,'
李四
','1234567')
ORA-00001: unique constraint (SCOTT.SYS_C005400) violated
SQL>
創建表以後指定UNIQUE約束
SQL> create table t1 as select * from dept;
Table created
SQL> alter table t1 add constraint u_dname unique (dname);
Table altered
Check
檢測約束
條件約束,插入的數據必須知足某些條件
例如:人員有年齡,年齡的取值只能是0~150歲之間
SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
2 (
3 pid NUMBER PRIMARY KEY NOT NULL ,
4
4 name VARCHAR(30) NOT NULL ,
5 tel VARCHAR(50) NOT NULL UNIQUE ,
6 age NUMBER CHECK(age BETWEEN 0 AND 150)
7 ) ;
Table created
SQL> --
插入數據
SQL> INSERT INTO person(pid,name,tel,age) VALUES (11,'
張三
','1234567',30);
1 row inserted
SQL> --
年齡的輸入錯誤
SQL> INSERT INTO person(pid,name,tel,age) VALUES (12,'
李四
','2345678',-100);
INSERT INTO person(pid,name,tel,age) VALUES (12,'
李四
','2345678',-100)
ORA-02290: check constraint (SCOTT.SYS_C005405) violated
SQL>
Primary key
主健約束
一個表只能有一個主健
主健要求惟一而且非空
能夠是聯合主健,聯合主健每列都要求非空
主健能惟必定位一行,因此主鍵也叫邏輯rowid
主健不是必需的,能夠沒有
主健是經過索引實現的
索引的名稱和主健名稱相同
SQL> DROP TABLE person ;
Table dropped
SQL> CREATE TABLE person
2 (
3 pid NUMBER PRIMARY KEY ,
4 name VARCHAR(30) NOT NULL
5 ) ;
Table created
SQL> --
插入數據
SQL> INSERT INTO person(pid,name) VALUES (11,'
張三
');
1 row inserted
SQL> --
主鍵重複了
SQL> INSERT INTO person(pid,name) VALUES (11,'
李四
');
INSERT INTO person(pid,name) VALUES (11,'李四')
ORA-00001: unique constraint (SCOTT.SYS_C005409) violated
SQL>
SQL> --表創建後指定自命名的主健
SQL> drop table t1;
Table dropped
SQL>
SQL> create table t1(mail char(8) ,name char(8));
Table created
SQL> alter table t1 add constraint pk_t1_mail primary key (mail) ;
Table altered
SQL> --
插入數據
SQL> INSERT INTO t1 VALUES (11,'
張三
');
1 row inserted
SQL> --
主鍵重複了
SQL> INSERT INTO t1 VALUES (11,'
裏德
');
INSERT INTO t1 VALUES (11,'
裏德
')
ORA-00001: unique constraint (SCOTT.PK_T1_MAIL) violated
foreign key
外健
指定在表的列上
引用本表其它列,或其它表的其它列
被引用的列得有惟一約束或者主健約束,由於引用的是索引的鍵值,而不是真正的表。
目的是維護數據的完整性
核心是一列是另一列的子集,null除外
創建主健,創建一個外健來引用主健
SQL> --創建主健,創建一個外健來引用主健
SQL>
SQL> create table d as select * from dept;
Table created
SQL> create table e as select * from emp;
Table created
SQL>
SQL> alter table d add constraint pk_d primary key (deptNO) ;
Table altered
SQL> alter table e add constraint fk_e foreign key (deptno) references d(deptno) ;
Table altered
SQL> --違反約束
SQL> delete d where deptno=10;
delete d where deptno=10
ORA-02292: integrity constraint (SCOTT.FK_E) violated - child record found
ORA-02292:
違反完整約束條件
(SCOTT.FK_E) -
已找到子記錄
SQL> update e set deptno=50;
update e set deptno=50
ORA-02291: integrity constraint (SCOTT.FK_E) violated - parent key not found
ORA-02291:
違反完整約束條件
(SCOTT.FK_E) -
未找到父項關鍵字
SQL>
SQL> --創建被級連的外健
SQL>
SQL> alter table e drop constraint FK_E;
Table altered
SQL> alter table e add constraint fk_e foreign key (deptno)
2 references d(deptno) on delete set null;
Table altered
SQL> --父表的值被刪除,子表的相關列自動被賦予NULL值。
SQL>
SQL> alter table e drop constraint FK_E;
Table altered
SQL> alter table e add constraint fk_e foreign key (deptno)
2 references d(deptno) on delete cascade;
Table altered
SQL> --父表的值被刪除,子表的相關行自動被刪除。
SQL>
刪除約束
任何約束均可以用約束名稱來刪除
Alter table ### drop constraint ****;
由於主健只能有一個,因此刪除主健約束的時候也能夠
Alter table ### drop primary key;
若是主健和惟一性約束被刪除,自動創建的索引也會同時被清除。
Not Null約束也能夠用alter table modify來刪除。
刪除有外健引用的主健或惟一約束的時候,外健也要被級連刪除。
Alter table ### drop primary key cascade;
若是不加cascade,你刪不了,報有外鍵在使用,不能刪除。
按約束的名稱來刪除約束(能夠刪除各類約束)
Alter table t1 drop constraint sys_c03033;
非空約束的第二種刪除方式
alter table t1 modify (name not null);
alter table t1 modify (name null);
啓用約束
ALTER TABLE book enable CONSTRAINT person_book_pid_fk ;
禁用約束
ALTER TABLE book disable CONSTRAINT person_book_pid_fk ;
《完》
--xjzhujunjie
--2012/05/20