diff --git "a/28\350\242\201\350\264\265\346\243\256/\344\275\234\344\270\232/2022-0930-\346\270\270\346\240\207\344\275\234\344\270\232.sql" "b/28\350\242\201\350\264\265\346\243\256/\344\275\234\344\270\232/2022-0930-\346\270\270\346\240\207\344\275\234\344\270\232.sql" new file mode 100644 index 0000000000000000000000000000000000000000..658cd9119ae8e489089a2f67ef831253e7fcbe13 --- /dev/null +++ "b/28\350\242\201\350\264\265\346\243\256/\344\275\234\344\270\232/2022-0930-\346\270\270\346\240\207\344\275\234\344\270\232.sql" @@ -0,0 +1,92 @@ + +use STUDENTS +go +select * from tb_bibliography +select * from tb_book +select * from tb_inf_student +select * from tb_record +select * from tb_student +--创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) +declare cur_getstu cursor scroll +for select t.name 学生姓名,s.hobby 兴趣爱好,s.ori_loca 生源地,s.prize 荣誉总数 +from tb_student t join tb_inf_student s on s.stu_num=t.stu_num + +open cur_getstu +declare @xuehao char(8),@aihao varchar(20),@loca varchar(20),@rongyu int +fetch first from cur_getstu into @xuehao,@aihao,@loca,@rongyu +while (@@FETCH_STATUS=0) +begin + print @xuehao+@aihao+@loca+@rongyu + +end + +close cur_getstu +--循环遍历161开头的学生信息 +declare cur_infstu cursor scroll for select * from tb_student group by stu_num + +open cur_infstu +declare @num char(10) +fetch first cur_infstu into @num +while (@@FETCH_STATUS=0) +begin + declare @inf varchar =(select * from tb_student where stu_num like '161%%') + fetch next cur_infstu into @num +end + +close cur_infstu +-- 使用游标统计生源地为北京的荣誉总数 +declare cur_sum cursor scroll +for select ori_loca,count(prize) from tb_inf_student where ori_loca='北京' group by ori_loca + +open cur_sum +declare @sum int +fetch first cur_sum into @sum +print @sum + +close cur_sum + +create table A( + id int primary key, + Province varchar(20), + City varchar(20) +) + +create table B( + id int primary key, + Province varchar(20), + City varchar(20) +) + +insert into A values(1,'福建','厦门') +insert into A values(2,'广东','广州') +insert into A values(3,'福建','龙岩') +insert into A values(4,'云南','昆明') + +insert into B values(1,'江西','南昌') +insert into B values(3,'江苏','南京') +insert into B values(5,'湖北','武汉') +insert into B values(7,'湖南','长沙') +``` + +--要求:使用游标 实现:如果A表与B表中ID字段值相同,那么将B表中的省份,城市 修改成与A表中的城市一致(连表) +select * from A +union +select * from B + +declare cur_pro cursor scroll +for select id from A union select * from B group by id + +open cur_pro +declare @a int =(select id from A group by id) +declare @b int=(select id from B group by id) +declare @a1 varchar(10)=(select Province,City from A group by Province,City) +declare @b1 varchar(10)=(select Province,City from B group by Province,City) +fetch first cur_pro into @a,@b +if(@a=@b) +begin + update B set @a=@b where @a1=@b1 + fetch next cur_pro into @a1,@b1 +end + +close cur_pro + diff --git "a/28\350\242\201\350\264\265\346\243\256/\347\254\224\350\256\260/2022-0930\346\270\270\346\240\207\347\254\224\350\256\260.txt" "b/28\350\242\201\350\264\265\346\243\256/\347\254\224\350\256\260/2022-0930\346\270\270\346\240\207\347\254\224\350\256\260.txt" new file mode 100644 index 0000000000000000000000000000000000000000..ccaf91fcce05fc2d5eb008e2083d27e2ce480719 --- /dev/null +++ "b/28\350\242\201\350\264\265\346\243\256/\347\254\224\350\256\260/2022-0930\346\270\270\346\240\207\347\254\224\350\256\260.txt" @@ -0,0 +1,61 @@ +## 娓告爣 + +#### 浠涔堟槸娓告爣 + +娓告爣(Cursor)瀹冧娇鐢ㄦ埛鍙愯璁块棶鐢盨QL Server杩斿洖鐨勭粨鏋滈泦銆備娇鐢ㄦ父鏍(cursor)鐨勪竴涓富瑕佺殑鍘熷洜灏辨槸鎶婇泦鍚堟搷浣滆浆鎹㈡垚**鍗曚釜璁板綍澶勭悊鏂瑰紡**銆傜敤SQL璇█浠庢暟鎹簱涓绱㈡暟鎹悗锛岀粨鏋滄斁鍦ㄥ唴瀛樼殑涓鍧楀尯鍩熶腑锛屼笖缁撴灉寰寰鏄竴涓惈鏈夊涓褰曠殑闆嗗悎銆傛父鏍囨満鍒跺厑璁哥敤鎴峰湪SQL server鍐呴愯鍦拌闂繖浜涜褰曪紝鎸夌収鐢ㄦ埛鑷繁鐨勬剰鎰挎潵鏄剧ず鍜屽鐞嗚繖浜涜褰曘 + +娓告爣鍒嗙被: + +锛1锛夐潤鎬佹父鏍(Static)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁涓嶅彉 +锛2锛夊姩鎬佹父鏍(Dynamic)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁鏀瑰彉锛岄粯璁ゅ笺 +锛3锛夐敭闆嗛┍鍔ㄦ父鏍(KeySet)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝琚爣璇嗙殑鍒楀彂鐢熸敼鍙橈紝娓告爣涓暟鎹敼鍙橈紝鍏朵粬鍒楁敼鍙橈紝娓告爣涓暟鎹笉鍙樸 + + +#### 娓告爣鐨勪娇鐢 + +**鍒涘缓娓告爣锛** + +```sql +--1.鍒涘缓娓告爣(Scroll浠h〃婊氬姩娓告爣锛屼笉鍔燬croll鍒欐槸鍙繘鐨勶紝鍙兘鏀寔fetch next) +declare <娓告爣鍚> cursor scroll for select stuname from stuinfo +``` + +**鎵撳紑娓告爣锛** + +```sql +open <娓告爣鍚> +``` + +**鍏抽棴娓告爣锛** + +``` +close <娓告爣鍚> +``` + +**鍒犻櫎娓告爣锛** + +``` +deallocate <娓告爣鍚> +``` + + + +**鎻愬彇鏁版嵁鎿嶄綔锛** + +```sql +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +``` + +**闈欐佹父鏍: +闈欐佹父鏍囩殑缁撴灉闆嗭紝鍦ㄦ父鏍囨墦寮鐨勬椂鍊欏缓绔嬪湪TempDB涓紝涓嶈浣犲湪鎿嶄綔娓告爣鐨勬椂鍊欙紝濡備綍鎿嶄綔鏁版嵁搴擄紝娓告爣涓殑鏁版嵁闆嗛兘涓嶄細鍙樸 +渚嬪浣犲湪娓告爣鎵撳紑鐨勬椂鍊欙紝瀵规父鏍囨煡璇㈢殑鏁版嵁琛ㄦ暟鎹繘琛屽鍒犳敼锛屾搷浣滀箣鍚庯紝闈欐佹父鏍囦腑select鐨勬暟鎹緷鏃ф樉绀虹殑涓烘病鏈夋搷浣滀箣鍓嶇殑鏁版嵁銆傚鏋滄兂涓庢搷浣滀箣鍚庣殑鏁版嵁涓鑷达紝鍒欓噸鏂板叧闂墦寮娓告爣鍗冲彲銆 +**鍔ㄦ佹父鏍: +杩欎釜鍒欎笌闈欐佹父鏍囩浉瀵癸紝婊氬姩娓告爣鏃讹紝鍔ㄦ佹父鏍囧弽搴旂粨鏋滈泦涓殑鎵鏈夋洿鏀广傜粨鏋滈泦涓殑琛屾暟鎹笺侀『搴忓拰鎴愬憳鍦ㄦ瘡娆℃彁鍙栨椂閮戒細鍙樺寲銆 +鎵鏈夌敤鎴峰仛鐨勫鍒犳敼璇彞閫氳繃娓告爣鍧囧彲瑙併傚鏋滀娇鐢ˋPI鍑芥暟鎴朤-SQL Where Current of瀛愬彞閫氳繃娓告爣杩涜鏇存柊锛屼粬浠皢绔嬪嵆鍙銆傚湪娓告爣澶栭儴鎵鍋氱殑鏇存柊鐩村埌鎻愪氦鏃舵墠鍙銆 +**鍙繘娓告爣锛 +鍙繘娓告爣涓嶆敮鎸佹粴鍔紝鍙敮鎸佷粠澶村埌灏鹃『搴忔彁鍙栨暟鎹紝鏁版嵁搴撴墽琛屽鍒犳敼锛屽湪鎻愬彇鏃舵槸鍙鐨勶紝浣嗙敱浜庤娓告爣鍙兘杩涗笉鑳藉悜鍚庢粴鍔紝鎵浠ュ湪琛屾彁鍙栧悗瀵硅鍋氬鍒犳敼鏄笉鍙鐨勩 \ No newline at end of file