oracle.数据的增删改、事务、创建表、修改表、删除表

一、数据的增删改
1、备份表
(01)全表备份
CREATE TABLE 新表名 AS 子查询;

---将emp表全表备份
CREATE TABLE emp_bak AS SELECT * FROM emp;

SELECT * FROM emp_bak;

(02)只备份表结构,不备份数据
CREATE TABLE 新表名 AS 子查询 WHERE 1=2;
CREATE TABLE emp_bak1 AS SELECT * FROM emp where 1=2;

select * from emp_bak1;

(03)在备表的同时,修改列名
CREATE TABLE 新表名(新列名,新列名....) AS SELECT 列名,列名.... FROM 表名 WHERE 条件;

CREATE TABLE emp_bak2(pno,ename,work,salary) AS SELECT empno,ename,job,sal from emp;

SELECT * FROM emp_bak2;

2、新增表数据
(01)复制表数据
INSERT INTO 表名(列名,列名....) 子查询;

---将dept表的数据复制到emp表中
INSERT INTO emp(empno,ename,JOB) SELECT * FROM dept;

select * from emp;

(02)插入数据
INSERT INTO 表名[(列名,列名....)] VALUES(值1,值2....);

---不写列名,给表中的所有列赋值
INSERT INTO emp VALUES(8888,'zhangsan','java dev',7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);

INSERT INTO emp VALUES(8889,'zhangsan',DEFAULT,7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);
注意:当插入数据时,表没有指定列名,如果列想要插入null或是默认值,值不可以不写,要写成null或default

SELECT * FROM EMP;
desc EMP;
ALTER TABLE emp MODIFY(JOB DEFAULT 'clerk');

---写列名,对于没有指定的列,如果有默认值直接赋默认值,如果没有默认值,给null
INSERT INTO emp(empno,ename,sal) VALUES(6666,'JACK',1000);

select * from emp;

INSERT INTO emp(ename,JOB,sal,comm,deptno) VALUES('lily','salesman',2000,200,10);  ---出错

---使用子查询插入数据
---往emp表中给SALES部门新增一名员工
INSERT INTO emp(empno,ename,JOB,sal,deptno)
VALUES(9999,'wangwu','salesman',2000,(SELECT deptno FROM dept WHERE upper(dname)='SALES'));

3、修改表数据
UPDATE 表名 SET 列名=新值,列名=新值,... [WHERE 条件];

--修改emp表中职务为CLERK的员工的薪水,都增加20%;
UPDATE emp SET sal=sal*1.2 WHERE upper(job)='CLERK';

SELECT * FROM emp;

UPDATE emp set ename='aaa',job='test',mgr=7788,sal=sal*1.3,comm=500 WHERE empno=10;

SELECT * FROM EMP WHERE EMPNO=10;

---全表修改
UPDATE emp SET sal=sal*0.8,comm=100;

---使用子查询
UPDATE EMP SET sal=sal+500,comm=200 WHERE deptno=(SELECT deptno FROM dept WHERE UPPER(dname)='SALES');

4、删除表数据
(01)DELETE [FROM] 表名 [WHERE 条件];

DELETE FROM emp WHERE deptno=10;

DELETE emp WHERE deptno=20;

DELETE * FROM emp;  ---错误的

DELETE emp;

select * from emp;

INSERT INTO emp SELECT * FROM emp_bak;

(02)截断表:删除全表数据
TRUNCATE TABLE 表名;

truncate table emp;

DELETE 和TRUNCATE的区别:
   DELETE 可以删除部分数据,truncate只能删除全表数据
   DELETE 删除的数据可以回滚,truncate不允许回滚
   DELETE删除的速度比truncate慢,因为delete要写日志

5、事务:TPL

DQL:数据查询语言   SELECT
DML:数据操作语言   INSERT DELETE UPDATE
DDL:数据定义语言   CREATE ALTER DROP
DCL:数据控制语言   GRANT REVOKE
TPL:事务语言      COMMIT,ROLLBACK,SAVEPOINT

1、commit:提交
2、ROLLBACK; 回滚
3、SAVEPOINT 保存点名;   设置事务保存点
4、rollback TO 事务保存点;   --回滚至事务保存点

select * from emp;


INSERT INTO emp VALUES(8888,'zhangsan','java dev',7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);

INSERT INTO emp VALUES(8889,'zhangsan',DEFAULT,7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);
savepoint aa;
INSERT INTO emp(empno,ename,sal) VALUES(6666,'JACK',1000);

insert into emp select * from emp_bak;

ROLLBACK TO aa;

rollback;

INSERT INTO emp VALUES(8888,'zhangsan','java dev',7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);

INSERT INTO emp VALUES(8889,'zhangsan',DEFAULT,7788,to_date('2018-07-11','yyyy-mm-dd'),4000,500,40);
commit;
INSERT INTO emp(empno,ename,sal) VALUES(6666,'JACK',1000);

INSERT INTO emp SELECT * FROM emp_bak;

CREATE TABLE dept_bak AS SELECT * FROM dept;

