-- 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);
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;
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;
对象名称 | 描述 |
---|---|
表 | 基本的数据存储对象,以行和列的形式存在 |
约束 | 执行数据校验,保证数据完整性的对象 |
视图 | 一个或多个表数据的显示 |
索引 | 用于提高查询的速度 |
同义词 | 对象的别名 |
数据库对象的命名规则:
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 |
约束是在表上强制执行的数据校验规则,被插入,修改或删除的数据必须符合相关字段上设置的这些检验条件,也就是约束条件
约束条件可以是构建在一个表的单个字段上,也可以构建在一个表的多个字段上.当表中数据有相互依赖性时,可以保护相关的数据不被删除.
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;