Oracle学习3

Oracle学习3

  • 1 DML语句
  • 2 DDL语句
  • 3 事务
  • 4 数据库对象概述
  • 5 数据库对象-约束

  

1 DML语句

-- DML语句,会引起数据库中发生一个事务!
-- 第一个执行的DML语句,会引起事务
-- 在事务没有结束之前,只有当前用户可以看到对数据库的修改操作,其他用户是看不到的
-- 事务可以以会滚的方式结束,所有的操作被放弃,回滚到事务开始之前的状态
-- 事务也可以以提交的方式结束,对数据库的修改被永久的保存,其他用户可以看到被修改的数据

-- 插入语句
INSERT INTO DEPT(DEPTNO,DNAME,LOC_ID) VALUES (50,'销售部',1000);
INSERT INTO DEPT(DEPTNO,DNAME,LOC_ID) VALUES (60,'开发不',1001);

-- 不指定插入的字段,则表示要插入全部的字段
INSERT INTO DEPT VALUES (50,'销售部',1000);
INSERT INTO DEPT (DEPTNO,DNAME) VALUES (50,'销售部');
INSERT INTO DEPT (DEPTNO,DNAME,LOC_ID) VALUES (60,'销售部',NULL);
ROLLBACK;
COMMIT;

INSERT INTO EMP VALUES (8000,'张1','工程师',7602,'9-12月-1987',3000,1000,20);

INSERT INTO EMP VALUES (8001,'张1','工程师',7602,TO_DATE('1987-12-5','YYYY-MM-DD'),3000,1000,10);

-- 一次性的插入多条数据,复制表中的数据,把查询结果当作数据插入到表中
INSERT INTO DEPT_BAK SELECT * FROM DEPT;



-- UPDATE语句
-- 使用UPDATE语句的时候,在事务没有结束之前,该条数据会被锁住,其他的用户无法修改这条数据
-- 事务结束之后,该条数据的锁被放开,其他的用户才可以操作这条数据
UPDATE EMP SET ENAME = '张2',JOB = '经理' ,SAL= 3500,COMM= 1500  WHERE EMPNO=8001;


-- 删除语句
DELETE FROM DEPT WHERE DEPTNO >40;

合并语句:
Oracle 9i 新增的语句:据条件在表中执行修改或插入数据的功能,如果插入的数据行在目的表中存在就执行UPDATE,如果是不存在则执行INSERT:
1、避免了单独的修改
2、增强性能和应用性
3、在数据仓库应用程序中尤为有用

MERGE INTO DEPT_BACK D
USING DEPT S
ON (D.DEPTNO = S.DEPTNO)
WHEN MATCHED THEN
  UPDATE SET D.DNAME = S.DNAME, D.LOC_ID = S.LOC_ID
WHEN NOT MATCHED THEN
  INSERT VALUES (S.DEPTNO, S.DNAME, S.LOC_ID);

2 DDL语句

1、建表语句

--建表语句
CREATE TABLE STUDENT(
    SID        NUMBER(4)   PRIMARY KEY,
    SNAME      VARCHAR2(10),
    GRADE      VARCHAR2(20),
    SEX        CHAR(2)   DEFAULT  '男',
    BIRTHDAY   DATE
);

-- 在建表的时候使用子查询
CREATE TABLE DEPT_BACK
AS
SELECT  * FROM DEPT;

--新表的字段列表必须与子查询中的字段列表匹配
DROP TABLE DEPT_BACK;
CREATE TABLE DEPT_BACK
AS
SELECT DEPTNO "部门编号",DNAME "部门名称" FROM DEPT WHERE DEPTNO <= 30;

2、修改表结构

--在不影响数据的情况下,对表做出修改,对表的修改主要是对字段的修改
-- 主要的操作:1.添加字段;2.删除字段;3.修改字段(修改字段的类型,修改字段的长度)
-- 添加字段,总是可以成功,新添加的字段出现在表的最后面
ALTER TABLE STUDENT	ADD   TEL  VARCHAR2(11);
   
ALTER TABLE STUDENT	ADD   ADDR   VARCHAR2(20)   ;
   
SELECT * FROM STUDENT;   

-- 修改字段
-- 在该字段没有数据的时候,字段的类型,字段的长度都是可以修改的
ALTER TABLE STUDENT	MODIFY   TEL     NUMBER(11);

ALTER TABLE STUDENT MODIFY   TEL   VARCHAR2(11)   ;

-- 对于缺省值的修改,不会影响已经存在的数据,只会对以后插入的数据产生影响
ALTER TABLE STUDENT MODIFY   SEX    CHAR(2) DEFAULT  '女';   
   
