实验四SQL
实验四 SQL语言-参考答案
实验四SQL语言【实验目的】1.掌握SQL语言的使用方法2.利用SQL语句实现相关的操作3.能够独立写出一些较复杂的SQL语句【实验内容】1. 建立一个Student表,由Sno(学号)、Sname(姓名)、Ssex(性别)、Sage(年龄)、Sdept (所在系)五个属性组成。
其中学号不能为空,值是唯一的,并且姓名取值也唯一。
查询名为“创建Student”。
Create table student(sno char(6) not null unique,sname char(4) unique,ssex char(1),sage smallint,sdept char(20))2. 建立一个SC (学生选课)表,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno, Cno)为主码。
),查询名为“创建SC”。
Create table sc(sno char(6),cno char(3),grade single,primary key (sno,cno))3. 查询所有姓刘的学生的学号与姓名及其出生年份,查询名为“查找姓刘的学生”。
Selelct 学号,姓名,year(出生日期) as 出生年份from 学生表where 姓名like “刘*”4. 查询选修了计算机基础的所有学生的学号、姓名、成绩,查询结果按分数降序排列,查询名为“选修了计算机基础的学生”。
Select 学生表.学号,学生.姓名,选课成绩表.成绩from 学生表,课程表,选课成绩表where 学生表.学号=选课成绩表.学号and 课程表.课程编号=选课成绩表.课程编号and 课程表.课程名称=”计算机基础” order by 选课成绩表.成绩6. 查询所有年龄在20岁及20岁以下的学生姓名、年龄,查询名为“20岁及以下的学生”。
Select 姓名,年龄from 学生表where year(date())-year(出生日期)<=207. 查询考试成绩有不及格的学生的学号和姓名。
《数据库与信息系统》实验4指导解析_9-10
实验四数据库操作语言SQL一.实验目的⚫了解使用SQL中DDL语句创建数据库和表的方法⚫熟练掌握使用SQL中DML语句对数据库进行查询、插入、修改和删除等操作的方法⚫掌握可编程对象视图和存储过程的创建与使用方法,了解触发器的创建方法二.实验环境及素材⚫MySQL和Navicat for MySQL⚫bookstore数据库的脚本文件bookstore.sql三.实验内容首先创建一个bookstore数据库,执行bookstore.sql脚本文件实现表的创建及数据记录的添加。
然后在bookstore数据库中完成以下题目(bookstore数据库设计说明参见10.1节)。
①在Navicat for MySQL中,创建数据库bookstore。
②右击数据库bookstore,选择“运行SQL文件…”,在对话框中浏览选择“bookstore.sql”文件,点击“开始”即可完成数据表定义及添加数据记录。
③在左栏连接窗口展开数据库“bookstore”/表,右击“表”选“刷新”菜单,即可看到恢复的各数据表。
9.创建和使用存储过程。
解析:存储过程是经过编译的SQL语句的集合。
用户首先创建存储过程,然后在程序中调用该存储过程执行。
创建存储过程可以在Navicat for MySQL中使用向导建立,也可以使用SQL的CREATE PROCDURE语句。
存储过程可以接受参数、也可将查询信息通过输出参数返回调用者。
常用存储过程的语法格式:CREATE PROCDURE 存储过程名( [形式参数列表])SQL语句段“形式参数列表”中多个参数之间用逗号分隔,如果没有参数,则()中为空。
每个参数由输入输出类型、参数名和参数类型三部分组成,定义规则如下:[IN|OUT|INOUT 参数名类型输入输出类型中:IN是输入参数,即把数据传递给存储过程;OUT是输出参数,即从存储过程返回值;INOUT表示输入输出,即传入也能返回值。
MySQL-数据库-实验四
实验四SQL连接查询一、实验目的:掌握SQL连接查询语句二、实验内容和主要步骤:1. 查询每个学生及其选修成绩的情况2. 分别用左外连接和右外连接实现查询所有学生信息及其选修成绩的情况(包括没有选课的学生信息)3. 查询选修2号课程且成绩在90分以上的学生姓名和系别信息4. 查询每个学生的学号、姓名、选修的课程名及成绩5. 查询计算机系的学生所学课程的课程名。
6. 查询姓张的同学学的课程的课程名称。
7. 查询至少选修两门课程的学生姓名(*)8. 查询课程平均成绩大于80的课程名称(*)9. 查询选修人数最多的课程名称(*)10. 查询计算机系的学生选修课程中选修人数前三名的课程名称(*)11. 查询每门课程的先修课程名称和学分信息12. 分别用左外连接和右外连接实现查询所有课程信息和其先修课程信息(包括没有先修课程的课程信息)13. 查询每门课程的间接先修课的信息(先修课程的先修课程)14. 查询有不及格的学生姓名和所在系15. 查询所有成绩为优秀(大于90分)的学生姓名(*)16. 增加一个表格成绩等级表,表里记录成绩等级编号和每个等级对应的最低成绩和最高成绩create table glevel(id tinyint primary key,lowgrade int not null,highgrade int not null)insert into glevel values(1,90,100),(2,80,89),(3,70,79),(4,60,69),(5,0,59);17.查询每个成绩等级有多少计数(*)18.查询每个学生每个成绩等级有多少计数(*)19.查询每门课程每个成绩等级有多少计数(*)20.查询每个学生选修成绩的对应等级21.查询选修成绩等级是5的课程名称和学生姓名。
SQL实验报告(优秀范文5篇)
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 变化实验到此。
实验答案(四-五-六)参考答案
实验四简单查询和连接查询1. 简单查询实验用Transact-SQL语句表示下列操作,在“学生选课“数据库中实现其数据查询操作:(1) 查询数学系学生的学号和姓名。
select sno,snamefrom studentwhere dept='数学系';(2) 查询选修了课程的学生学号。
select distinct(sno)from sc;(3) 查询选修课程号为0101的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。
select distinct(sno),gradefrom scwhere cno='0101'order by grade desc,sno asc;(4) 查询选修课程号为0101的成绩在80-90 分之间的学生学号和成绩,并将成绩乘以系数0.8 输出。
select distinct(sno),grade*0.8 as'sore'from scwhere cno='0101'and grade between 80 and 90;(5) 查询数学系或计算机系姓张的学生的信息。
select*from studentwhere dept in('数学系','计算机系')and sname like'张%';(6) 查询缺少了成绩的学生的学号和课程号。
select sno,cnofrom scwhere grade is null;2. 连接查询实验用Transact-SQL语句表示,并在“学生选课”数据库中实现下列数据连接查询操作:(1) 查询每个学生的情况以及他(她)所选修的课程。
select student.*,amefrom student,sc,coursewhere student.sno=sc.sno and o=o;(2) 查询学生的学号、姓名、选修的课程名及成绩。
SQL实验(实验4至实验7的答案)
SQL实验实验41.用select 语句查询departments和salary表中的所有数据:select salary.*, departments.*from salary ,departments2、查询departments 中的departmentid:select departmentid from departmentsgo3、查询 salary中的 income,outcome:select income,outcome from salarygo4、查询employees表中的部门号,性别,要用distinct消除重复行:select distinct(departmentid), sexfrom employees5、查询月收入高于2000元的员工号码:select employeeid from salarywhere income>2000go6、查询1970年以后出生的员工的姓名和住址:select name,addressfrom employeeswhere birthday>1970go7、查询所有财务部的员工的号码和姓名:select employeeid ,namefrom employeeswhere departmentid in(select departmentid from departments where departmentname='财务部')go8、查询employees员工的姓名,住址和收入水平,2000元以下显示为低收入,2000~3000元显示为中等收入,3000元以上显示为高收入:select name,address,casewhen income-outcome<2000 then'低收入'when income-outcome>3000 then'高收入'else'中等收入'end as'收入等级'from employees,salarywhere employees.employeeid=salary.employeeidgo9、计算salary表中员工月收入的评价数:select avg(income)as'平均收入'from salary10、查找employees表中最大的员工号码:select max(employeeid)as'最大员工号码'from employees11、计算salary表中的所有员工的总支出:select sum(outcome)as'总支出'from salary12、查询财务部雇员的最高实际收入:select max(income-outcome)from salary ,employees,departmentswhere salary.employeeid=employees.employeeid andemployees.departmentid=departments.departmentid and departmentname='财务部'go13、查询财务部雇员的最低实际收入:select min(income-outcome)from salary ,employees,departmentswhere salary.employeeid=employees.employeeid andemployees.departmentid=departments.departmentid and departmentname='财务部'go14、找出所用地址中含有“中山”的雇员的号码及部门号:select employeeid ,departmentidfrom employeeswhere address like'%中山%'go15、查找员工号码中倒数第二个数字为0的员工的姓名,地址和学历:select education,address,namefrom employeeswhere employeeid like'%0_'go16、使用into字句,由表employees创建“男员工1”表,包括编号和姓名:select employeeid,nameinto男员工表from employeeswhere sex='1'go17、用子查询的方法查找收入在2500元以下的雇员的情况:select*from employeeswhere employeeid in(select employeeid from salary where income<2500)go18、用子查询的方法查找查找研发部比所有财务部雇员收入都高的雇员的姓名:SELECT Name FROM Employees WHERE EmployeeID IN(SELECT EmployeeID FROM SalaryWHERE EmployeeID IN(SELECT EmployeeId FROM EmployeesWHERE DepartmentID IN(SELECT DepartmentID FROM DepartmentsWHERE DepartmentName='研发部'))AND InCome>ALL(SELECT InCome FROM SalaryWHERE EmployeeID IN(SELECT EmployeeId FROM EmployeesWHERE DepartmentID IN(SELECT DepartmentID FROM DepartmentsWHERE DepartmentName='财务部'))))19、用子查询的方法查找所有年龄比研发部雇员都大的雇员的姓名:select namefrom employeeswhere Birthday<all(select birthdayfrom employeeswhere departmentid in(select departmentidfrom departmentswhere departmentname='研发部'))20、查询每个员工的情况及其薪水的情况:select employees.*,departments.departmentnamefrom employees,departmentswhere employees.departmentid=departments.departmentid 21、使用内连接方法查找不在财务部工作的所有员工信息:select employees.*from employees inner join departments onemployees.departmentid=departments.departmentidwhere departmentname!='财务部'22、使用外连接方法查找出所有员工的月收入:select employees.*,salary.incomefrom employees join salary on employees.employeeid=salary.employeeid 23、查找财务部雇员的最高收入:select max(income)from salarywhere employeeid in(select employeeidfrom employeeswhere departmentid in(select departmentidfrom departmentswhere departmentname='财务部'))24、查询财务部雇员的最高实际收入:select max(income-outcome)from salarywhere employeeid in(select employeeidfrom employeeswhere departmentid in(select departmentidfrom departmentswhere departmentname='财务部'))25、统计财务部收入在2500元以上的雇员人数:select count(employeeid)from employeeswhere departmentid in(select departmentid from departmentswhere departmentname='财务部')and employeeid in(select employeeidfrom salarywhere income>2500)26、按部门列出在该部门工作的员工的人数:select departmentid ,count(*)as人数from employeesgroup by departmentid27、按员工的学历分组:select education ,count(*)as人数from employeesgroup by education28、按员工的工作年份分组,统计年份人数:select workyear ,count(*)as人数from employeesgroup by workyear29、按各雇员的情况收入由低到高排列:select employees.*,salary.incomefrom employees ,salarywhere employees.employeeid=salary.employeeidorder by income30、将员工信息按出生时间从小到大排列:select*from employeesorder by birthday31、在order by 字句中使用子查询,查询员工姓名,性别和工龄信息,要求按实际收入从大到小排列:select name,sex,workyear,income-outcomefrom salary ,employeeswhere salary.employeeid=employees.employeeidorder by income-outcome desc视图部分1、创建view1:Create view view1asselect employees.employeeid,name,departmentname,(income-outcome)as comefrom employees , departments , salarywhere employees.departmentid=departments.departmentid and employees.employeeid=salary.employeeid2、查询视图employeeid:3、向视图view1中插入一行数据:insert into view1 values('111111','谎言','1','30000')4、查看视图(没有影响)基本表:实验51、定义一个变量,用于描述YGGL数据库的salary表中000001号员工的实际收入,然后查询该变量:declare @hy intset @hy=(select income-outcomefrom salarywhere employeeid='000001')select @hy2、使用运算符“>”:select namefrom employeeswhere birthday>'1974-10-10'3、判断姓名为“王林”的员工实际收入是否高于3000元,如果是则显示“高收入”,否则显示“收入不高于3000”:if((select incomefrom salary,employeeswhere salary.employeeid=employees.employeeid and ='刘明')>3000)select income as'高收入'from salary,employeeswhere salary.employeeid=employees.employeeid and ='刘明' elseselect'收入不高于'4、使用循环输出一个“*”三角形:declare @i intdeclare @j intset @j=20set @i=1while @i<@jbeginprint(space((@j-@i)/2)+replicate('*',@i))set @i=@i+2end4、按部门进行分类,使用if语句实现:Create function hy1(@departmentid1 char(3))returns char(10)asbegindeclare @hy1 char(10)if((select departmentid from departments where@departmentid1=departmentid)='1')set @hy1='财务部'if((select departmentid from departments where@departmentid1=departmentid)='2')set @hy1='人力资源部'if((select departmentid from departments where@departmentid1=departmentid)='3')set @hy1='经理办公室'if((select departmentid from departments where@departmentid1=departmentid)='4')set @hy1='研发部'if((select departmentid from departments where@departmentid1=departmentid)='5')set @hy1='市场部'return @hy1endselect employeeid,name,address,dbo.hy1(departmentid)from employees select employeeid,name,address,case departmentidwhen 1 then'财务部'when 2 then'人力资源部'when 3 then'经理办公室'when 4 then'研发部'when 5 then'市场部'end as部门号from employees6、自定义一个函数,计算一个数的阶层:create function hy(@hy2 int)returns intasbegindeclare @i intset @i=@hy2declare @j intset @j=1while @i>1beginset @j=@j*@iset @i=@i-1endreturn(@j)enddeclare @h intexec @h=dbo.hy 4select @h as'jiecheng'7、/*生成随机数*/select rand()8、/*平方*/select square(12)9、/*求财务部收入最高的员工姓名*/select max(name)from employeeswhere employeeid in(select employeeidfrom salarywhere employeeid in(select employeeidfrom employeeswhere departmentid in(select departmentidfrom departmentswhere departmentname='财务部')))select avg(income)as'平均收入'from salary/*聚合函数与group by 一起使用*/select workyear ,count(*)as人数from employeesgroup by workyear/*将字符组成字符串*/select char(123)/*返回字符串左边开始的个字符*/select left('abcdef',2)/*返回指定日期时间的天数*/select day(birthday)from employeeswhere employeeid='010000'/*获取当前时间*/select getdate()实验61、创建索引:create unique index huangyanon employees(employeeid)2、/*用create index 语句创建主键*/3、重建表employees中employeeid列上的索引alter index huangyanon employees rebuild4、删除索引:5、创建一个新表,使用一个复合列作为主键,作为表的约束,并为其命名:create table employees5( employeeid char(6)not null,name char(5)not null,sex tinyint,education char(4),constraint yan primary key(employeeid,name))为新表添加一列:alter table employees5add address char(10)6、创建新表student,性别只能包含男或女:create table student(号码char(6)not null,性别char(2)not nullcheck(性别in('男','女')))7、创建新表:create table employees7(学号char(10)not null,出生日期datetime not nullcheck(出生日期>'1980-01-01'))8、创建一个规则:9,创建salary2:create table salary2(employeeid char(6)not null primary key,income float not null,outcome float not null,foreign key(employeeid)references salary(employeeid)on update cascadeon delete cascade)10、添加一个外键,salary与employees有相关记录,则拒绝更新employees:alter table salaryadd constraint kc_forforeign key(employeeid)references employees(employeeid)on delete no actionon update no action实验71、工作年份大于6时,跟换科室到经理办公室(根据员工):Create PROC UpdateDeptByYear(@EmpId char(6))ASBEGINDECLARE @year intSELECT @year=WorkYear From Employees WHERE EmployeeID=@EmpId IF(@year>6)UPDATE EmployeesSET DepartmentID='3'WHERE EmployeeID=@EmpIdENDEXEC UpdateDeptByYear '020010'SELECT*FROM Employees WHERE Employeeid='020010'2、根据每个员工的学历将收入提高元:CREATE PROC UpdateInComeByEdu @Employeeid char(6)ASBEGINUPDATE SalarySET InCome=InCome+500FROM SalaryLEFT JOIN EmployeesON Salary.EmployeeID=Employees.EmployeeIDWHERE Salary.Employeeid=@EmployeeidENDEXEC UpdateInComeByEdu '020010'SELECT*FROM Salary where EmployeeID='020010'3、游标:CREATE PROCEDURE Employees_biliASBEGINDECLARE @i FLOATDECLARE @j FLOATDECLARE @Education CHAR(10)DECLARE Employees_cursor CURSORFOR SELECT Education FROM EmployeesSET @i=0SET @j=0OPEN Employees_cursorFETCH Employees_cursor INTO @EducationWHILE(@@FETCH_STATUS=0)BEGINIF(@Education!='大专')SET @i=@i+1SET @j=@j+1FETCH Employees_cursor INTO @EducationENDCLOSE Employees_cursorSELECT @i AS'本科及以上员工所占员工数'SELECT @j AS'员工总数'SELECT @i/@j AS'本科及以上员工所占比例'CLOSE Employees_cursorENDEXEC Employees_bili4、使用命令的方式修改存储过程的定义:5、对于YGGL数据库,表Employees的EmployeeID列与表Salary的EmployeeID列应该满足参照的完整性规则,请用触发器实现两个表的参照完整性:CREATE TRIGGER Salary_insert ON SalaryFOR INSERT,UPDATEASBEGINIF(SELECT EmployeeID FROM INSERTED)NOT IN(SELECT EmployeeID FROM Employees)ROLLBACKENDCREATE TRIGGER Employeesupdate ON EmployeesFOR UPDATEASBEGINUPDATE SalarySET EmployeeID=(SELECT EmployeeID FROM INSERTED)WHERE EmployeeID=(SELECT EmployeeID FROM DELETED)ENDCREATE TRIGGER Employeesdelete ON EmployeesFOR DELETEASBEGINDELETE FROM SalaryWHERE EmployeeID=(SELECT EmployeeID FROM DELETED)ENDINSERT INTO SalaryVALUES('000005',2000,1000)UPDATE EmployeesSET EmployeeID='000000'WHERE EmployeeID='990230'DELETE FROM EmployeesWHERE EmployeeID='000000'6.当修改表Employees时,若将Employees表中员工的工作时间增加1年,则将收入增加500,若增加2年则增加1000,依次增加。
实验四__SQL数据操作
实验四 SQL数据操作目的:完成数据进行插入、删除、修改等操作。
体会数据完整性约束的作用,加深对数据完整性及其约束的理解。
实验内容及要求:1.准备工作:(在企业管理器中完成)(1) 将“教学数据库”附加的系统中,将教师提供的示例数据库(先将压缩文件解压)-----教学数据库中的.MDF文件导入到当前系统中。
(2)新建一个数据库,数据库命名为:C学号(如C0700001)(3)使用数据导入导出工具(DTC)将教学数据库中的数据导入到“C学号”数据库中。
(4)为“C学号”数据库中的各表设置实体完整性和参照完整性(采用方法任意)。
2. 使用T-SQL语句在查询分析器中完成数据的插入、更新和删除操作:(1)使用INSERT语句添加记录,分别为学生表中添加至少3条09级统计系(系号为16)的学生记录,其中一条记录是学生本人信息;为课程表中添加至少3条记录是学生本人的所学课程信息(应是原课程表中的没有的课程记录)。
(2)使用带有子查询的INSERT语句,为09级学生添加选课记录到选课表,要求选修的课程是课程表中的所有“必修”课程。
(3)使用UPDATE语句将C程序设计课程的学时改为比数据结构课程的学时少6学时。
(4)建一个重修课程表,将需要重修的信息添加的该表中。
(表结构为:课程号、学号,分数)使用命令任意。
(5)删除选修了课程而没有考试的选课记录。
(6)将为统计系的学生开设“VB程序设计”课程的选课信息填入选课表。
(7)删除学生李鹏飞的记录,注意与之相关信息的删除。
(注意级联关系的作用)(8)将信息系、物理系和统计系合并,改系科名称为“理学院”(系科号为28),其他与之相关的信息也要修改。
(本题所要修改的表为系科表、学生表)体会执行操作时检查实体完整性规则、参照完整性规则的效果。
在实验报告中写出以上题目2的命令和操作结果(可以使用select语句显示执行了数据操作语句以后的表中数据的变化,将结果放在每一题的后面,也可以使用抓图软件。
大学生数据库实验课实验四报告
《数据库技术及应用》实验四、SQL语言数据定义语言DDL学生姓名学生班级学生学号指导老师重庆邮电大学计算机学院一.实验内容在Navicat for MySQL 中使用CREATE 命令完成对表、索引、视图、同义词的创建,使用DROP 命令完成对表、索引、视图、同义词的删除,使用ALTER 命令对表结构进行修改及完整性约束的增加、删除。
二.实验步骤1.启动Navicat for MySQL,在MySQL –新建连接中完成连接参数配置。
2.登录到本地数据库服务器后,连接到test 数据库上。
3.用SQL 语句(如下),建立如下所示的表student;4.同理5.同理6. 用Drop Table 语句删除表CourseAa。
7. 用Alter Table 语句更新表ChooseBb,添加一个属性名Bb4,类型Varchar, 长度20,完整性约束设为非空值,缺省值设为字符“系统测试值”。
8. 用Alter Table 语句更新表ChooseBb,添加一个属性名Bb5,类型Varchar, 长度10,完整性约束设为主码。
完成后,表ChooseBb 的设计如下所示。
9. 用Create View 语句建立一个视图View_Choosebb,生成的视图属性名(View_bb1,View_bb2,view_bb3), 其中View_bb1 对应于基表ChooseBb 的Bb1、View_bb2 对应于基表ChooseBb 的Bb4、view_bb3 对应于基表ChooseBb 的Bb5。
完成后,视图View_Choosebb 的设计如下所示。
10.用Drop View 语句删除视图View_Choosebb。
11. 用Create Index 语句对表ChooseBb 的Bb2 属性建立一个升序索引,索引名Index_bb2。
用Create Index 语句对表ChooseBb 的Bb4 属性建立一个降序索引,索引名Index_bb4。
sql-labs一到四关的实验总结
sql-labs一到四关的实验总结SQL实验一:SQL基础SQL实验一主要是介绍了SQL的基础知识,包括数据库的创建、表的创建和删除等操作。
在本次实验中,我学到了SQL的基础语法和常用命令。
通过实验,我了解了如何创建数据库和表,并能够使用INSERT语句向表中添加数据。
此外,我还学会了使用SELECT语句查询数据,使用UPDATE语句更新数据,以及使用DELETE语句删除数据。
在实验过程中,我发现了一些问题。
首先,我发现在创建数据库和表时,要注意使用正确的语法,否则会出现错误。
其次,我发现在查询数据时,要注意使用正确的条件,否则可能无法得到想要的结果。
最后,我还发现在更新和删除数据时,要慎重操作,以免造成数据丢失或错误。
通过本次实验,我对SQL有了更深入的理解。
我认识到SQL是一种强大的数据库查询语言,它可以帮助我们快速、高效地操作数据库。
此外,我还意识到SQL的学习是一个渐进的过程,需要不断地实践和总结。
SQL实验二:条件查询SQL实验二主要是介绍了条件查询的使用方法,包括使用WHERE子句、使用AND和OR运算符等。
在本次实验中,我学到了如何通过条件查询从表中筛选出符合条件的数据。
通过使用WHERE子句,我可以指定查询的条件,从而获取想要的结果。
同时,通过使用AND和OR运算符,我可以组合多个条件,更灵活地进行查询。
在实验过程中,我遇到了一些挑战。
首先,我发现在使用WHERE子句时,要注意使用正确的条件和运算符,以及正确的语法。
其次,我发现在使用AND和OR运算符时,要注意使用括号来明确运算的优先顺序。
最后,我还发现在进行条件查询时,要注意优化查询语句的性能,以提高查询效率。
通过本次实验,我进一步掌握了条件查询的技巧。
我认识到条件查询是SQL中非常重要的一部分,它可以帮助我们快速、准确地获取所需的数据。
同时,我还意识到条件查询的学习是需要不断实践和完善的过程。
SQL实验三:排序和聚合函数SQL实验三主要是介绍了排序和聚合函数的使用方法,包括使用ORDER BY子句、使用COUNT、SUM、AVG等聚合函数。
sql实验4数据查询
实验4数据查询一、实验目的1.掌握使用Transact-SQL的SELECT语句进行基本查询的方法。
2.掌握使用SELECT语句进行条件查询的方法。
3.掌握嵌套查询的方法。
4.掌握多表查询的方法。
5.掌握SELECT语句的GROUP BY和ORDER BY子句的作业和使用方法。
6.掌握联合查询的操作方法。
7.掌握数据更新语句INSERT INTO、UPDATE、DELETE的使用方法。
二、实验准备1.了解SELECT语句的基本语法格式和执行方法。
2.了解嵌套查询的表示方法。
3.了解UNION运算符的用法。
4.了解SELECT语句的GROUP BY和ORDER BY子句的作用。
5.了解IN、JOIN等子查询的格式。
6.了解INSERT INTO、UPDATE、DELETE的格式与作用。
三、实验内容及步骤0. 创建studentsdb数据库及其相应表,并录入数据。
启动查询分析器,运行下面链接的代码即可。
创建数据库代码1.在studentsdb数据库中,使用下列SQL语句将输出什么?(1)SELECT COUNT(*) FROM grade(2)SELECT SUBSTRING(姓名,1,2) FROM student_info(3)SELECT UPPER('kelly')(4)SELECT Replicate('kelly',3)(5)SELECT SQRT(分数) FROM grade WHERE 分数>=85(6)SELECT 2,3,POWER(2,3)(7)SELECT YEAR(GETDATE),MONTH(GETDATE),DAY(GETDATE)2.在studentsdb数据库中使用SELECT语句进行基本查询。
(1)在student_info表中,查询每个学生的学号、姓名、出生日期信息。
SELECT*FROMstudent_info(2)查询学号为0002的学生的姓名和家庭住址。
SQL实验4
3.------------------------------------------------------------------------------------------
select 材料消耗明细表.*
from 成本预算表,材料消耗明细表
where 材料消耗明细表.单据号=成本预算表.单据号 and 成本预算表.预算单位='112201002 '
13
select *
from 材料消耗明细表
where 单据号 in(
select 单据号
from 成本预算表
where 材料三 >2000
);
单据号 物码 消耗数量 单价
zy2011003 wm001 200 10
zy2011003 wm002 200 10
zy2011003 112201002 s001 10500.00 张三 2011-5-1 2011-5-6 2011-5-23 作业公司作业二队 调剖 6500.00 2000.00 2000.00 2500.00 0.00 2000.00 500.00 1400.00 10400.00 李四 2011-5-26 10400.00 王五 2011-5-28
12.
select distinct 成本预算表.施工单位,SUM(结算金额) 总结算金额
from 成本预算表
group by 施工单位
施工单位 总结算金额
作业公司作业二队 21300.00
作业公司作业三队 21900.00
作业公司作业一队 11900.00
select *
from 成本预算表
where 成本预算表.结算日期>='2011-5-1' and 成本预算表.结算日期<='2011-5-28'
SQL实验四-数据库的查询和视图
学校代码:10128学号:************《数据库原理及应用》实验报告题目:数据库的查询和视图****:**学院:理学院系别:数学系专业:信息与计算科学班级:信计12-2****:**二〇一五年四月一、练习目的1、数据库的查询(1)掌握SELECT语句的基本语法;(2)掌握子查询的表示;(3)掌握连接查询的表示;(4)掌握SELECT语句的GROUP BY子句的作用与使用方法;(5)掌握SELECT语句的ORDER BY子句的作用与使用方法;2、视图的使用(1)熟悉视图的概念和作用;(2)熟悉视图的创建方法;(3)熟悉如何查询和修改视图。
二、练习准备1、数据库的查询(1)了解SELECT语句的基本语法格式;(2)了解SELECT语句的执行方法;(3)了解子查询的表示方法;(4)了解连接查询的表示;(5)了解SELECT语句的GROUP BY子句的作用与使用方法;(6)了解SELECT语句的ORDER BY子句的作用;2、视图的使用(1)了解视图的概念;(2)了解创建视图的方法;(3)了解并掌握对视图的操作。
三、实验程序实验4.1 数据库的查询1、(1)对于实验2给出的数据库结构,查询每个雇员的所有数据. USE YGGLGOSELECT*FROM Employees(2)用SELECT语句查询Employees表中每个雇员的地址和电话. SELECT Address,PhoneNumberFROM Employees(3)查询EmployeeID为000001的雇员的地址和电话.SELECT Address,PhoneNumberFROM EmployeesWHERE EmployeeID='000001'GO(4)查询Employees表中女雇员的地址和电话,使用AS子句将结果中各列的标题分别制定地址和电话. SELECT Address AS地址,PhoneNumber AS电话FROM EmployeesWHERE Sex=0(5)查询Employees表中员工姓名和性别,要求Sex值为1时显示为“男”,为0时显示为“女”. SELECT Name AS姓名,CASEWHEN Sex=1 THEN'男'WHEN Sex=0 THEN'女'END AS性别FROM Employees(6)计算每个员工的实际收入.SELECT EmployeeID,实际收入=InCome-OutComeFROM Salary(7)获得员工总数.SELECT COUNT(*)FROM Employees(8)找出所有姓王的雇员的部门号.SELECT DepartmentIDFROM EmployeesWHERE Name LIKE'王%'(9)找出所有收入在2000~3000之间的员工号码.SELECT EmployeeIDFROM SalaryWHERE InCome BETWEEN 2000 AND 3000(10)使用INTO子句,由表Salary创建“收入在1500以上的员工表”,包括编号和收入. SELECT EmployeeID as编号,InCome as收入INTO收入在以上的员工FROM SalaryWHERE InCome>15002、子查询的使用.(1)查询在财务部工作的雇员的情况.SELECT*FROM EmployeesWHERE DepartmentID=(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='财务部')(2)查询财务部年龄不低于研究部雇员年龄的雇员的姓名.SELECT NameFROM EmployeesWHERE DepartmentID IN(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='财务部')ANDBirthday!>ALL(SELECT BirthdayFROM EmployeesWHERE DepartmentID IN(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='研发部' ))(3)查找比所有财务部的雇员收入都高的雇员的姓名. SELECT NameFROM EmployeesWHERE EmployeeID IN(SELECT EmployeeIDFROM SalaryWHERE InCome>ALL(SELECT InComeFROM SalaryWHERE EmployeeID IN(SELECT EmployeeIDFROM EmployeesWHERE DepartmentID=(SELECT EmployeeIDFROM DepartmentsWHERE DepartmentName='财务部')))))3、连接查询的使用(1)查询每个雇员的情况及其薪水的情况SELECT Employees.*,Salary.*FROM Employees,SalaryWHERE Employees.EmployeeID=Salary.EmployeeID(2)使用内连接的方法查询名字为“王林”的员工所在的部门SELECT DepartmentNameFROM Departments JOIN EmployeesON Departments.DepartmentID=Employees.DepartmentID WHERE ='王林'(3)查询财务部收入在2000以上的雇员姓名及其薪水详情. SELECT Name,InCome,OutComeFROM Employees,Salary,DepartmentsWHERE Employees.EmployeeID=Salary.EmployeeIDAND Employees.DepartmentID=Departments.DepartmentID AND DepartmentName='财务部'AND InCome>20004、聚合函数的使用.(1)求财务部雇员的平均收入.SELECT AVG(InCome)AS'财务部平均收入'FROM SalaryWHERE EmployeeID IN(SELECT EmployeeIDFROM EmployeesWHERE DepartmentID=(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='财务部'))(2)财务部雇员的平均实际收入.SELECT AVG(InCome-OutCome)AS'财务部平均实际收入' FROM SalaryWHERE EmployeeID IN(SELECT EmployeeIDFROM EmployeesWHERE DepartmentID=(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='财务部'))(3)求财务部雇员的总人数SELECT COUNT(EmployeeID)FROM EmployeesWHERE DepartmentID=(SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName='财务部')5、GROUP BY\ORDER BY子句的使用.(1)Emyees表中的男性和女性的人数SELECT Sex,COUNT(Sex)FROM EmployeesGROUP BY Sex;(2)查找员工数超过2人的部门名称和员工数量.SELECT(Employees.DepartmentID),COUNT(*)AS人数FROM Employees,DepartmentsWHERE Employees.DepartmentID=Department.DepartmentID GROUP BY Employees.DepartmentIDHAVING COUNT(*)>2(3)将各雇员的情况按收入由低到高排列.SELECT Employees.*,Salary.*FROM Employees,SalaryWHERE Employees.EmployeeID=Salary.EmployeeIDORDER BY InCome实验4.2 视图的使用1、创建视图①创建YGGL数据库上的视图DS_VIEW,视图包含Departments表的全部列。
SQL实验报告
实验四触发器实验(一)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数据库实验四_复杂查询(1)解答
实验四复杂查询(1)解答实验结果1. 查询没有订购商品的且在北京地区的客户编号、客户名称和邮政编码,并按邮政编码降序排序。
SQL语句:SELECT customerNo,customerName,zipFROM CustomerWHERE address LIKE'%北京%'and customerNo NOT IN(SELECT customerNoFROM OrderMaster)ORDER BY zip DESC查询结果:问题:SELECT customerNo,customerName,zipFROM CustomerWHERE address='北京市'AND customerNo not in(select customerNo from OrderMaster)ORDer by zip DESC2.查询订购了“32M DRAM”商品的订单编号、订货数量和订货单价。
SQL语句:SELECT orderNo,quantity,priceFROM OrderDetailWHERE productNo IN(SELECT productNoFROM ProductWHERE productName='32M DRAM')查询结果:3.查询与员工编号E2008005在同一个部门的员工编号、姓名、性别、所属部门。
SQL语句:SELECT employeeNo,employeeName,sex,departmentFROM EmployeeWHERE department IN(SELECT departmentFROM EmployeeWHERE employeeNo='E2008005')查询结果:不包括员工‘E2008005’:SELECT employeeNo,employeeName,sex,departmentFROM EmployeeWHERE department IN(SELECT departmentFROM EmployeeWHERE employeeNo='E2008005')AND employeeNo!='E2008005'4.查询既订购了P2*******商品,又订购了P2*******的商品的客户编号、订单编号和订单总额。
数据库实验四 SQL 数据更新语句
实验四 SQL 数据更新语句一、实验目的(1)加深对SQL 数据更新(插入、修改及删除)语句的基本语法格式的掌握(2)掌握单个元组及多个元组的插入、修改及删除操作的实现过程(3)加深对更新操作时数据库中数据一致性问题的了解(4)加深对约束条件在数据更新操作执行中的作用问题的了解二、实验内容方法一:在SSMS 中插入、删除及修改数据,方法二:在查询编辑器中写SQL 插入、删除及修改数据三、实验步骤设有一个SPJ 数据库,包括S,P,J,SPJ 四个关系模式:S(SNO,SNAME,STATUS,CITY)P(PNO,PNAME,COLOR,WEIGHT)J(JNO,JNAME,CITY)SPJ(SNO,PNO,JNO,QTY)供应商表S 由供应商代码(SNO)、供应商姓名(SNAME)、供应商(STATUS)、供应商所在城市(CITY)组成;零件表P 由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;工程项目表J 由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;供应情况表SPJ 由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
创建数据库:S:P:J:SPJ:S表的内容:P表的内容:J表的内容:SPJ表的内容:试完成以下操作:1.在S 表中插入元组“s6,华誉,40,广州”执行语句:执行结果:2.在J 表中插入元组“j8,传感器厂”执行语句:执行结果:3.对每一个供应商,求他为各种工程供应零件的总数量,并将此结果存入数据库执行语句:执行结果:4.将P 表中PNO 值为p6 的元组的color 属性值改为绿,weight 属性值改为60执行语句:执行结果:5.将SPJ 表中前4 个元组的qty 属性值统一修改为300执行语句:执行结果:6.将S 表中city 属性名含有“京”或“津”的相应status 属性值增加100 执行语句:执行结果:7.将供应商s2 为“一汽”工程项目所供应的零件数量修改为2000执行语句:执行结果:8.将全部红色零件的颜色修改为浅红色执行语句:执行结果:9.由s5 供给j4 的零件p6 改为由s3 供应执行语句:执行结果:10.在SPJ 表中新增一名为SDATE 的属性列,对该表中的每一元组在SDATE 属性列上填上实验当时的日期和时间执行语句:执行结果:11.删除所在城市为“广州”的供应商记录执行语句:执行结果:12.删除所有零件名称中第一个字为“螺”字的零件记录,并在供应情况表中删除相应的记录执行语句:执行结果:13.删除s3 和s4 两供应商为“三建”工程供应“螺母”或“螺丝刀”零件的相应供应情况数据信息执行语句:Delete from SPJWhere SNO IN('s3','s4')and JNO IN(select JNOfrom Jwhere JNAME like'%三建%')and PNO IN(select PNOfrom Pwhere PNAME like'%螺母%'or PNAME like'%螺丝刀%');执行结果:四、实验总结(1)掌握了SQL 数据更新(插入、修改及删除)语句的基本语法格式(2)掌握单个元组及多个元组的插入、修改及删除操作的实现过程(3)明白了更新操作时数据库中数据一致性问题(4)了解了约束条件在数据更新操作执行中的作用问题(5)GROUP BY 语句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
进行Sql语句练习实验报告
进行Sql语句练习实验报告实验报告课程名称:数据库技术实验题目:实验四Sql语句练习姓名:学号:班级:实验日期:成绩:一、实验目的进行Sql语句练习二、实验环境Microsoft sql server 2008和DBMS三、实验主要内容和主要操作步骤1.新建表Depts、Student、Courses、Reports如下:2.建立表关系如下:3.建立查询3.1 简单的选择与投影查询(1)无条件查询查询学生的姓名(Sname)、学号(Sno)、所在系号(Dno)查询全体学生的姓名(Sname)、出生年份及学号(Sno)查询全体学生的姓名、出生年份和学号,要求用小写字母表示学号中的字母。
查询选修了课程的学生的学号(2)条件查询比较条件查询:查询系别编号D03的全体学生的学号(Sno)、姓名(Sname)谓词条件查询:查询20-22岁(包括18和22岁)学生的姓名(Sname)、年龄(Sage)(3)查询结果排序查询选修C03号课程学生的学号(Sno)和成绩(Grade),并按成绩降序排序(4)集函数的使用查询学生的总人数计算选修C01课程学生的平均成绩查询选修C01课程学生的最高成绩(5)查询结果分组查询各个课程号(Cno)及相应的选课人数3.2 连接查询(1)不同表之间的连接查询查询Sname=‘王建平’及其选课情况(2)自身连接查询没门课程的简介先修课3.3 嵌套查询(1)带谓词IN的嵌套查询查询选修了编号为“C02”的课程的学生的姓名(Sname)和所在的系别号(Dno)(2)带有比较运算符的嵌套查询查询与“刘华”在同一个系学习的学生学号(Sno)、姓名(Sname)和系别编号(3)带谓词AND或ALL的嵌套查询查询系别号不是D01的学生,且年龄不超过D01所有学生年龄的学生学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)和系别号(Dno)(4)带谓词EXISTS的嵌套查询查询所有选修了编号为“C01”课程的学生姓名(Snmae)和所在系别号(Dno)3.4 集合查询查询系别号D02的学生或年龄不大于20岁的学生信息四、实验结果及体会建立查询的过程中我得出了下面的一些感受:(1)初步熟悉各种比较简单的查询(2)对一些比较复杂的查询还需要多练习。
实验四用T-SQL语句操作数据表中的数据
实验四⽤T-SQL语句操作数据表中的数据实验四⽤T-SQL语句操作数据表中的数据⼀、实验⽬的掌握⽤T-SQL向表中插⼊、修改、删除数据的基本操作。
⼆、实验内容1.从FTP中把上次实验创建的数据库“Student”复制到本地磁盘。
2.在企业管理器中把数据库“附加”进来。
3.使⽤insert命令对表中的数据进⾏操作(具体要求见后⾯操作步骤)。
4.使⽤Update命令对表中的数据进⾏更新操作(具体要求见后⾯操作步骤)。
5.使⽤delete命令对表中的数据进⾏更新操作(具体要求见后⾯操作步骤)。
6.分离数据库“Student”并复制FTP上,以备在以后实训中使⽤。
三、仪器、设备、材料微机、SQLServer2005四、实验准备1.理论知识预习及要求①掌握数据库的结构;②掌握数据表的组成;③掌握T-SQL语句操作数据表的格式;2.实验指导书预习及要求上机前先复习第四章的内容,掌握⽤T-SQL语句操作数据表数据。
3.其他准备⽆五、实验原理或操作要点简介利⽤T-SQL语句对表中的数据进⾏操作。
六、注意事项要养成为结果⽂件取有意义名称的习惯。
要及时保存⽂件,避免死机或断电造成的⽂件丢失。
创建过程中,出现问题时,请保存,请⽼师解答。
创建过程中,若出现找不到相应的问题时,要看联机丛书,逐步学会⾃学。
七、实验过程与指导1.进⼊SQL Server2005的界⾯。
2.启动服务。
3.打开查询分析器,新建查询。
提⽰:每做完⼀题,就新建⼀个查询。
使⽤insert命令对表中的数据进⾏操作,具体要求:T-SQL命令insert语法如下:insert[into]<表名>[<列名列表>]values(数据列表)使⽤values关键字的insert命令⼀次仅能插⼊⼀条记录,所以每插⼊⼀⾏,都要使⽤insert关键字,并且必须提供表名及相关的列、数据等。
注意:(1)将数据添加到⼀⾏的所有列时,Insert语句中⽆需给出表中的列名,只要有Values关键字给出添加的数据即可。
数据库试验四SQL数据查询
数据库实验四:SQL数据查询一、实验目的与要求:1. 实验目的熟练掌握SQL SELECTS句,能运用查询语句完成各种查询。
实验内容:在实验三和实验四的基础上完成查询操作,将题目中的x, y等具体化:1、一般简单查询(1)不带条件的查询指定字段(考虑去掉和不去掉重复值两种情况) 。
(2)查询某个表中的所有记录。
(3)使用单个条件的简单查询。
(4)使用多个条件(AND关系)的查询。
(5)使用多个条件(OR关系)的查询。
(6)使用多个条件(混合AND和OF关系)的查询。
(7)使用带NOT运算的查询。
(8)使用BETWEEN - AND ••的查询。
(9)使用NOT …BETWEEN - AND ••的查询。
(10)使用LIKE运算符的字符串匹配查询。
(11)使用LIKE运算符的模板匹配查询。
(12)查询空值和非空值的查询(13)结果要求排序的查询(14)查询结果按多列排序,并分别要求升序和降序的查询。
(15)使用TOP显示前若干记录的查询。
(16)使用TOP显示前若干记录的查询,如果有满足条件的并列记录一并^显^示。
2、连接查询(17)两个关系的连接查询(18)带其他查询条件的两个关系的连接查询。
(19)多个关系(三个以上)的连接查询。
(20)两个关系的广义笛卡尔积运算结果。
(21)根据两个关系的广义笛卡尔积运算结果得到两个关系进行自然连接的结果。
(22)查询教师-课程信息,查询结果中包括教师姓名、职称、课程名称和课程性质等4个字段。
(23)查询教师-课程信息,查询结果中包括教师姓名、职称、课程名称和课程性质等4个字段,要求结果中列出所有教师信息(即包括不是任何课程责任教师的教师信息)。
(24)查询教师-课程信息,查询结果中包括教师姓名、职称、课程名称和课程性质等4个字段,要求结果中能够反映目前没有确定责任教师的课程信息。
(25)查询教师-课程信息,查询结果中包括教师姓名、职称、课程名称和课程性质等4个字段,要求结果中既能够反映目前不是责任教师的教师信息,又能反映目前没有确定责任教师的课程信息。
SQL数据库_实验四_复杂查询(2)解答
12.查找销售总额少于5000元的销售员编号、姓名和销售额。
13.查找至少订购了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额,并按客户编号排序输出。
14.查找同时订购了商品编号为“P20070001”和商品编号为“P20070002”的商品的客户编号、客户姓名、商品编号、商品名称和销售数量,按客户编号排序输出。
导入实验三中保存的订单数据库OrderDB.mdf。完成之后,进行以下的实验。写出相对应的SQL语句,并给出查询结果。
1.统计订单主表的订单金额。(用订单明细表中的订单汇总金额更新订单主表相应的订单金额属性)
2.查询订单金额最高的订单编号、客户姓名、销售员名称和相应的订单金额。
3.统计客户号为“C20050001”的客户的客户名、订单数、订货总额和平均订货金额。(表头用中文显示)
WHEREa.employeeNo=b.salerNo
GROUPBYorderSum,salerNo,employeeName
HAVINGorderSum<5000
查询结果:
13.查找至少订购了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额,并按客户编号排序输出。
SQL语句:
SELECTb.customerNo,customerName,d.productNo,productName,quantity,金额=quantity*price
ANDc.customerNo='C20050001'
GROUPBYcustomerName,orderSum
查询结果:
4.统计每个客户的客户号、客户名、订单数、订货总额和平均订货金额。(表头用中文显示)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四创建SQL查询
注:以下实验内容可使用提供的“学生情况”数据库。
1、查询选修了课程号为01和06课程的学生学号。
2、从“学生表”中列出北京市男生的“学号”、“姓名”、“性别”、“出生日期”、“入学成绩”、“入学省市”字段,并按入学成绩从高到低进行排序。
3、从“学生表”、“课程表”和“成绩表”中,查询所有成绩在85~100之间学生的“学号”、“姓名”、“课程号”、“课程名称”及“成绩”。
4、使用SQL语句在“学生情况”数据库中建立一个“本月订单”表,它由“订单”(长度为5的字符串)、“产品”(长度为10的字符串)、“数量”(数字整型)、和“客户”(长度为8的字符串)四个字段构成,其中“订单”不能为空且值唯一,并将“订单”字段设置为主键。
5、向“本月订单”表中增加一个名为“客户姓名”(长度为6的字符串)的字段。
6、向“成绩表”中插入一条新记录,该记录包括“学号”、“课程号”、“成绩”三个字段的值("990102", "06", 88)。
7、将“学生表”中学号为“990302”的学生的“奖学金”字段更新为850元。
8、删除“成绩表”中学号为“990102”的学生记录。
9、子查询:
(1)查询“学生表”中入学成绩低于平均分的学生的“学号”、“姓名”、“性别”和“入学成绩”。
(2)从“学生表”和“成绩表”中,查询课程号为“01”且成绩大于75的学生的“学号”、“姓名”、“入学省市”字段信息。
(3)从“学生表”和“成绩表”中,查询选修了课程号为“01”的课程的学生的“学号”、“姓名”、“入学成绩”字段信息。