Oracle – Oracle SQL(1)
1. 简介
(1) SQL : Structured Query Language,结构化查询语言,专门用于数据存取、数据更新及数据库管理等操作。
(2) Oracle SQL
DDL: Data Define Language
数据定义语言
包括CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME等命令
DML: Data Manipulate Language
数据操纵语言
包括SELECT、INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAINPLAN、LOCKTABLE等命令
DQL:Data Query Language
数据查询语言
包括基本查询、ORDER BY子句、GROUP BY子句等
TCL: Transaction Control Language
事务控制语言
包括COMMIT、SAVEPOINT、ROLLBACK、SET TRANSACTION命令
DCL: Data Control Language
数据控制语言
包括GRANT、REVOKE等命令
2. SQL基本知识
(1) SQL中的“键”
● 候选码:CANDIDATE KEY,在关系模式R(U)中,K为R的一个属性或者一组属性,若K能唯一标识一个元组,则K为关系模式R的候选码;
● 主键:PRIMARY KEY,表中单个属性或多个属性组合,其值能唯一地标识表中一行记录,主键是候选码集合中的一个元素,只能拥有一个主键;
● 外键:FOREIGN KEY,关系模式R中属性或属性组X并非R的候选码,但X是另一个关系模式的候选码,则称X是R的外部码,也称外键;
3. Oracle SQL
(1)创建表(DDL)
● 语法:
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
(2)创建表约束(DDL)
● 注意:在Oracle中default是一个值,而SQL Server中default是一个约束。大括号表示内容可选。
● 创建主键约束
CREATE TABLEtable_name
(
field_1 field_1_type{CONSTRAINTconstraint_name} PRIMARY KEY,
field_2 field_2_type,
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLEtable_nameADD CONSTRAINTconstraint_namePRIMARY KEY(field_1);
CREATE TABLEuser_info
(
user_idVARCHAR2(20)PRIMARY KEY,
user_passwdVARCHAR2(20),
state_idNUMBER
);
或者
CREATE TABLEuser_info
(
user_idVARCHAR2(20),
user_passwdVARCHAR2(20),
state_idNUMBER
);
ALTER TABLEuser_infoADDCONSTRAINTpk_userinfoPRIMARY KEY(user_id);
● 创建外键约束
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type{CONSTRAINTconstraint_name} REFERENCESforeign_table_name(field),
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLEtable_nameADD CONSTRAINTconstraint_nameFOREIGN KEY(foreign_key_field)REFERENCEforeign_table_name(field);
CREATE TABLEstate
(
state_idNUMBER PRIMARY KEY,
state_nameVARCHAR2(20)
);
CREATE TABLEuser_info
(
user_idVARCHAR2(20) PRIMARY KEY,
user_passwdVARCHAR2(20),
state_idNUMBERCONSTRAINTfk_userinfo_stateREFERENCESstate(state_id)
);
或者
CREATE TABLEuser_info
(
user_idVARCHAR2(20) PRIMARY KEY,
user_passwdVARCHAR2(20),
state_idNUMBER
);
ALTER TABLEuser_infoADD CONSTRAINTfk_userinfo_stateFOREIGN KEY(state_id)REFERENCESstate(state_id);
● 创建非空约束
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type{CONSTRAINTconstraint_name}NOT NULL,
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_typeNOT NULL,
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLEtable_nameMODIFY (field_nameNOT NULL);
CREATE TABLEuser_info
(
user_idVARCHAR2(20),
user_passwdvarchar2(20)CONSTRAINTnotnull_userpasswdNOT NULL,
state_idNUMBER
);
或者
CREATE TABLEuser_info
(
user_idVARCHAR2(20),
user_passwdvarchar2(20),
state_idNUMBER
);
ALTER TABLEuser_infoMODIFY(user_passwdNOT NULL);
● 创建唯一约束
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type{CONSTRAINTconstraint_name}UNIQUE,
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLEtable_nameADD CONSTRAINTconstraint_nameUNIQUE(field_name);
CREATE TABLEdog
(
dog_idNUMBER,
dog_nameVARCHAR2(20) CONSTRAINTun_dognameUNIQUE
);
或者
CREATE TABLEdog
(
dog_idNUMBER,
dog_nameVARCHAR2(20)
);
ALTER TABLEdogADD CONSTRAINTun_dognameUNIQUE(dog_name);
● 创建检查约束
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type{CONSTRAINTconstraint_name} CHECK(judge_condition),
……
field_n field_n-type
);
或者
CREATE TABLEtable_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLEtable_nameADD CONSTRAINTconstraint_nameCHECK(judge_condition);
CREATE TABLEpig
(
pig_idNUMBER CONSTRAINTck_pigidCHECK(pig_id>=0),
pig_nameVARCHAR2(20)
);
或者
CREATE TABLEpig
(
pig_idNUMBER,
pig_nameVARCHAR2(20)
);
ALTER TABLEpigADD CONSTRAINTck_pigidCHECK(pig_id>=0);
(3) 删除表(DDL)
DROP TABLEtable_nameCASCADE CONSTRAINTS
说明:如果表t1的外键在表t2中,则删除t2的时候使用DROP TABLE t2
则系统提示:ORA-02449:表中的唯一/主键被外键引用。若使用DROP TABLE t2 CASCADE CONSTRAINTS,则删除t1的外键约束,然后删除t2表;注意此命令不能回滚。
(4) 删除表约束
ALTER TABLEtable_nameDROP CONSTRAINTconstraint_name
(5) 查看表结构
● sqlplus:DESCtable_name
● plsql dev:All objectsèTablesètable_nameè右键查看
(6)修改表
● 表改名:ALTER TABLEsrc_table_nameRENAME TOdst_table_name
● 删除列:ALTER TABLEtable_nameDROP COLUMNcolumn_name;
● 添加列:
ALTER TABLEtable_nameADD
(
field_1 field_1_type field_1_constraint,
field_2 field_2_type field_1_constraint,
……
field_n field_n-type field_1_constraint
);
● 修改列:类型、大小、默认值、默认空约束
ALTER TABLEtable_nameMODIFY
(
field_1 field_1_type field_1_constraint,
field_2 field_2_type field_1_constraint,
……
field_n field_n-type field_1_constraint
);
● 修改列:添加约束和删除约束
参见上文。
● 修改列:关闭约束和打开约束
不想删除约束但又不想他现在其作用,这时可以采用DISABLE来完成此工作;我们还可以采用CASCADE关键字来把相互引用的约束一起级联关闭;可以通过ENABLE关键点来开启约束,使得约束有效
ALTER TABLEtable_nameDISABLECONSTRAINTconstraint_nameCASCADE;
ALTER TABLEtable_nameENABLECONSTRAINTconstraint_nameCASCADE;
● 修改列:列名修改
ALTER TABLEtable_nameRENAME COLUMNsrc_column_nameTOdst_column_name;
(7) 给表加注释
● 给表加注释
COMMENT ON TABLEtable_nameIS ‘comment_string’
● 给列加注释
COMMENT ON COLUMNtable_name.column_nameIS‘comment_string’;
(8)TRANCATE表
TRUNCATE TABLEtable_name;
●TRANCATE和DELETE只删除数据不删除表的结构(定义)对快速、无LOG记录的方法,它等同于不含WHERE子句的DELETE语句,至少表面上看来功能上相同,但TRANCATETABLE的速度更快,并且使用更少的SYSTEM RESOURCE和TRANCATIONLOG RESOURCE。
●TRANCATE语句所使用的LOG TABLESPACE较少。DELETE语句每删除一行RECORD,都需要在LOG中为每一个所删除的行进行记录,但是TRANCATE是通过释放用于STORE DATA的数据PAGE来删除数据。
●TRANCATE语句所使用的LOCK较少。DELETE语句始终锁定TABLE中的各行,而TRANCATE始终锁定TABLE本身和PAGE本身,不是TABLE中的各行。
●TRANCATE语句通常不会在所删除的TABLE中留有空页。DELETE语句执行后,TABLE中仍然会保留空页,而且必须至少使用一个排他表锁,LCK_M_X,才能释放堆中的空表,否则执行完DELETE操作后,表或堆中会包含相当多的空页或空表,而且对于INDEX,DELETE操作同样会留下一些空页。而TRANCATE操作后,只是会在DB而不是TABLE中保留一些相关的信息。
●TRANCATE语句不可回滚、触发器中没有TRUNCATE,即这个语句无法触发任何操作
●TRANCATE和DELETE只删除数据不删除表的结构(定义),DROP语句将删除表的结构被依赖的约束(CONSTRAINT),触发器(TRIGGER),索引(INDEX);依赖于该表的存储过程/函数将保留,但是变为INVALID状态