diff --git "a/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/SQLQuery1.sql" "b/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/SQLQuery1.sql" new file mode 100644 index 0000000000000000000000000000000000000000..d26a839b655fb2f1d134be5cc1f463b072662eb3 --- /dev/null +++ "b/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/SQLQuery1.sql" @@ -0,0 +1,99 @@ +--假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +--账户余额>=0约束 +alter table BankCard add constraint CK_Money check(CardMoney >= 0) + +declare @myError int = 0 +declare @getMoney float = 6000 +declare @carID varchar(10) +declare @name varchar(10) +declare @Phone varchar(10) +set @name = '刘备' + +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +--开始事务 +begin transaction A +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +insert into CardExchange values(@carID,0,@getMoney,getdate()) +set @myError += @@ERROR +--事务提交 +if(@myError = 0) +begin + commit transaction A +end +else +begin + rollback transaction B +end +go + +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +alter table BankCard add constraint CK_Money check(CardMoney >= 0) +declare @myError int = 0 +declare @getMoney float = 1000 +declare @carID varchar(10) +declare @carID1 varchar(10) +declare @name varchar(10) +declare @name1 varchar(10) +declare @Phone varchar(10) +declare @Phone1 varchar(10) +set @name = '刘备' +set @name1 = '张飞' +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @carID1 = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) +select @Phone1 = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) + +begin transaction A +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +update BankCard set CardMoney += @getMoney where CardNo = @carID1 +set @myError += @@ERROR +insert into CardTransfer values(@carID,@carID1,@getMoney,getdate()) +set @myError += @@ERROR + +if(@myError = 0) +begin + commit transaction A +end +else +begin + rollback transaction B +end + + +--列转行 +CREATE TABLE grades1 ( + id int NOT NULL , + name varchar(20) DEFAULT NULL, + subject varchar(20) DEFAULT NULL, + score int DEFAULT NULL, + +) + +INSERT INTO grades1 VALUES (1, 'lyy', '英语', 100); +INSERT INTO grades1 VALUES (2, 'lyy', '数学', 98); +INSERT INTO grades1 VALUES (3, 'lyy', '语文', 97); +INSERT INTO grades1 VALUES (4, 'gss', '英语', 89); +INSERT INTO grades1 VALUES (5, 'gss', '数学', 88); +INSERT INTO grades1 VALUES (6, 'gss', '语文', 87); +INSERT INTO grades1 VALUES (7, 'liming', '英语', 79); +INSERT INTO grades1 VALUES (8, 'liming', '数学', 77); +INSERT INTO grades1 VALUES (9, 'liming', '语文', 75); + +select * from grades1 + +select name, +max(case subject when '英语' then score else 0 end)英语, +max(case subject when '数学' then score else 0 end)数学, +max(case subject when '语文' then score else 0 end)语文 +from grades1 +group by name + +select * from grades1 +pivot +( +max(score) +for subject in([英语],[数学],[语文]) +) as a \ No newline at end of file diff --git "a/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/\344\272\213\345\212\241.md" "b/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..8a8ec31b2377b4adab7c9c5761fcf19d7c5b7d78 --- /dev/null +++ "b/15\351\231\210\347\253\213\346\231\272/9.28\344\272\213\345\212\241/\344\272\213\345\212\241.md" @@ -0,0 +1,33 @@ +#### 浜嬪姟 + +**浜嬪姟锛 Transaction锛夌敱涓娆℃垨鑰呭娆″熀鏈搷浣滄瀯鎴愶紝鎴栬呰锛屼簨鍔$敱涓鏉℃垨鑰呭鏉 SQL 璇彞鏋勬垚銆** + +**浜嬪姟涓殑鎵鏈 SQL 璇彞鏄竴涓暣浣擄紝鍏卞悓杩涢锛屼笉鍙垎鍓诧紝瑕佷箞鍏ㄩ儴鎵ц鎴愬姛锛岃涔堝叏閮ㄦ墽琛屽け璐ャ** + +#### 浜嬪姟鐨勫睘鎬(ACID) + +涓鑸潵璇达紝浜嬪姟鍏锋湁鍥涗釜鏍囧噯灞炴э紝鍒嗗埆鏄師瀛愭э紙**A**tomicity锛屾垨绉颁笉鍙垎鍓叉э級銆佷竴鑷存э紙**C**onsistency锛夈侀殧绂绘э紙**I**solation锛屽張绉扮嫭绔嬫э級銆佹寔涔呮э紙**D**urability锛夛紝绠绉 **ACID**銆傚叿浣撹鏄庡涓嬶細 + +##### 1) 鍘熷瓙鎬 + +涓涓簨鍔′腑鐨勬墍鏈 SQL 璇彞锛岃涔堝叏閮ㄦ墽琛屾垚鍔燂紝瑕佷箞鍏ㄩ儴鎵ц澶辫触锛屼笉浼氱粨鏉熷湪涓棿鐨勬煇涓幆鑺傘備簨鍔″湪鎵ц杩囩▼涓彂鐢熼敊璇紝浼氳鍥炴粴锛圧ollback锛夊埌浜嬪姟寮濮嬪墠鐨勭姸鎬侊紝灏卞儚杩欎釜浜嬪姟浠庢潵娌℃湁鎵ц杩囦竴鏍枫 + +##### 2) 涓鑷存 + +鍦ㄤ簨鍔″紑濮嬩箣鍓嶅拰浜嬪姟缁撴潫浠ュ悗锛屾暟鎹簱鐨勫畬鏁存ф病鏈夎鐮村潖銆傝繖琛ㄧず鍐欏叆鐨勬暟鎹繀椤诲畬鍏ㄧ鍚堟墍鏈夌殑棰勮瑙勫垯锛屽叾涓寘鍚暟鎹殑绮剧‘搴︺佷覆鑱旀т互鍙婂悗缁暟鎹簱鍙互鑷彂鎬у湴瀹屾垚棰勫畾鐨勫伐浣溿 + +##### 3) 闅旂鎬 + +鏁版嵁搴撳厑璁稿涓苟鍙戜簨鍔″悓鏃跺鍏舵暟鎹繘琛岃鍐欏拰淇敼鐨勮兘鍔涳紝闅旂鎬у彲浠ラ槻姝㈠涓簨鍔″苟鍙戞墽琛屾椂鐢变簬浜ゅ弶鎵ц鑰屽鑷存暟鎹殑涓嶄竴鑷淬備簨鍔¢殧绂诲垎涓轰笉鍚岀骇鍒紝鍖呮嫭璇绘湭鎻愪氦锛圧ead uncommitted锛夈佽鎻愪氦锛坮ead committed锛夈佸彲閲嶅璇伙紙repeatable read锛夊拰涓茶鍖栵紙Serializable锛夈 姝婚攣 鎿嶄綔绯荤粺 + +##### 4) 鎸佷箙鎬 + +浜嬪姟澶勭悊缁撴潫鍚庯紝瀵规暟鎹殑淇敼灏辨槸姘镐箙鐨勶紝鍗充究绯荤粺鏁呴殰涔熶笉浼氫涪澶便 + +#### 浜嬪姟鍒嗙被 + +**鑷姩鎻愪氦浜嬬墿**锛 鏄疭QL Server榛樿鐨勪竴绉嶄簨鍔℃ā寮忥紝姣忔潯Sql璇彞閮借鐪嬫垚涓涓簨鍔¤繘琛屽鐞嗐 + +**鏄惧紡浜嬪姟**: T-sql鏍囨槑锛岀敱Begin Transaction寮鍚簨鍔″紑濮嬶紝鐢盋ommit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟缁撴潫銆 + +**闅愬紡浜嬪姟**锛氫娇鐢⊿et IMPLICIT_TRANSACTIONS ON 灏嗗皢闅愬紡浜嬪姟妯″紡鎵撳紑锛屼笉鐢˙egin Transaction寮鍚簨鍔★紝褰撲竴涓簨鍔$粨鏉燂紝杩欎釜妯″紡浼氳嚜鍔ㄥ惎鐢ㄤ笅涓涓簨鍔★紝鍙敤Commit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟鍗冲彲銆 \ No newline at end of file diff --git "a/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/SQLQuery2.sql" "b/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/SQLQuery2.sql" new file mode 100644 index 0000000000000000000000000000000000000000..af126a8a984cebf4f60806b1bfb40e08c32d326f --- /dev/null +++ "b/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/SQLQuery2.sql" @@ -0,0 +1,56 @@ +例3:使用游标实现加薪操作 +--创建游标 +declare cur_id cursor scroll for select PeopleId from People +--打开游标 +open cur_id +--提取数据 +declare @id int, @money money = 1000 +fetch first from cur_id into @id +while (@@fetch_status = 0) + begin + update People set PeopleSalary += @money where PeopleId = @id + fetch next from cur_id into @id + end +--关闭游标 +close cur_id +select * from People +go + +--例4:使用游标删除不达标员工 +select * from People +--创建 +declare cur_id cursor scroll for select PeopleId,PeopleSalary from People +--打开 +open cur_id +--提取 +declare @id int, @money money +fetch first from cur_id into @id,@money +while(@@FETCH_STATUS = 0) + begin + if(@money < 10000) + begin + delete People where PeopleId = @id + fetch next from cur_id into @id,@money + end + else + fetch next from cur_id into @id,@money + end +close cur_id +select * from People +go +--使用游标 实现:如果A表与B表中ID字段值相同,那么将B表中的省份,城市 修改成与A表中的城市一致(连表) + +declare cur_id cursor scroll for select A.* from A inner join B on A.id = B.id +deallocate cur_id +open cur_id +declare @id int , @id1 int,@Province varchar(10),@City varchar(10) +fetch first from cur_id into @id,@Province,@City +while(@@FETCH_STATUS = 0) + begin + update B set B.Province = @Province , B.City = @City where B.id = @id + fetch next from cur_id into @id,@Province,@City + end + +close cur_id +select * from A +select * from B \ No newline at end of file diff --git "a/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/\346\270\270\346\240\207.md" "b/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/\346\270\270\346\240\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..fbf2dd42d5220b0b25f759e096f5709bcd8bf274 --- /dev/null +++ "b/15\351\231\210\347\253\213\346\231\272/9.30\346\270\270\346\240\207/\346\270\270\346\240\207.md" @@ -0,0 +1,56 @@ +## 1.1娓告爣鐨勫熀鏈蹇 + +娓告爣鏄竴绉嶅鐞嗘暟鎹殑鏂规硶锛屽叿鏈夊缁撴灉闆嗚繘琛岄愯澶勭悊鐨勮兘鍔 + +## 1-2 娓告爣鐨勫疄鐜板姛鑳藉強浣跨敤姝ラ + +**娓告爣鐨勫疄鐜板姛鑳** + +鍏佽瀵 SELECT 杩斿洖鐨勮〃涓殑姣忎竴琛岃繘琛岀浉鍚屾垨涓嶅悓鐨勬搷浣滐紝鑰屼笉鏄竴娆″鏁翠釜缁撴灉闆嗚繘琛屽悓涓绉嶆搷浣滐紱 浠庤〃涓殑褰撳墠浣嶇疆妫绱竴琛屾垨澶氳鏁版嵁锛 娓告爣鍏佽搴旂敤绋嬪簭瀵瑰綋鍓嶄綅缃殑鏁版嵁杩涜淇敼銆佸垹闄ょ殑鑳藉姏锛 瀵逛簬涓嶅悓鐢ㄦ埛瀵圭粨鏋滈泦鍖呭惈鐨勬暟鎹墍鍋氱殑淇敼锛屾敮鎸佷笉鍚岀殑鍙鎬х骇鍒紱 娓告爣鐨勪娇鐢ㄦ楠 + +- 鍒涘缓娓告爣 + +``` +declare 娓告爣鍚 cursor scroll for select鏌ヨ璇彞 + +娓告爣鍒嗕负灞閮ㄦ父鏍囧拰鍏ㄥ眬娓告爣涓ょ锛宭ocal琛ㄧず灞閮ㄦ父鏍囷紝global琛ㄧず鍏ㄥ眬娓告爣(榛樿鍊硷紝鍙互鐪佺暐)銆傚綋鎸囧畾 forward_only(榛樿鍊硷紝鍙互鐪佺暐)鏃讹紝娓告爣鏄彧杩涚殑锛屼篃灏辨槸璇村彧鑳戒粠澶村埌灏惧湴鎻愬彇璁板綍锛屽鏋滈渶瑕佸湪琛屼箣闂存潵鍥炶烦璺冿紝闇瑕佹寚瀹氫负scroll銆 +``` + +- 鎵撳紑娓告爣 +- 璇诲彇鍐呭 +- 鍏抽棴娓告爣 +- 閲婃斁娓告爣锛堝垹闄わ級 + +``` +deallocate (娓告爣鍚) +``` + +**鎻愬彇鏁版嵁鎿嶄綔锛** + +``` +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +``` + +**娓告爣鍒嗕负闈欐佹父鏍囧拰鍔ㄦ佹父鏍囷紝闈欐佹父鏍囩殑鏁版嵁鏄浐瀹氱殑锛屼笉浼氬洜涓烘暟鎹〃鐨勬敼鍙樿屾敼鍙橈紱鍔ㄦ佹父鏍囩殑鏁版嵁鏄殢鐫鏁版嵁琛ㄥ彉鍖栬屽彉鍖栫殑锛屾父鏍囬粯璁ゆ槸鍔ㄦ佹父鏍** + +``` +DECLARE @id INT , @name NVARCHAR(50) --澹版槑鍙橀噺锛岄渶瑕佽鍙栫殑鏁版嵁 +DECLARE cur CURSOR --鍘绘帀STATIC鍏抽敭瀛楀嵆鍙 +FOR + SELECT * FROM #T +OPEN cur --鎵撳紑娓告爣 +FETCH NEXT FROM cur INTO @id, @name --鍙栨暟鎹 +WHILE ( @@fetch_status = 0 ) --鍒ゆ柇鏄惁杩樻湁鏁版嵁 + BEGIN + SELECT '鏁版嵁: ' + RTRIM(@id) + @name + UPDATE #T SET name='娴嬭瘯' WHERE id=4 --娴嬭瘯闈欐佸姩鎬佺敤 + FETCH NEXT FROM cur INTO @id, @name --杩欓噷涓瀹氳鍐欏彇涓嬩竴鏉℃暟鎹 + END +CLOSE cur --鍏抽棴娓告爣 +DEALLOCATE cur +``` \ No newline at end of file