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