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、 EXPLAIN PLAN、 LOCK TABLE等命令 |
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 TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
(2)创建表约束(DDL)
● 注意:在Oracle中default是一个值,而SQL Server中default是一个约束。大括号表示内容可选。
● 创建主键约束
CREATE TABLE table_name
(
field_1 field_1_type {CONSTRAINT constraint_name} PRIMARY KEY,
field_2 field_2_type,
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY(field_1);
CREATE TABLE user_info ( user_id VARCHAR2(20) PRIMARY KEY, user_passwd VARCHAR2(20), state_id NUMBER ); 或者 CREATE TABLE user_info ( user_id VARCHAR2(20), user_passwd VARCHAR2(20), state_id NUMBER ); ALTER TABLE user_info ADD CONSTRAINT pk_userinfo PRIMARY KEY(user_id); |
● 创建外键约束
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type {CONSTRAINT constraint_name} REFERENCES foreign_table_name(field),
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY(foreign_key_field) REFERENCE foreign_table_name(field);
CREATE TABLE state ( state_id NUMBER PRIMARY KEY, state_name VARCHAR2(20) ); CREATE TABLE user_info ( user_id VARCHAR2(20) PRIMARY KEY, user_passwd VARCHAR2(20), state_id NUMBER CONSTRAINT fk_userinfo_state REFERENCES state(state_id) ); 或者 CREATE TABLE user_info ( user_id VARCHAR2(20) PRIMARY KEY, user_passwd VARCHAR2(20), state_id NUMBER ); ALTER TABLE user_info ADD CONSTRAINT fk_userinfo_state FOREIGN KEY(state_id) REFERENCES state(state_id); |
● 创建非空约束
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type {CONSTRAINT constraint_name} NOT NULL,
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type NOT NULL,
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLE table_name MODIFY (field_name NOT NULL);
CREATE TABLE user_info ( user_id VARCHAR2(20), user_passwd varchar2(20) CONSTRAINT notnull_userpasswd NOT NULL, state_id NUMBER ); 或者 CREATE TABLE user_info ( user_id VARCHAR2(20), user_passwd varchar2(20), state_id NUMBER ); ALTER TABLE user_info MODIFY (user_passwd NOT NULL); |
● 创建唯一约束
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type {CONSTRAINT constraint_name} UNIQUE,
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(field_name);
CREATE TABLE dog ( dog_id NUMBER, dog_name VARCHAR2(20) CONSTRAINT un_dogname UNIQUE ); 或者 CREATE TABLE dog ( dog_id NUMBER, dog_name VARCHAR2(20) ); ALTER TABLE dog ADD CONSTRAINT un_dogname UNIQUE(dog_name); |
● 创建检查约束
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type {CONSTRAINT constraint_name} CHECK(judge_condition),
……
field_n field_n-type
);
或者
CREATE TABLE table_name
(
field_1 field_1_type,
field_2 field_2_type,
……
field_n field_n-type
);
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK(judge_condition);
CREATE TABLE pig ( pig_id NUMBER CONSTRAINT ck_pigid CHECK(pig_id>=0), pig_name VARCHAR2(20) ); 或者 CREATE TABLE pig ( pig_id NUMBER, pig_name VARCHAR2(20) ); ALTER TABLE pig ADD CONSTRAINT ck_pigid CHECK(pig_id>=0); |
(3) 删除表(DDL)
DROP TABLE table_name CASCADE CONSTRAINTS
说明:如果表t1的外键在表t2中,则删除t2的时候使用DROP TABLE t2
则系统提示:ORA-02449:表中的唯一/主键被外键引用。若使用DROP TABLE t2 CASCADE CONSTRAINTS,则删除t1的外键约束,然后删除t2表;注意此命令不能回滚。
(4) 删除表约束
ALTER TABLE table_name DROP CONSTRAINT constraint_name
(5) 查看表结构
● sqlplus:DESC table_name
● plsql dev:All objects è Tables è table_name è 右键查看
(6) 修改表
● 表改名:ALTER TABLE src_table_name RENAME TO dst_table_name
● 删除列:ALTER TABLE table_name DROP COLUMN column_name;
● 添加列:
ALTER TABLE table_name ADD
(
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 TABLE table_name MODIFY
(
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 TABLE table_name DISABLE CONSTRAINT constraint_nameCASCADE;
ALTER TABLE table_name ENABLE CONSTRAINT constraint_nameCASCADE;
● 修改列:列名修改
ALTER TABLE table_name RENAME COLUMN src_column_name TO dst_column_name;
(7) 给表加注释
● 给表加注释
COMMENT ON TABLE table_name IS ‘comment_string’
● 给列加注释
COMMENT ON COLUMN table_name.column_name IS ‘comment_string’;
(8)TRANCATE表
TRUNCATE TABLE table_name;
●TRANCATE和 DELETE只删除数据不删除表的结构(定义)对快速、无LOG记录的方法,它等同于不含WHERE子句的DELETE语句,至少表面上看来功能上相同,但TRANCATE TABLE的速度更快,并且使用更少的SYSTEM RESOURCE和TRANCATION LOG 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状态