Oracle 10g數據庫基礎之基本DDL和DML語句

Oracle 10g數據庫基礎之基本DDL和DML語句

--資料參考:張烈 張建中《數據庫管理員培訓講義》

表的基本操作

表有名稱。

表由行和列組成

表是存放數據的最基本對象

我們將一般的表叫做heap table(堆表),其含義爲雜亂無章的存儲數據,堆表是數據庫的重要組織

形式。它有別於索引組織表和cluster表。

表的名稱規則

標準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 )

4SELECT插入多行

可以用查詢語句從其他表或視圖中選出要插入的數據,並將它插入到表中。語法如下:

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 Languagedml)

從無到有 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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章