INSERT INTO STUDENT (SID,SNAME,GRADE,BIRTHDAY) VALUES (1003,'张3','一年级',TO_DATE('1985-12-8','YYYY-MM-DD'));   

--当该字段有数据的时候,字段的类型是不能修改的.
--字段的长度是可以修改的 增大总是可以的,减少要看数据的实际长度
ALTER TABLE STUDENT	MODIFY   GRADE  VARCHAR2(20);
   
-- 删除字段
ALTER TABLE STUDENT	DROP COLUMN   ADDR;
    
-- 删除表的数据,TRUNCATE  TABLE 比DELETE的删除速度块,但是该命令一点要慎用
TRUNCATE  TABLE DEPT_BACK;
在删除数据的时候,可以使用DELETE语句,但是效率不高。可以使用TRUNCATE命令来删除数据
RUNCATE TABLE 语句 清除表中所有的记录
是DDL语句,不可以回滚,而DELETE语句可以ROLLBACK
释放表的存储空间,DELETE命令不释放空间
是删除数据的方法之一
语法:TRUNCATE TABLE table_name;

3、修改表名称

在Oracle中,对象的名称可以方便的进行修改。通过一个DDL语句的RENMAE命令可以改变一个数据库对象的名称
使用RENAME语句改变对象名称,可以修改表、视图、序列或者同义词的名称
必须是对象的所有者,即使是DBA也不可以
语法:RENAME old_name TO new_name;
    RENAME STUDENT TO STUDENT_NEW;

3 事务

1、开始于第一个执行的DML语句
2、结束于:
  (1)COMMIT 或 ROLLBACK
  (2)DDL or DCL 语句 (隐式的提交事物)
  (3)用户连接异常,或者用户断开连接 (隐式的回滚)
  (4)系统崩溃 (隐式的回滚)
3、事务会在多种情况下结束。通常应该由产生事务的用户回话通过命令显示的控制事务的结束(COMMIT和ROLLBACK),这样可以保证事务中数据改变的可控性。
4、除了用户直接控制事务外,其他的情况会隐式的结束事务。由于隐式结束事务的不可预料性,应尽量避免隐式的结束事务

Commit和RollBack的优缺点:
1、Oracle中控制事务的主要命令式COMMIT和ROLLBACK命令,还有一个辅助的SAVEPOINT命令
2、使用COMMIT和ROLLBACK来控制事务,有如下的好处
  (1)保证数据一致性,修改过的数据(不一致的数据)在没有提交之前其他的用户是不能看到的
  (2)在数据永久性生效前重新查看修改的数据
  (3)将相关的操作组织在一起。一个事务中的相关数据改变或者全部成功,或者全部失败

提交或回滚前数据的状态
1、事务开始后,执行了一系列的DML操作。在事务结束之前,修改的数据可恢复
2、当前的用户可以看到DML操作的结果
3、其他用户不能看到DML操作的结果
4、被操作的数据被锁住,其他用户不能修改这些数据

提交后数据的状态
1、数据的修改被永久写在数据库中.
2、数据以前的状态永久性丢失.
3、所有的用户都能看到操作后的结果.
4、记录锁被释放,其他用户可操作这些记录

回退到指定的标记点上

--在事务中使用标记点,标记点只在事务之中有效
-- 事务结束之后,所有的标记点统统失效
INSERT INTO DEPT VALUES (50,'开发',1000);
SAVEPOINT A;
DELETE FROM DEPT D WHERE  D.DEPTNO > 30;
SAVEPOINT B;  -- B点的状态是10,20,30
UPDATE DEPT D SET D.DNAME='人事部' where d.deptno=10;
ROLLBACK TO B;
COMMIT;

--错误
ROLLBACK TO A;

4 数据库对象概述

对象名称 描述
基本的数据存储对象,以行和列的形式存在
约束 执行数据校验,保证数据完整性的对象
视图 一个或多个表数据的显示
索引 用于提高查询的速度
同义词 对象的别名

