实验六SQL
- 格式:doc
- 大小:210.65 KB
- 文档页数:7
sql数据库实验报告目录1. 实验概述 (2)1.1 实验目的 (2)1.2 实验背景 (3)1.3 实验内容 (4)1.4 实验环境 (5)2. 数据库设计 (5)2.1 数据库概念 (6)2.2 表结构设计 (8)2.2.1 表1名称及字段定义 (9)2.2.2 表2名称及字段定义 (10)2.3 关系约束 (11)3. SQL语句操作 (12)3.1 数据插入 (13)3.2 数据查询 (14)3.2.1 根据条件查询 (15)3.2.2 聚合函数查询 (16)3.2.3 连接查询 (17)3.3 数据更新 (18)3.4 数据删除 (20)4. 实验结果展示 (21)4.1 SQL语句执行结果 (22)4.2 数据分析及解释 (22)4.2.1 查询结果的意义 (24)4.2.2 数据之间的关系性分析 (24)5. 实验总结与展望 (25)5.1 实验总结 (26)5.2 总结得到的经验与教训 (27)5.3 进一步研究建议 (29)1. 实验概述本实验旨在通过实践操作,实验内容涵盖了常见数据库操作,包括表创建、数据插入、查询、修改和删除。
通过完成实验,我们将学习如何使用SQL语句来管理和处理数据库数据,掌握常用的 SELECT、INSERT、UPDATE、DELETE 语句以及 JOIN 操作等,并熟悉数据库的操作流程和概念。
本实验旨在提升 SQL 数据库操作技能,并为后续更深入的数据库学习和应用打下基础。
您可以根据实际实验内容对以上段落进行修改和完善,具体修改点包括:明确实验的主题和目标,例如:实验主题可能是某个特定数据库管理系统(如MySQL、PostgreSQL等)的应用,目标可能是学习该数据库特定的功能特性。
1.1 实验目的本次实验旨在通过实际操作,验证和巩固SQL语言在关系型数据库管理中的应用能力,并加深对数据库设计、数据操作以及数据查询与分析的理解。
具体实验目的包括:学习SQL基础:掌握SQL语言的基本语法和常用命令,包括数据类型定义、表格创建、插入、更新和删除操作。
数据库SQL实验报告__数据库的基本操作一、实验目的1.理解数据库SQL语言的基本操作;2.学会使用数据库SQL语言进行数据的增删改查操作。
二、实验环境1. 操作系统:Windows 10;2.数据库管理系统:MySQL;3. 开发工具:Navicat for MySQL。
三、实验内容本次实验主要涉及数据库的基本操作,包括创建数据库、创建数据表、插入数据、更新数据、删除数据以及查询数据等。
1.创建数据库步骤一:打开Navicat for MySQL,并点击左上角的“新建连接”按钮;步骤二:填写连接信息,包括主机、端口、用户名和密码,并点击“连接”按钮;步骤三:点击“新建数据库”按钮,填写数据库的名称,并点击“确定”按钮。
2.创建数据表步骤一:在已连接的数据库上点击右键,选择“新建数据表”;步骤二:填写数据表的名称,并点击“确定”按钮;步骤三:填写数据表的字段信息,包括字段名、数据类型、长度、索引、主键等,并点击“确定”按钮。
3.插入数据4.更新数据5.删除数据6.查询数据步骤一:在数据表上点击右键,选择“查看数据”;步骤二:在弹出的查询窗口中填写查询条件,并点击“确定”按钮。
四、实验结果通过以上基本操作,成功创建了一个数据库,并在数据库中创建了一个数据表。
插入了一条数据,并成功地更新和删除了数据。
最后,使用查询操作查看了数据库中的数据。
五、实验总结通过本次实验,我深入了解了数据库SQL语言的基本操作,学会了使用数据库SQL语言进行数据的增删改查操作。
在实验过程中,我发现通过SQL语句进行数据库操作更加灵活、方便且高效。
还学会了使用Navicat for MySQL这样的数据库管理工具,提高了数据库的操作效率。
通过实验,我对数据库的基本原理和操作有了更深入的了解,为日后的数据库开发和管理打下了坚实的基础。
SQL实验报告(优秀范文5篇)第一篇:SQL实验报告实验四触发器实验(一)after触发器(1 1)在l l i neitem 表上定义一个 after 触发器, , 当修改列项目e e xtendedprice d i scountx tax 时, , 要把 s orders 表得to o tal pri ce e 一起修改, , 以保证数据一致性C RE ATE T RIGGERtrig _line ite m_ pr ice_ update on line it em fo rupda teaasbegin i f(UPDATE(ex tend edprice)o r UPDATE(tax)or UPD AT E(di scou nt))begin-—声明游标变量指向 inserted 表d eclarecursor_inserted c urs orrea d_onlyofor select order key,linenu mber,exte nd edpr ice, dis coun t, taxfromin ser ted—-息信找查取获量变明声ﻩ声明变量获取查找信息de clare order key in t, @linenumb erint,exte nd edpricereal,disscount real,tax real—-打开游标epoﻩen cursor_i ns ert ed—-标游取读ﻩ读取游标fe tchnextfrom cur sor _i ns erte dint o@o rderkey, @lin enumber,eext ende dprice, @di scount,t axwwhi le FETC H_S TATUS =0 nigebﻩnﻩ—-声明一个变量保存重新计算得新价格cedﻩﻩecl are @n ew_tota lpri cer ealﻩ select @n ew_t otal price= @ext en dedpr ice *(1 -@di scou nt)*(1 +@tax)—-用新得总价格变量更新 orders 表得 t ot alprice puﻩﻩupdate orde rsse t tot alpri ce= new_totalprice where or derkey=orde rkeyen hctefﻩext f ro m cur sor_i nser ted int o@order ke y, @li nenum ber, @ex tende dp rice,discoun t, @taxdneﻩllaedﻩlocate c ur sor_i nser te deend end ﻩ(2)在在 linei tem表上定义一个 aftr er 触发器, , 当增加一项订单明细时, ,自动修改 s orders 表得 total p rice, 以保证数据一致性CREATE TR IGGER tri g_ lineit em_price_ in sert on l ine item ffor inse rta sbegin ——向指量变标游明声ﻩ声明游标变量指向ins erted 表de clarec ursor_inse rtedcursorread_ onl yﻩ for s ele ct orderkey,linenumbe r,ex te ndedp ric e,di scou nt,t axfrom insserte d--声明变量获取查找信息edﻩeclare @orde rk eyint, @lin enumber int,e xten dedp ricereal, @discountreal, @ta xreal -—ﻩ-打开游标open cursor_i ns erte d--ﻩ-读取游标fe tc hnex tf romcu rsor_ins ertedinto@o rd erkey,li nen umbeerr, ex ten ded pric e,dis count,tax ihwﻩile @@FE TCH_ STATU S=0 ebﻩegin-—格价新得算计新重存保量变个一明声ﻩﻩ声明一个变量保存重新计算得新价格cedﻩclare @n ew_tot alprice realcelesﻩct new _to ta lprice= @extend edp rice *(1-d is count)*(1+tax)—-新更量变格价总得新用ﻩﻩ用新得总价格变量更新orders 表得totalpri ceﻩ u pda teor ders s ett ota lpric e=total pric e+ @new_ tota lpr ice wwhhe re o rderke y=orderkeytefﻩetch next from cursor_ ins erte dinto o rder key, @l inen umber,e xtendeddp ric e, @disc ou nt, @t axeend aedﻩdeall oca te cu rsor_in serted en d(3)在l in e ite m表上定义一个a ft er触发器, , 当删除一项订单明细记录时, ,自动修改 orders 表得 tot a lprice, 以保证数据一致性CREATE TRI GG ER trig _line item_price_de let eon line item fo r de let eAAS begin--声明游标变量指向delet ed 表de clar e curso r_d eleted cursorre ad _on lyesrofﻩﻩele ctord erk ey,line numbe r,extende dp rice,discoun t, taxfromdel eted-ﻩ--声明变量获取查找信息declare ord erkey int,linenum be rint,extendedp ri ce r eal,discou nt real,ta xreal -—ﻩ-打开游标epoﻩen c urso r_ deleted——标游取读ﻩ读取游标efﻩetch next fr om cur sor_delete d in toorder ke y,l inenumb er,ext enddedprice, @di scoun t,taxwh ile@FETCH_STATUS=0begi n-—声明一个变量保存重新计算得新价格ﻩ declare @ne w_ to talpric erealﻩsselec t@new_t otalpr ice= @exte nde dpri ce*(1-@disco unt)*(1+ tax)-ﻩ-—用新得总价格变量更新orders 表得tot alp rice uﻩﻩupd ateorders set t otalpri ce=to talpr ice-@new _totalp rice wh er e order key= @ord erkeyfetchn ext f rom cursor_inse rt ed in to orderkey, @line numbe r,extendeeddprice, @d iscou nt,t ax dneﻩndddeal lo cat e cur sor_inse rted eend((4 4))验证 up d at e触发器—-查瞧号订单得 to ta a l pr i ceselec t*fro o mo o r ders whereorde r key=1 8 30;—-查瞧明细表得相关信息se l ect *f ro mlin ei i te e mw here or de e r key=183 0and l ine num m be e r =1;——验证 e update 触发器updat elineitem set t ax=tax+0、05whe re orderkey=1830;(二)i i n steadof触发器((1))在在 lineit em 表上定义一个ins tead o fupda te触发器, 当修改明细表中得数量量quan ti ty 时, 应先检查供应表par tsupp 得av ai lqty 就是否足够, 不足够则拒绝执行, 否则执行并修改相应数值以保证数据一致性于由于 in steadof 触发器更新某个表会使得该表上其她不满足更新列不能更新,因因用此逆向思维使用 a fter 触发器实现相同效果即先更新 qu antity, 再比较av ailqqtty, 如果满足更新数量, 就修改partsupp 得表得 a vailqty, 如果不满足, 则把lineitem得quantity 更新之后得数据重新修改回来ccreate trigge r trig_lin eit em_quanti ty_ upda teonli neit em f or upda teas begin if UPDATE(qu ant ity)bbegin ——向指别分量变标游明声ﻩ声明游标变量分别指向 i nserted 表与 d el eted 表edﻩdeclare c urso r_inser tedcur sorr ead_on lyfortcelesﻩﻩtorde rkey, partk ey,s uppkey,lin enum ber, quantit yfr om i nserteddecl arecursor_de leted c urs orrea d_ onl yf or select quantityfr om deleted-—息信找查取获量变明声ﻩ声明变量获取查找信息decl are@qu an tity _dif f_lineitem i nt,q uanti ty_pa rtsup p i nt cedﻩclare suppkey int, @par tke y in t,o rd erkey i nt,unenilﻩﻩum ber int ,qty _inserted in t , @qty_deleted int--打开游标ruc nepoﻩrsor_in sert ed poﻩopen cur sor_d eleted-—量变给赋值数标游取读ﻩ读取游标数值赋给变量fﻩfet chnext fromcu rsor_ insert edﻩiinto or de rk ey,pa rtkey, @suppk ey, @line nu mber, @qty _ins erte df et chnext fromcursor _d eletedint o q ty _de lete dwhi le fe tch_st atus=0 gebﻩegin--计算订单明细修改时, 订购数量得变化值inserte d表项-d elet ed表项ssel ect quantity_d if f_ li neit em= @q ty _in se rte d—@@q ty_deleteedﻩ--从parts upp 表获取ava ilq ty值, 注意partsupp 表得主键为(partk ey,suppkeey)tcelesﻩﻩt@quanti ty_p ar tsupp =av ailq ty fro m pa rtsu ppwﻩﻩwh er e suppkey= suppke yand part key= @par tk ey-—断判始开ﻩﻩ开始判断gebﻩbegi nfiﻩf quant ity _d iff_ lin eite m=0ﻩﻩ p rin t“ 更新得数量与原表中得值相同, 不需要更新”e ls eif @quantit y_d iff_lin eitem 〈=q uantity_partsuppﻩbe ginﻩpuﻩﻩpd ate partsupps et avail qty= availqty-@qua ntit y_d iff_li ne item ﻩpus erehwﻩppkey=suppkeyandp artkey= @par tke yﻩﻩ p rint “ 两个表都更新成功’ ﻩﻩﻩneﻩndels eigebﻩﻩinﻩuﻩﻩupdate li nei temsetquantit y=quantity+ @quanti ty_diff_linei temwhe re o rd erke y=@orde rke y and li nenu mber= @liine numberﻩp ri nt '更新失败”ﻩﻩendﻩ e nd efﻩﻩetch ne xtfr om c urso r_i nsertedi nto @ord erke y, @partkey,s upp key, @linenumb er, @qt y_ ins ert edf etch ne xt from curso r_de leted into @qt y_d elet ed dneﻩndd eallocat e cur sor _i nserte ddealloc at e cursor_de le ted eend eend(2)在在 l ineite m表上定义一个 instea d of in sert 触发器, 当插入明细表中一条记录时时, 应先检查供应表par tsupp 得得 ava il qt y就是否足够qu anti ty 得数量c rea te t rig ger tri g_lineitem_q ua nti ty_ insertonline item iinstead of inser t as bbegin-—声明游标变量指向 inserte d表d eclar e cur sor_inserte dcur sorrea d_ only f orsﻩﻩselect or derk ey,pa rtkey,sup pk ey, lin en umber,q uantityf rom ins er ted-—声明变量获取查找信息dec lare quantity int, @av ailq ty i nt, @suppkeyin t, @partkeyinntt, @o rderkey int, @linenu mber int-—标游开打ﻩ打开游标c nepoﻩcurs or_ins erted -ﻩ-—读取游标f etc hnext fro mcursor_insert edint o@orde rkey,partkey,@@ssuppkey, @linenumber,qu antity wh ile @@FETCH_S TATUS= 0igebﻩin--为变量赋值a tcelesﻩavailqtyy==av ai lqt y fr ompartsuppwﻩwhe re suppkey =@su ppk ey and part ke y= partke yﻩ if @quant ity 〈= @avail qt y-—如果可以更新bﻩbegin /ﻩﻩﻩ/*将将 insert ed 表中得记录插入到明细表*/ ﻩsniﻩserti nto l ineite m select *from i nsertedro=yekredroerehwﻩﻩrderk ey andlinenumb er = @linenumber */ﻩﻩ新更时同ﻩ*同时更新 part supp 表得数量*/ﻩﻩuupd ate pa rtsup pset a vailqty=availqty-@quanti tyﻩerehwﻩe sup pke y= @sup pkey and partkey=part key ppr int ’paarts upp 表有足够得货物可以满足 lin eitem 得quan tityy, 插入成功’endelsebeginﻩﻩ p rintt''pa rt sup p表没有足够得货物可以满足 l ineitem 得得q uantity,插入失败’dneﻩfﻩﻩfetc h next from curso r_ins ert ed in to@ord erkey, partkey, suppkey, @liinenumbe r, qu antity eﻩen ddeall ocat ecursor_ inserted end(3)在在 line ite m表上定义一个 inste ad of del ete 触发器,当当删除明细表中记录时时, 同时改变表供应表 partsupp 得ava il qtyy数值 c re ate trigge r tri g_ lin eit em_quanti ty_ del ete o n line item inste ad of del ete as be gin—-声明游标变量指向deleted 表de cla re curs or_ del eted c ursorread _only forlesﻩﻩelect or derke y, par tkey,sup pkey, linenumbe r,quan tity fr om deleted -ﻩ--声明变量decl are s upp key i nt, par tke yint, @orde rkey int,linen umb erint, @quaant it y int—-标游开打ﻩ打开游标opencursor_deleted-—标游取读ﻩ读取游标ffetch next fr omcurs or _del et edin to @ord erkey , @partkey,s uppkeey, @lin en umber,q ua ntitywhi leFFET CH_ STATUS=0 igebﻩin*/*除删ﻩ*删除*/ﻩ de let e fromlineite m where linenu mber= line number and o rde rkey =ordder key*/新更时同ﻩ同时更新 pa rt supp 表得数量*/u pdateparts uppse tavailqt y=a vai lq ty+quant ityﻩ where s uppke y= @s uppkey a nd par tk ey= @p ar tkeyﻩ p rin t’ 删除成功, 并且已经把货物数量归还到 p ar tsup p里“ fﻩﻩfetc h ne xt fr omcurso r_del etedinto @ord er ke y,p ar tkey,@@suppkey, @lin enu mber,quanti ty neﻩnd edﻩea lloc ate cursor_ delete dend(4)验证 update 触发器--查瞧li neit em 得quan tit y select*fr omlin eit em whe re or derk ey =1830and li nenum ber=1;——查询partsupp 表得ava ilqt y se lect * from part supp w here suppk ey =(selectsupp key fr omlin eitem w here ord erkey=18 30)and partk ey=(s elec t part key from lin eite mwh er eorder key =18 30 a nd linenu mber=1)---更新数量过大——更新得值与原值相同---更新到+ + 2 00 数量, , 成功updateli neitem setquant ity=q uanti ty+ 200where order key=1830and lin en umber =1;--更新 +2 00成功后l ineite m得 quanti ty y 变化——更新+200 成功后par ts upp 表得a va ilqty 变化实验到此。
实验四触发器实验(一)after 触发器(1)在lineitem表上定义一个after触发器,当修改列项目extendedprice discount tax时,要把orders表的totalprice一起修改,以保证数据一致性CREATE TRIGGER trig_lineitem_price_update on lineitemfor updateasbeginif (UPDATE(extendedprice) or UPDATE(tax) or UPDATE(discount))begin--声明游标变量指向inserted表declare cursor_inserted cursor read_onlyfor select orderkey,linenumber,extendedprice,discount,tax from inserted -- 声明变量获取查找信息declare orderkey int,linenumber int,extendedprice real,discount real,tax real-- 打开游标open cursor_inserted-- 读取游标fetch next from cursor_inserted into orderkey,linenumber,extendedprice,discount,tax while FETCH_STATUS=0begin--声明一个变量保存重新计算的新价格declare new_totalprice realselect new_totalprice=extendedprice*(1-discount)*(1+tax)--用新的总价格变量更新orders表的totalpriceupdate orders set totalprice=new_totalprice where orderkey=orderkey fetch next from cursor_inserted into orderkey,linenumber,extendedprice,discount,tax enddeallocate cursor_insertedendend(2)在lineitem表上定义一个after触发器,当增加一项订单明细时,自动修改orders表的totalprice,以保证数据一致性CREATE TRIGGER trig_lineitem_price_insert on lineitemfor insertasbegin--声明游标变量指向inserted表declare cursor_inserted cursor read_onlyfor select orderkey,linenumber,extendedprice,discount,tax from inserted-- 声明变量获取查找信息declare orderkey int,linenumber int,extendedprice real,discount real,tax real-- 打开游标open cursor_inserted-- 读取游标fetch next from cursor_inserted into orderkey,linenumber,extendedprice,discount,tax while FETCH_STATUS=0begin--声明一个变量保存重新计算的新价格declare new_totalprice realselect new_totalprice=extendedprice*(1-discount)*(1+tax)--用新的总价格变量更新orders表的totalpriceupdate orders set totalprice=totalprice+new_totalprice where orderkey=orderkeyfetch next from cursor_inserted into orderkey,linenumber,extendedprice,discount,tax enddeallocate cursor_insertedend(3) 在lineitem表上定义一个after触发器,当删除一项订单明细记录时,自动修改orders表的totalprice,以保证数据一致性CREATE TRIGGER trig_lineitem_price_delete on lineitemfor deleteASbegin--声明游标变量指向deleted表declare cursor_deleted cursor read_onlyfor select orderkey,linenumber,extendedprice,discount,tax from deleted -- 声明变量获取查找信息declare orderkey int,linenumber int,extendedprice real,discount real,tax real-- 打开游标open cursor_deleted-- 读取游标fetch next from cursor_deleted into orderkey,linenumber,extendedprice,discount,tax while FETCH_STATUS=0begin--声明一个变量保存重新计算的新价格declare new_totalprice realselect new_totalprice=extendedprice*(1-discount)*(1+tax)--用新的总价格变量更新orders表的totalpriceupdate orders set totalprice=totalprice-new_totalprice where orderkey=orderkeyfetch next from cursor_inserted into orderkey,linenumber,extendedprice,discount,tax enddeallocate cursor_insertedend(4)验证update触发器--查看号订单的totalpriceselect * from orders where orderkey=1830;--查看明细表的相关信息select * from lineitem where orderkey=1830 and linenumber=1;--验证update触发器update lineitem set tax=tax+0.05 where orderkey=1830;(二)instead of 触发器(1)在lineitem表上定义一个instead of update触发器,当修改明细表中的数量quantity 时,应先检查供应表partsupp的availqty是否足够,不足够则拒绝执行,否则执行并修改相应数值以保证数据一致性由于instead of触发器更新某个表会使得该表上其他不满足更新列不能更新,因此逆向思维使用after触发器实现相同效果即先更新quantity,再比较availqty,如果满足更新数量,就修改partsupp表的availqty,如果不满足,则把lineitem的quantity更新之后的数据重新修改回来create trigger trig_lineitem_quantity_update on lineitemfor updateasbeginif UPDATE(quantity)begin--声明游标变量分别指向inserted表和deleted表declare cursor_inserted cursor read_only forselect orderkey,partkey,suppkey,linenumber,quantity from inserted declare cursor_deleted cursor read_only for select quantity from deleted-- 声明变量获取查找信息declare quantity_diff_lineitem int,quantity_partsupp intdeclare suppkey int,partkey int,orderkey int,linenumber int ,qty_inserted int ,qty_deleted int-- 打开游标open cursor_insertedopen cursor_deleted-- 读取游标数值赋给变量fetch next from cursor_insertedinto orderkey,partkey,suppkey,linenumber,qty_insertedfetch next from cursor_deleted into qty_deletedwhile fetch_status=0begin--计算订单明细修改时,订购数量的变化值inserted表项-deleted表项select quantity_diff_lineitem=qty_inserted-qty_deleted--从partsupp表获取availqty值,注意partsupp表的主键为(partkey,suppkey)select quantity_partsupp=availqty from partsuppwhere suppkey=suppkey and partkey=partkey-- 开始判断beginif quantity_diff_lineitem=0print '更新的数量和原表中的值相同,不需要更新'else if quantity_diff_lineitem<=quantity_partsuppbeginupdate partsupp set availqty=availqty-quantity_diff_lineitemwhere suppkey=suppkey and partkey=partkeyprint '两个表都更新成功'endelsebeginupdate lineitem set quantity=quantity+quantity_diff_lineitemwhere orderkey=orderkey and linenumber=linenumberprint '更新失败'endendfetch next from cursor_insertedinto orderkey,partkey,suppkey,linenumber,qty_insertedfetch next from cursor_deleted into qty_deletedenddeallocate cursor_inserteddeallocate cursor_deletedendend(2)在lineitem表上定义一个instead of insert触发器,当插入明细表中一条记录时,应先检查供应表partsupp的availqty是否足够quantity的数量create trigger trig_lineitem_quantity_insert on lineiteminstead of insertasbegin--声明游标变量指向inserted表declare cursor_inserted cursor read_only forselect orderkey,partkey,suppkey,linenumber,quantity from inserted-- 声明变量获取查找信息declare quantity int,availqty int, suppkey int,partkey int,orderkey int,linenumber int-- 打开游标open cursor_inserted-- 读取游标fetch next from cursor_inserted intoorderkey,partkey,suppkey,linenumber,quantitywhile FETCH_STATUS=0begin--为变量赋值select availqty =availqty from partsuppwhere suppkey=suppkey and partkey=partkeyif quantity<=availqty --如果可以更新begin/*将inserted表中的记录插入到明细表*/insert into lineitem select * from insertedwhere orderkey=orderkey and linenumber =linenumber/*同时更新partsupp表的数量*/update partsupp set availqty=availqty-quantitywhere suppkey=suppkey and partkey=partkeyprint 'partsupp表有足够的货物可以满足lineitem的quantity,插入成功'endelsebeginprint 'partsupp表没有足够的货物可以满足lineitem的quantity,插入失败'endfetch next from cursor_inserted into orderkey,partkey,suppkey,linenumber,quantityenddeallocate cursor_insertedend(3)在lineitem表上定义一个instead of delete触发器,当删除明细表中记录时,同时改变供应表partsupp的availqty数值create trigger trig_lineitem_quantity_delete on lineiteminstead of deleteasbegin--声明游标变量指向deleted表declare cursor_deleted cursor read_only forselect orderkey,partkey,suppkey,linenumber,quantity from deleted --声明变量declare suppkey int,partkey int,orderkey int,linenumber int,quantity int-- 打开游标open cursor_deleted-- 读取游标fetch next from cursor_deleted into orderkey ,partkey,suppkey,linenumber,quantitywhile FETCH_STATUS=0begin/*删除*/delete from lineitem where linenumber=linenumber and orderkey =orderkey/*同时更新partsupp表的数量*/update partsupp set availqty=availqty+quantitywhere suppkey=suppkey and partkey=partkeyprint '删除成功,并且已经把货物数量归还到partsupp里'fetch next from cursor_deleted into orderkey ,partkey,suppkey,linenumber,quantityenddeallocate cursor_deletedend(4)验证update触发器--查看lineitem的quantityselect * from lineitem where orderkey=1830 and linenumber=1;--查询partsupp表的availqtyselect * from partsupp where suppkey =(select suppkey from lineitem where orderkey=1830) and partkey =(select partkey from lineitem where orderkey=1830 and linenumber=1)--更新数量过大--更新的值和原值相同--更新到+200数量,成功update lineitem set quantity =quantity+200 where orderkey=1830 and linenumber=1;--更新+200成功后lineitem的quantity变化--更新+200成功后partsupp表的availqty变化实验到此。
sql实验报告6闽南师范大学实实验报告告班级14 计本高一班学号***-*****04 姓名林强成绩同组人实验日期2014.10.28课程名称:MS SQL 程序设计实验题目:利用控制流语句编程实验目的与要求 1.掌握T-SQL 控制流语句的基本功能和分类 2.掌握利用控制流语句实现基本的分支选择和循环处理功能。
3.了解其他控制流语句的功能和应用实验环境的配置PC 兼容机。
Window xp 以上操作系统,SQL Server 2005 数据库管理系统第1 页实验内容与具体步骤1.编写程序,根据姓名查询teaching 数据库中学生的基本信息和选课信息,学生姓名通过变量@sname 输入,用set 赋值。
对于不存在的学生姓名输入值,打印提示信息。
declare @sname varchar(20) set @sname="张三" if(exists(select * from student where sname=@sname))Select student.*,courseno,usually,finalFrom student,scoreWhere student.studentno=score.studentno and sname=@sname elseprint " 不存在" 2.编写程序,查询所有学生选修课程的期末成绩和对应等级(大于等于90为优,大于等于80 小于90 为良,大于等于70 小于80 为中,大于等于60 小于70 为及格,小于60 为不及格,如果成绩为空则输出“缺考”提示信息。
(用多分支结构CASE 语句来实现)Select student.studentno,sname,cname,final, Casewhen final90 then "优"when final80 then "良"when final70 then "中"when final60 then "及格"when final is null then "缺考"else "不及格" End as level From student left join score on student.studentno=score.studentno left joinCourse on course.courseno=score.courseno 3.编写程序,判断字符变量@ch 中存放的是字母字符、数字字符还是其他字符。
《数据库开发技术》课程之实验六PL/SQL复合数据类型:记录、表和可变数组一、实验目的1.掌握如何创建PL/SQL 记录。
2.会用%ROWTYPE 属性创建一个记录。
3.掌握如何创建PL/SQL表和记录表。
4.掌握那些能获得复合数据信息的内置方法的使用。
5.掌握可变数组的使用。
二、实验内容和要求1.根据表emp的全部字段定义记录变量emp_record。
用SELECT语句将编号为7788的雇员的全部字段对应地存入该记录变量,最后输出记录变量的雇员名称字段emp_record.ename和雇员工资字段的内容。
执行结果如下:SCOTT的工资为:3000PL/SQL 过程已成功完成。
2.声明一张Index_By表,用来接收并存储DEPT表的信息,把部门号作为键,不要忘记部门号是10的倍数。
使用循环从DEPT表中将所有部门信息检索到PL/SQL记录表中,然后用另一个循环来显示表中的这些信息。
执行结果为:10, ACCOUNTING, NEW YORK20, RESEARCH, DALLAS30, SALES, CHICAGO40, OPERATIONS, BOSTONPL/SQL 过程已成功完成。
3. 阅读以下程序,找出出错之处,说明出错原因,预测运行输出结果是什么。
请删改错误,加上适当注释后,运行该程序,验证自己的预测是否正确。
(注:实验报告中只要指出出错的语句和出错的原因即可,不需要抄录程序清单!还要求写出程序正确运行后的输出结果。
)SET SERVEROUTPUT ONDECLARETYPE dept_list IS TABLE OF dept.dname%TYPE; --定义嵌套表TYPE top5_list IS VARRAY(5) OF dept.loc%TYPE; --定义可变数组dis_dept dept_list; --嵌套表的声明num_5 top5_list; --可变数组的声明BEGINdis_dept(1):='AMGN';IF dis_dept IS NULL THENdis_dept :=dept_list('AMGN','BGEN');DBMS_OUTPUT.PUT_LINE('dis_dept表当前元素个数为:'||to_char(dis_dept.count));END IF;num_5:=top5_list('ORCL','CSCO',NULL,NULL);IF num_5(3) IS NULL THENnum_5(3):='CPQ';END IF;num_5(4):='DELL';FOR COUNTER IN 1..4 LOOPDBMS_OUTPUT.PUT_LINE(NUM_5(COUNTER));END LOOP;END;/执行结果为:4.*将上题改为使用INDEX BY BINARY_INTEGER的索引表,则实现同一执行结果,程序要做哪些相应的改变。
数据库sql 实验报告数据库SQL 实验报告一、引言数据库是计算机科学中的一个重要概念,它用于存储和管理大量的数据。
SQL (Structured Query Language)是一种用于访问和操作数据库的标准语言。
本实验旨在通过实际操作,加深对数据库和SQL的理解,并掌握基本的SQL语句。
二、实验目的1. 熟悉数据库的基本概念和原理;2. 掌握SQL的基本语法和常用操作;3. 实践数据库设计和数据查询。
三、实验环境本实验使用MySQL数据库管理系统,并在Windows操作系统下进行。
四、实验过程与结果1. 数据库创建和表设计首先,我们创建一个名为"students"的数据库,并在其中创建一个名为"grades"的表。
表中包含学生姓名、学号、科目和成绩等字段。
2. 数据插入接下来,我们向"grades"表中插入一些数据,以模拟学生成绩的记录。
通过使用INSERT INTO语句,我们可以将数据插入到表中。
3. 数据查询在数据库中,查询是最常用的操作之一。
我们可以使用SELECT语句来实现对数据的查询。
例如,我们可以查询某个学生的成绩,或者按照科目进行排序等。
4. 数据更新有时候,我们需要对已有的数据进行更新。
使用UPDATE语句可以实现对表中数据的修改。
例如,我们可以将某个学生的成绩从80分修改为90分。
5. 数据删除当某个数据不再需要时,我们可以使用DELETE语句将其从表中删除。
例如,我们可以删除某个学生的成绩记录。
六、实验总结通过本次实验,我对数据库和SQL有了更深入的理解。
数据库作为存储和管理大量数据的工具,为我们提供了方便快捷的数据操作方式。
SQL作为一种标准语言,具备强大的数据查询、更新和删除功能。
在实验过程中,我学会了创建数据库和表,插入数据,进行数据查询、更新和删除等基本操作。
然而,数据库和SQL的学习仅仅是一个开始。
在实际应用中,我们还需要了解更多高级的数据库概念和技术,如索引、事务处理和数据备份等。
实验六SQL嵌套查询语句一、实验目的1.熟练掌握SQL嵌套查询语句;2.熟练掌握嵌套查询与连接查询的互相转换。
二、实验内容给定一个练习数据库和相应的练习题,要求上机完成,并验证结果实验基础知识提要子查询基础知识子查询是一个SELECT 查询,它返回单个值且嵌套在SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。
任何允许使用表达式的地方都可以使用子查询。
下例中,一个子查询用作SELECT 语句中名为MaxUnitPrice 的列表达式。
SELECT Ord.OrderID, Ord.OrderDate,(SELECT MAX(OrdDet.UnitPrice)FROM Northwind.dbo.[Order Details] AS OrdDetWHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPriceFROM Northwind.dbo.Orders AS Ord子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。
许多包含子查询的Transact-SQL 语句都可以改为用联接表示。
而其它一些问题只能由子查询提出。
在Transact-SQL 中,包括子查询的语句和不包括子查询但语义上等效的语句在性能方面通常没有区别。
但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。
否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。
所以在这些情况下,联接方式会产生更好的效果。
包括子查询的语句通常采用以下格式中的一种:●WHERE expression [NOT] IN (subquery)●WHERE expression comparison_operator [ANY | ALL] (subquery)●WHERE [NOT] EXISTS (subquery)有三种基本的子查询。
它们是:●在通过IN 引入的列表或者由ANY 或ALL 修改的比较运算符的列表上进行操作。
SQL数据库实验报告实验六实验二实验2 SQL Server数据库的管理1.实验目的(1)了解SQL Server 数据库的逻辑结构和物理结构的特点。
(2)掌握使用SQL Server管理平台对数据库进行管理的方法。
(3)掌握使用Transact-SQL语句对数据库进行管理的方法。
2.实验内容及步骤(1)在SQL Server管理平台中创建数据库。
①运行SQL Server管理平台,在管理平台的对象资源管理器中展开服务器。
②右击“数据库”项,在快捷菜单中选择“新建数据库”菜单项。
在新建数据库对话框的数据库名称文本框中输入学生管理数据库名studentsdb,单击“确定”按钮。
(2)选择studentsdb数据库,在其快捷菜单中选择“属性”菜单项,查看“常规”、“文件”、“文件组”、“选项”、“权限”和“扩展属性”等页面。
(3)打开studentsdb数据库的“属性”对话框,在“文件”选项卡中的数据库文件列表中修改studentsdb数据文件的“分配的空间”大小为2MB。
指定“最大文件大小”为5MB。
修改studentsdb数据库的日志文件的大小在每次填满时自动递增5%。
(4)单击“新建查询”打开查询设计器窗口,在查询设计器窗口中使用Transact-SQL 语句CREA TE DA TABASE创建studb数据库。
然后通过系统存储过程sp_helpdb查看系统中的数据库信息。
(5)在查询设计器中使用Transact-SQL语句ALTER DA TABASE 修改studb数据库的设置,指定数据文件大小为5MB,最大文件大小为20MB,自动递增大小为1MB。
(6)在查询设计器中为studb数据库增加一个日志文件,命名为studb_Log2,大小为5MB,最大文件大小为10MB。
(7)使用SQL Server管理平台将studb数据库的名称更改为student_db。
(8)使用Transact-SQL语句DROP DA TABASE删除student_db数据库。
数据库原理实验报告
实验名称
使用PL/SQL编写存储过程访问数据库
实验环境
硬件平台:Intel Core i5-3210M
操作系统:Windows 8.1
数据库管理系统(DBMS):MySQL Server 5.5
实验内容及步骤
1.由于我们实验所用的MySQL不支持PL/SQL,但提供了存储过程的功能。
因此我们通过
在MySQL中建立存储过程来完成本实验。
2.建立一个存储过程,用来向student表添加一条学生记录,如图:
在存储过程中,我们将学号,姓名,性别,年龄以及系别作为存储过程的输入参数。
3.在调用存储过程前,我们先查看一下student表:
4.下面,我们调用存储过程,向表中插入一条数据,如下:
5.调用完成后,我们再次查看student表中的内容:
可以看到,刚才调用存储过程向student表中插入的数据已在表中,说明插入成功。
集美大学诚毅学院实验报告
课程名称: 数据库 班级: 1371 实验成绩: 指导教师:
姓名:
实验项目名称: 数据操作与索引实验 学号: 201342051022 上机实践日期:
实验项目编号:实验6 组号:
上机实践时间:
一、目的(本次实验所涉及并要求掌握的知识点)
掌握数据库SQL 语言来创建各种不同表的语法结构和语言点,设计客户不同的所需建表 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)
1.数据的插入 (1)单记录的插入 USE STUDENT GO
SELECT * FROM S22
INSERT INTO S22(SNO ,SNAME ) VALUES ('200300','Paulwen') SELECT * FROM S22
(2)多记录的插入
CREATE TABLE SBAK (SNO VARCHAR (10) NOT NULL ,SNAME VARCHAR (20),DEPA VARCHAR (20), AGE INT , SEX CHAR (4)) GO
SELECT * FROM SBAK
INSERT INTO SBAK SELECT * FROM S22
1.数据的删除
SELECT * FROM SBAK
CREATE TABLE CBAK ( CNO VARCHAR (10) NOT NULL, CNAME VARCHAR (20), CPNO VARCHAR (10),CREDIT INT ) GO
INSERT INTO CBAK SELECT * FROM C22 DELETE FROM CBAK WHERE CREDIT <4 SELECT * FROM CBAK
3.数据的修改
SELECT*FROM S22
UPDATE S22SET DEPA='CS'
WHERE DEPA='计算机系'
GO
SELECT*FROM S22
4.索引的建立
(1)建立非聚族索引
SELECT*FROM C22
GO
CREATE INDEX ICNAME ON C22(CNAME)
GO
SELECT*FROM C22
SELECT*FROM C22(INDEX=ICNAME)
(2)建立聚族索引
SELECT*FROM C22
GO
CREATE CLUSTERED INDEX CICNO ON C22(CNO)
GO
SELECT*FROM C22
SELECT*FROM C22(INDEX=CICNO)
(3)建立唯一索引
CREATE UNIQUE INDEX UISNO ON SC22(sNO)
执行后有什么结果?为什么会出现这个结果?
CREATE UNIQUE INDEX UISNO ON SC22(SNO,CNO DESC)
、执行后有什么结果?
(4)建立复合索引
SELECT*FROM S22
GO
CREATE INDEX IAGESNO ON S22(AGE DESC,SNO) GO
SELECT*FROM S22
SELECT*FROM S22(INDEX=IAGESNO)
(5)查看表中的索引
SP_HELPINDEX'S22'
(6)删除表中的索引
DROP INDEX S22.IAGESNO
GO
SP_HELPINDEX'S22'
5.视图及其操作
(1)视图的建立
CREATE VIEW SHOWSNO22
AS
SELECT S.SNO,SNAME,AVG(GRADE)AS平均成绩FROM S22S,SC22SC
WHERE S.SNO=SC.SNO
GROUP BY S.SNO,SNAME
GO
SELECT*FROM SHOWSNO22
创建信息系学生的视图
(2)在视图上修改数据
视图中还有数据吗?为什么会这样?
CREATE VIEW S_SUM22
AS
SELECT SNO,SUM(GRADE)AS TOTALSCORE FROM SC22 GROUP BY SNO
GO
UPDATE S_SUM22
SET TOTALSCORE=60
执行语句,出现什么结果?分析为什么?
(3)在视图上删除数据
SELECT*FROM VISDEPA22
DELETE FROM VISDEPA22WHERE SEX='女'
SELECT*FROM VISDEPA22
SELECT*FROM S22
个
七、设计性实验
1.实验要求
(1)将S表系部为“计算机系”学生对应的系部改为‘CS’。
修改前
修改后
修改的代码:
UPDATE S22SET DEPA='CS'
WHERE DEPA='计算机系'
(2)创建一个与SC XX表相同新数据表SCNEW,查询SC表中成绩为空的记录并将其复制到SCNEW表中。
select*into SCNEW from SC22where GRADE IS NOT NULL
执行:select*from SCNEW
(3)删除SC表中成绩为空的选课记录。
delete from SC22WHERE GRADE IS NULL
(4)根据S表中姓名字段建立唯一性索引。
(5)建立S表上SNO的聚族索引。
(6)建立SC表上根据SNO升序,CNO降序的复合索引。
CREATE INDEX I_SC_SNOSNAME ON SC22(SNO DESC)
(7)建立每门课程的课程号、课程名、选课人数、平均分的视图。
ELECT O课程号,CNAME课程名,
COUNT(sname)选课人数,AVG(GRADE)平均分
FROM SC22SC,C22C Where O=SC.SNAME
GROUP BY O,CNAME
2.思考题
(1)是否任何可以对任意的视图进行修改?什么样的视图上不能进行修改操作?
不是任何试图都可以进行修改,当视图中存在聚集函数或者其他函数计算时不能修改视
图。
(2)如果表中某个字段重复值比较多,要不要在该字段上建立索引?为什么?
若表中某个字段的重复值比较多,则不要在该字段上建立索引。
因为,
重复值多时建立索引后根据索引找到该字段值还有多个,要到表中查找多次记录,影响查找速度
五、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
通过此次上机实验来巩固和掌握SQL数据的索引创建等知识点。