select * from emp;

ROLLBACK;

二、新增表:
1、查询表结构:  sqlplus命令
DESC 表名;

2、创建表:
CREATE TABLE 表名(
  列名 数据类型 [DEFAULT 默认值 约束],
  列名 数据类型 [DEFAULT 默认值 约束],
  ...
  列名 数据类型 [DEFAULT 默认值 约束]
);

3、数据类型:
数值型:  NUMBER
字符串类型: VARCHAR2
日期型 :   DATE
大对象类型:  clob,blob

踩过的雷:char(n)固定长度的字符串

                  varchar2(n)可变长度的字符串,用户指定最大长度n

                  建议永远使用varchar2

(01)数值 NUMBER(p,s)  p有效位数,s精度
s=0:NUMBER(p)
s>0:小数点右边的位数为s,小数点左边的有效位数为p-s位
s<0:小数点左边的有效位数为:p+|s|位

CREATE TABLE A(
  id1 NUMBER(5),
  id2 NUMBER(5,2),
  id3 NUMBER(5,-2)
);

select * from a;
INSERT INTO A(id1) VALUES(455.55);
INSERT INTO A(id1) VALUES(45555.55);
INSERT INTO A(id1) VALUES(455555); ---插入失败

INSERT INTO A(id2) VALUES(455.55);
INSERT INTO A(id2) VALUES(455.55555);
INSERT INTO A(id2) VALUES(455);

INSERT INTO A(id3) VALUES(455.55);
INSERT INTO A(id3) VALUES(45555);
INSERT INTO A(id3) VALUES(4555555);
INSERT INTO A(id3) VALUES(45555555);---插入失败

(02)字符串类型
CHAR(n):固长字符串,无论字符串的长度是否为N,结果都为n,
不足的补空格

(此种类型的属性列,当为判断条件时,会报错,因为带上空格作为条件,尽量不要用)

VARCHAR2(n):变长字符串,字符串有几位占用几位

drop table a;

CREATE TABLE A(
  name1 CHAR(10) references emp(ename),
  name2 VARCHAR2(10)
);

INSERT INTO A VALUES('aaa','aaa');
INSERT INTO A VALUES('aaabbbccca','aaa');
SELECT name1,LENGTH(name1),name2,LENGTH(name2)
FROM A;

(03)日期型:
默认日期:日-月-年
DROP TABLE A;

CREATE TABLE A(
  birthday DATE
);

INSERT INTO A VALUES('10-10月-2018');
insert into a values(to_date('20181010','yyyymmdd'));

SELECT * FROM A;

(04)对象(4G以内):
CLOB:文件对象
blob:二进制对象

drop table a;

CREATE TABLE A(
  obj CLOB,
  obj2 BLOB
);

insert into a values('fdcvgsjkmadqwjkrwerghejwklfdsnmkasdfbwekrqwetrwerqwere','000000000111111000011111');

select * from a;

三. 修改表
1.添加列
ALTER TABLE 表名 ADD(列名 数据类型 [DEFAULT 默认值 约束],列名 数据类型 [DEFAULT 默认值 约束]...);
2.修改列的属性:修改数据类型,长度,默认值,约束
alter table 表名 modify(列名 数据类型 [DEFAULT 默认值 约束]...);
3.修改列名
alter table 表名 rename column 旧的列名 to 新的列名;
4.删除列
alter table 表名 drop column 列名;
5.修改表名
rename 旧的表名 to 新的表名;

四.删除表
drop table 表名 [cascade constraints];

CASCADE CONSTRAINTS:---当主键记录被外键引用时,可以添加此选项删除表的同时删除相关约束.

    有某个学生运动会比赛信息的数据库,保存了如下的表:
    运动员sporter表:(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系department)
    项目item表(项目编号itemid,项目itemname,loc地区)
    成绩grade表(运动员编号sporterid,项目编号itemid,积分mark)
   
1.求出总积分最高的系名及总积分
SELECT department,sum(mark)
FROM sporter s,grade g
WHERE s.sporterid=g.sporterid
GROUP BY department
HAVING sum(mark)=(SELECT max(sum(mark))
                  FROM sporter s,grade g
                  WHERE s.sporterid=g.sporterid
                  GROUP BY department);

2.查询在一操场进行比赛的项目名称及其冠军的姓名
SELECT itemname,NAME
FROM sporter s,item i,grade g
WHERE s.sporterid=g.sporterid and i.itemid=g.itemid and loc='一操场' and mark=6;
 
3.找出参加了王玥所参加过的项目的其他同学的姓名
SELECT NAME
FROM sporter s,grade g
WHERE s.sporterid=g.sporterid
      AND itemid IN(SELECT itemid
                    FROM sporter s,grade g
                    where s.sporterid=g.sporterid and name='王玥') and name!='王玥';

4.经查,王玥因为使用了违禁药品,其成绩都记为0分,请在数据库中做出相应修改
update grade set mark=0 where sporterid=(select sporterid from sporter where name='王玥');

5.经组委会协商,需要删除女子跳高比赛项目

 

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