数据库对象的命名规则:
1、必须以字母开头
2、可包括数字(0-9),字母(a~z)和三个特殊字符(# _ $)
3、不要使用oracle的保留字
4、同一用户下的对象不能同名,即使是不同的对象类型

数据类型 说明
VARCHAR2(size) 可变长字符串
CHAR(size) 定长字符串
NUMBER(p,s) 数字值
DATE 日期值
LONG 变长度的字符串,最大字节数可达2GB
CLOB 单位字符串数据最大字节数4G
RAW and LONG RAW 存储二进制数据的变长度字符串
BLOB 二进制数据,最大字节数4G
BFILE 二进制数据外部存储,最大字节数4G

5 数据库对象-约束

  约束是在表上强制执行的数据校验规则,被插入,修改或删除的数据必须符合相关字段上设置的这些检验条件,也就是约束条件
  约束条件可以是构建在一个表的单个字段上,也可以构建在一个表的多个字段上.当表中数据有相互依赖性时,可以保护相关的数据不被删除.
Oracle 支持下面五类完整性约束:

约束 分类
NOT NULL 非空
UNIQUE Key 唯一键
PRIMARY KEY 主键
FOREIGN KEY 外键
CHECK 检察


--==================================数据库约束===============================================
-- 约束必须要建立在表上,但是约束是一个独立的数据库对象.没有表,也就没有约束
-- 创建约束的操作,可以在建表的时候同时把约束创建处理,也可以在建好表之后,通过ALTER TABLE 来给表添加约束
-- 约束也是一个独立的数据库对象,也需要命名,有两种方式,1,我们给约束取名;2.让Oracle给约束取名
-- 非空约束,是唯一一个可以定义在列级的约束(只能看守一个字段),确保该字段的数据不能为NULL
-- 除了主键约束之外,一个表中可以同时存在多种相同类型的约束
DROP TABLE  STUDENTS;
CREATE TABLE STUDENTS(
   SID       NUMBER(4) PRIMARY KEY,
   SNAME     VARCHAR2(20) CONSTRAINT SNAME_NN NOT NULL,  -- 自己命名的非空约束
   GRADE     VARCHAR2(20) NOT NULL -- 系统命名的非空约束
);

INSERT INTO STUDENTS VALUES (1000,'张1');
INSERT INTO STUDENTS VALUES (1001,NULL);
-- 唯一约束,保证该字段的数据不能重复,或字段组合不能重复,但是可以为null
-- 一个表中也可以同时存在多个唯一约束

-- 唯一约束可以作用在单个字段上(称为列级约束)
CREATE TABLE STUDENT(
    SID       NUMBER(4) PRIMARY KEY,
    SNAME     VARCHAR2(20) NOT NULL,
    EMAIL     VARCHAR2(20),
    CONSTRAINTS  EMAIL_UNI  UNIQUE (EMAIL) 
);

INSERT INTO STUDENT VALUES (1000,'张1','[email protected]');
INSERT INTO STUDENT VALUES (1001,'张1','[email protected]');

-- 唯一约束也可以同时作用在多个字段上(称为表级约束)
DROP TABLE STUDENT;

CREATE TABLE STUDENT(
    SID           NUMBER(4)  PRIMARY KEY,
    FIRST_NAME    VARCHAR2(10),
    LAST_NAME     VARCHAR2(20),
    CONSTRAINTS NAME_UNI  UNIQUE  (FIRST_NAME,LAST_NAME)
);

INSERT INTO STUDENT  VALUES (1000,'张','一');
INSERT INTO STUDENT  VALUES (1001,'张','二');
INSERT INTO STUDENT  VALUES (1002,'一','张');

INSERT INTO STUDENT  VALUES (1003,'张','一');
INSERT INTO STUDENT  VALUES (1003,'张',NULL);
INSERT INTO STUDENT  VALUES (1004,NULL,'一');
INSERT INTO STUDENT  VALUES (1005,'张',NULL);
INSERT INTO STUDENT  VALUES (1005,null,NULL);
INSERT INTO STUDENT  VALUES (1006,null,NULL);
-- 主键约束:从功能上说,相当于非空且唯一
-- 在一个表中只能有一个主键约束
-- 通过主键可以唯一确定一条记录
-- 一个实体中什么样的数据可以被确定为主键?不要需用实体的业务数据来当作主键,因为业务数据是可以编号的
-- 应该用一个和实体无关的流水号来当作表的主键

-- 主键约束作用在单个字段上
DROP TABLE STUDENT;
CREATE TABLE STUDENT(
    SID     NUMBER(4),
    SNAME   VARCHAR2(20),
    CONSTRAINTS PK_STU PRIMARY KEY (SID)
);


INSERT INTO STUDENT VALUES (1000,'张1');
INSERT INTO STUDENT VALUES (1001,'张1');
INSERT INTO STUDENT VALUES (1001,'张1');
INSERT INTO STUDENT VALUES (null,'张1');

-- 主键约束同时作用在多个字段上,也被称为联合主键
DROP TABLE STUDENT;
CREATE TABLE STUDENT(
    FIRST_NAME      VARCHAR2(10),
    LAST_NAME       VARCHAR2(20),
    GRADE           VARCHAR2(20),
    CONSTRAINTS PK_STU PRIMARY KEY (FIRST_NAME,LAST_NAME)
);

INSERT INTO STUDENT VALUES ('张','一','Java就业班');
INSERT INTO STUDENT VALUES ('张','二','Java就业班');
INSERT INTO STUDENT VALUES ('二','张','Java就业班');
INSERT INTO STUDENT VALUES ('张','一','Java就业班');
INSERT INTO STUDENT VALUES ('张',null,'Java就业班');
INSERT INTO STUDENT VALUES (NULL,'张','Java就业班');
INSERT INTO STUDENT VALUES (NULL,null,'Java就业班');
-- 一对多(多对一) 用主外键来实现
-- 外键约束,外键约束可以重复,可以为null
-- 外键约束关系到两个表的两个字段之间的关系
-- 在外键约束下,在建表的时候,要先建立父表,后建立子表
CREATE TABLE DEPT1(
    DEPTNO     NUMBER(4) PRIMARY KEY,
    DNAME      VARCHAR2(10)
);

CREATE TABLE EMPL1(
     EMPNO     NUMBER(4) PRIMARY KEY,
     ENAME     VARCHAR2(10),
     JOB       VARCHAR2(10),
     DEPT_NO   NUMBER(4),
     CONSTRAINTS   FK_EMP FOREIGN KEY (DEPT_NO)  REFERENCES DEPT1 (DEPTNO)
);

-- 在外键约束下,在添加数据的时候,要先添加父表数据,后添加子表数据.
INSERT INTO DEPT1 VALUES (10,'销售部');
INSERT INTO DEPT1 VALUES (20,'开发部');
INSERT INTO DEPT1 VALUES (30,'生产部');

INSERT INTO EMPL1 VALUES (1000,'张0','销售员',10);
INSERT INTO EMPL1 VALUES (1001,'张1','销售员',10);
INSERT INTO EMPL1 VALUES (1002,'张2','工程师',20);
INSERT INTO EMPL1 VALUES (1003,'张3','工程师',20);
INSERT INTO EMPL1 VALUES (1004,'张4','工程师',20);
INSERT INTO EMPL1 VALUES (1005,'张5','工程师',NULL);

SELECT * FROM EMPL1;
SELECT * FROM DEPT1;

-- 在外键约束下,在删除数据的时候,要先删除子表数据,后删除父表数据.
DELETE FROM DEPT1 WHERE DEPTNO = 10;
DELETE FROM EMPL1 WHERE DEPT_NO = 10;


-- 在外键约束下,在删除表的时候,要先删除子表,后删除父表
DROP TABLE EMPL1;
DROP TABLE  DEPT1;

-- 父表中的什么样的字段可以被其他表引为外键?父表中的主键或唯一键可以被其他表因为外键
CREATE TABLE DEPT1(
    DEPTNO     NUMBER(4) PRIMARY KEY,
    DNAME      VARCHAR2(10),
    LOCID     NUMBER(4),
    CONSTRAINTS LOC_UIN  UNIQUE (LOCID)
);

CREATE TABLE EMPL1(
     EMPNO     NUMBER(4) PRIMARY KEY,
     ENAME     VARCHAR2(10),
     JOB       VARCHAR2(10),
     DEPT_NO   NUMBER(4)    
);

-- 在建立好表之后,通过ALTER TABLE 在给表添加约束
ALTER TABLE EMPL1
  ADD CONSTRAINTS  FK_EMPL FOREIGN KEY  (DEPT_NO) REFERENCES DEPT1 (DEPTNO);
  
-- 一对一如果用主外键来实现, 在外键上同时设置唯一约束

CREATE TABLE CARD(
   CID      NUMBER(4) PRIMARY KEY,
   CNAME    VARCHAR2(10)  
);


CREATE TABLE PERSON(
   PID       NUMBER(4)   PRIMARY  KEY,
   PNAME     VARCHAR2(20),
   CID       NUMBER(4),
   CONSTRAINTS FK_PER_CARD  FOREIGN KEY (CID) REFERENCES CARD(CID),
   CONSTRAINT  CID_UNI   UNIQUE (CID)
);

INSERT INTO CARD   VALUES (1000,'身份证');
INSERT INTO CARD   VALUES (1001,'身份证');

INSERT INTO PERSON VALUES (1,'张1',1000)
INSERT INTO PERSON VALUES (2,'张2',1000)

SELECT * FROM CARD;
SELECT * FROM PERSON;
-- 多对多关系的实现,要引入关系表
CREATE TABLE STUDENT(
    SID      NUMBER(4) PRIMARY KEY,
    SNAME    VARCHAR2(20)
);

CREATE TABLE COURSE(
   CID      NUMBER(4) PRIMARY KEY ,
   CNAME    VARCHAR2(20)
);


-- 1.关系表中可以用上面两个表的主键当作外键,同时又把外键当作联合主键
DROP TABLE STU_COUR;

CREATE TABLE  STU_COUR (
   SID      NUMBER(4) ,
   CID      NUMBER(4),
   CONSTRAINT  FK1  FOREIGN KEY  (SID) REFERENCES STUDENT (SID),
   CONSTRAINT  FK2  FOREIGN KEY  (CID) REFERENCES COURSE (CID),
   CONSTRAINT  PK_STU_COUR  PRIMARY KEY  (SID,CID)
);


-- 2.关系表中可以用上面两个表的主键当作外键,关系表有自己独立的主键
CREATE TABLE  STU_COUR (
   SCID     NUMBER(4) PRIMARY KEY,
   SID      NUMBER(4) ,
   CID      NUMBER(4),
   CONSTRAINT  FK1  FOREIGN KEY  (SID) REFERENCES STUDENT (SID),
   CONSTRAINT  FK2  FOREIGN KEY  (CID) REFERENCES COURSE (CID)   
);

INSERT INTO STUDENT  VALUES (1,'张1');
INSERT INTO STUDENT  VALUES(2,'张2');
INSERT INTO STUDENT  VALUES(3,'张3');
INSERT INTO STUDENT  VALUES(4,'张4');

INSERT INTO COURSE VALUES (1,'Corejava');
INSERT INTO COURSE VALUES (2,'Oracle');
INSERT INTO COURSE VALUES (3,'html');
INSERT INTO COURSE VALUES (4,'JavaScript');
INSERT INTO COURSE VALUES (5,'JavaWeb');

INSERT INTO STU_COUR VALUES (1,1,1);
INSERT INTO STU_COUR VALUES (2,1,2);
INSERT INTO STU_COUR VALUES (3,1,3);
INSERT INTO STU_COUR VALUES (4,1,4);
INSERT INTO STU_COUR VALUES (5,2,1);
INSERT INTO STU_COUR VALUES (6,2,3);
INSERT INTO STU_COUR VALUES (7,2,4);

-- 查询张1学习了那些课程
SELECT  S.SID,S.SNAME,C.CID,C.CNAME
FROM STUDENT S,COURSE C ,STU_COUR SC
WHERE S.SID = SC.SID AND C.CID=SC.CID AND S.SNAME = '张1';

SELECT * FROM STUDENT;

-- CHECK约束,数据要符合设置的条件
DROP TABLE USERS;
CREATE TABLE USERS (
  ID         NUMBER(4) PRIMARY KEY,
  NAME       VARCHAR2(20),
  SEX        CHAR(2) DEFAULT '男'  CHECK  (SEX IN ('男','女'))
);


CREATE TABLE USERS (
  ID         NUMBER(4) PRIMARY KEY,
  NAME       VARCHAR2(20),
  SEX        CHAR(2) DEFAULT '男'  ,
  CONSTRAINTS SEX_VALUE  CHECK (SEX IN ('男','女'))
);

INSERT INTO USERS  (ID,NAME) VALUES (1,'张1');
INSERT INTO USERS  (ID,NAME,SEX) VALUES (3,'张1','中');

SELECT * FROM USERS;
-- 删除约束,使用ALTER TABLE语句,删除约束的时候,数据不会受到影响
ALTER TABLE USERS
  DROP  CONSTRAINTS SEX_VALUE;
  
--  级联删除主键约束 ,在删除主键约束的同时,把引用该主键作为外键的约束同时删除
CREATE TABLE DEPT1(
    DEPTNO     NUMBER(4) PRIMARY KEY,
    DNAME      VARCHAR2(10),
    LOCID     NUMBER(4),
    CONSTRAINTS LOC_UIN  UNIQUE (LOCID)
);

CREATE TABLE EMPL1(
     EMPNO     NUMBER(4) PRIMARY KEY,
     ENAME     VARCHAR2(10),
     JOB       VARCHAR2(10),
     DEPT_NO   NUMBER(4)    
);

-- 在建立好表之后,通过ALTER TABLE 在给表添加约束
ALTER TABLE EMPL1
  ADD CONSTRAINTS  FK_EMPL FOREIGN KEY  (DEPT_NO) REFERENCES DEPT1 (DEPTNO); 
  
ALTER TABLE DEPT1
  DROP PRIMARY KEY  CASCADE;  

你可能感兴趣的:(Oracle)