DML數(shù)據(jù)操作語言:
insert(單條/多條)? ?添加
update? ?修改
delete? ? 刪除
數(shù)據(jù)添加 insert
insert into 表名(字段列表可選項,各字段用逗號分隔) values(每個字段的值,中間用逗號分隔)
比如向dept表里插入一條數(shù)據(jù)
第一種帶有字段列表的
insert into dept (DNAME,DEPTNO,LOC) values('java17班',60,'shenyang');
不帶字段列表的
insert into dept values(70,'java18','shenyang');
不插入所有字段
帶有字段列表的远寸,字段可以部分插入
insert into dept(deptno,dname)
values(90,'java90');
插入空值
insert into dept
values(91,'java100',null);
批量插入
1)直接批量插入
insert into dept
values(92,'java92',null),(93,'java93',null);
2)子查詢插入
首選建一個空表,跟dept表結構相同
create table 新表名 as 子查詢
create table dept2 as select * from dept where 1=0;? ?(where條件如果不成立,就只復制表結構)
create table dept3 as select * from dept;(where條件如果成立坡慌,就復制表結構和數(shù)據(jù))
可以復制表結構的部分字段
create table dept4 as select deptno,dname from dept where 1=0;
create table dept4 as select deptno,dname from dept where deptno<=40;
數(shù)據(jù)修改 update
修改刪除一定要謹慎
update 表名 set 字段名1=字段值1状原,字段名2=字段值2,.....字段名n=字段值n
where 條件;
例:update dept
set dname='java70',loc='hangzhou'
where deptno=70;
修改主鍵
update dept?
set deptno=71
where deptno=70;
數(shù)據(jù)刪除 delete
delete from 表名 where 條件;
delete from dept4 where deptno>40;
截斷表TRUNCATE(了解斜脂,不常用)
TRUNCATE?table 表名;
?TRUNCATE和DELETE區(qū)別
–TRUNCATE是DDL抓艳,只能刪除表中所有記錄,釋放存儲空間帚戳,使用ROLLBACK不可以回滾玷或。
–DELETE是DML,可以刪除指定記錄销斟,不釋放存儲空間,使用ROLLBACK可以回滾椒舵。
事務(*)
?事務(Transaction)概念
–事務:也稱工作單元蚂踊,是由一個或多個SQL語句所組成的操作序列,這些SQL語句作為一個完整的工作單元笔宿,要么全部執(zhí)行成功犁钟,要么全部執(zhí)行失敗。在數(shù)據(jù)庫中泼橘,通過事務來保證數(shù)據(jù)的一致性涝动。
–事務處理語言:
Transaction Process Language ,簡稱TPL,主要用來對組成事務的DML語句的操作結果進行確認或取消炬灭。確認也就是使DML操作生效醋粟,使用提交(COMMIT)命令實現(xiàn);取消也就是使DML操作失效重归,使用回滾(ROLLBACK)命令實現(xiàn)米愿。
–通過事務的使用,能防止數(shù)據(jù)庫中出現(xiàn)數(shù)據(jù)不一致現(xiàn)象鼻吮。如兩個銀行賬戶進行轉(zhuǎn)賬育苟,涉及到兩條更新操作,這兩條更新操作只允許全部成功或失敗椎木,否則數(shù)據(jù)會出現(xiàn)不一致的現(xiàn)象违柏。
?事務特征(*)
可用四個字母的縮寫表示:即ACID
–原子性(Atomicity)
?事務就像“原子”一樣博烂,不可被分割,組成事務的DML操作語句要么全成功漱竖,要么全失敗禽篱,不可能出現(xiàn)部分成功部分失敗的情況。
–一致性(Consistency)
?一旦事務完成闲孤,不管是成功的谆级,還是失敗的,整個系統(tǒng)處于數(shù)據(jù)一致的狀態(tài)讼积。
–隔離性(Isolation)
?一個事務的執(zhí)行不會被另一個事務所干擾肥照。比如兩個人同時從一個賬戶從取錢,通過事務的隔離性確保賬戶余額的正確性勤众。
–持久性(Durability)
?也稱為永久性舆绎,指事務一旦提交,對數(shù)據(jù)的改變就是永久的们颜,不可以再被回滾吕朵。
事務操作
1.用begin,rollback,commit來實現(xiàn)
begin開始一個事務
rollback事務回滾
commit 事務提交
事務支持
1)數(shù)據(jù)引擎 INNODB 支持事務
show variables like 'autocommit';? 開關為on 默認自動提交
如果想測試事務,先將開關關掉
2)set autocommit =0? ?禁止自動提交
如果不好用窥突,就設置成全局的
set @@global.autocommit=0;
字段上設置主鍵可以rollback回去
(set? autocommit =1? 開啟自動提交)
show variables like 'autocommit';? 開關為off
?事務組成
–在數(shù)據(jù)庫中努溃,事務由一組相關的DML或SELECT語句,加上一個TPL語句(COMMIT阻问、ROLLBACK)或一個DDL語句(CREATE梧税、ALTER、DROP称近、TRUNCATE等)或一個DCL(GRANT第队、REVOKE)語句。
–例:如下語句組成兩個事務刨秆。
?INSERT….
?UPDATE….
?DELETE….
?SELECT….
?INSERT…
?COMMIT;-- 前6條語句凳谦,組成第1個事務
?UPDATE…
?DELETE….
?CREATE…
;--后3條語句,組成第2個事務
例:
-- 查看自動提交按鈕狀態(tài)
show variables like 'autocommit';
-- 不自動提交
set autocommit =0
-- 再查詢開關狀態(tài)
show variables like 'autocommit';
insert into t_class values(null,'班級1');
update t_class set class_name='班級1update' where class_name="班級1"
ROLLBACK;
select * from t_class;
insert into t_class values(null,'班級1');
update t_class set class_name='班級1update' where class_name="班級1"
commit;
select * from t_class;
事務提交
–隱式提交:
當下列任意一種情況發(fā)生時衡未,會發(fā)生隱式提交
?執(zhí)行一個DDL(CREATE尸执、ALTER、DROP缓醋、TRUNCATE剔交、RENAME)語句;
?執(zhí)行一個DCL(GRANT改衩、REVOKE)語句岖常;
–隱式回滾:
當下列任意一種情況發(fā)生時,會發(fā)生隱式回滾
?客戶端強行退出
?客戶端連接到服務器端異常中斷
?系統(tǒng)崩潰
事務高級
?設置保存點:
如果在一個事務內(nèi)葫督,想要回滾到指定位置竭鞍,不是回滾到事務的起始點板惑,可以通過保存點(SAVEPOINT)來實現(xiàn)。
–SAVEPOINT savepointname偎快;--定義一個保存點語句;
–ROLLBACK? TO? savepointname;--回滾到指定保存點;
BEGIN;????????????????????? ——開始事務操作
DELETE FROM test ;
ROLLBACK;??????????????????????? ——撤消DELETE操作
INSERT INTO test VALUES(’A’);
SAVEPOINT insert_a;??????????? ——定義insert_a保存點
INSERT INTO test VALUES(’B’);
SAVEPOINT insert_b;???????????? ——定義insert_b保存點
INSERT INTO test VALUES(’C’);
ROLLBACK TO insert_b;???——撤消操作到insert_b保存點
DELETE FROM test WHERE test_str = ‘A’;
COMMIT;????????? ??????????????????——將所有修改寫入數(shù)據(jù)庫
ROLLBACK;? ??-—所有操作已經(jīng)COMMIT提交冯乘,不能回滾
語言:
TPL:Transaction Process Language ,簡稱(begin?COMMIT、ROLLBACK)
? ? ? (commit rollback結束事務)
DDL;數(shù)據(jù)定義語言(CREATE晒夹、ALTER裆馒、DROP、TRUNCATE等)? (隱式結束事務)
DCL(GRANT丐怯、REVOKE)??(隱式結束事務)
DML:數(shù)據(jù)操作語言(insert update delete)
DQL:數(shù)據(jù)查詢語言
練習4
?1.修改部門20的員工信息喷好,把82年之后入職的員工入職日期向后調(diào)整10天
update emp_back set hiredate=DATE_ADD(hiredate,INTERVAL 10 day)
where deptno=20 and hiredate>'1982-12-31';
?3.修改工作地點在NEW YORK或CHICAGO的員工工資,工資增加500
create table emp_exam4? ?as select * from emp;
update emp_exam4
set sal=sal+500
where deptno in
(select deptno
from dept where loc in('NEW YORK','CHICAGO'));
練習3
?2.把emp表中入職日期在1982年1月1日之前的員工信息復制到emp_back表中读跷。
create table emp_back as select * from emp where hiredate<'1982-01-01';
課后習題:
2梗搅、(8)請使用一條SQL語句,使用子查詢效览,更新班級表中每個班級的人數(shù)字段
update class a,(select studentcid,count(*) cn from student GROUP BY studentcid) b
set a.ccount=b.cn
where a.classid=b.studentcid;
練習5?
-- 1.刪除經(jīng)理編號為7566的員工記錄emp_cp
DELETE FROM emp_cp where mgr=7566;
-- 2.刪除工作在NEW YORK的員工記錄emp_cp
DELETE FROM emp_cp WHERE deptno in(
SELECT deptno
from dept
WHERE loc='NEW YORK')
-- 3.刪除工資大于所在部門平均工資的員工記錄emp_cp
DELETE a.*
from emp a,
(select deptno,AVG(sal) avg from emp GROUP BY deptno) s
where a.deptno=s.deptno
and a.sal>s.avg
delete from emp where empno in(
select empno from
(select empno from emp e,
(select deptno,avg(sal) avg_sal
from emp
group by deptno) d
where e.deptno=d.deptno
and e.sal>d.avg_sal) a)
作業(yè) :
課后作業(yè)1无切、2大題