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.經組委會協商,需要刪除女子跳高比賽項目

 

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