1 create database cookbbook 2 on primary( 3 name='cookbook_mdf', 4 filename='F:\我的数据库\cookbook\cookbook.mdf', 5 size=5mb, 6 maxsize=50mb, 7 filegrowth=2mb 8 9 ) 10 log on 11 (name='cookbok_ldf', 12 filename='F:\我的数据库\cookbook\cookbook.ldf', 13 size=5mb, 14 maxsize=50mb, 15 filegrowth=2mb 16 ) 17 18 create database school 19 on primary 20 (name='school_mdf', 21 filename='F:\我的数据库\school\school.mdf', 22 size=2mb, 23 maxsize=5mb, 24 filegrowth=1mb 25 ) 26 log on 27 (name='school_ldf', 28 filename='F:\我的数据库\school\school.ldf', 29 size=2mb, 30 maxsize=5mb, 31 filegrowth=1mb 32 33 ) 34 ----------------------------------------------------------------------------- 35 36 37 38 create database orderdb 39 create table employee 40 ( 41 employeeno varchar(8) primary key, 42 employeename varchar(10), 43 sex varchar(2), 44 birthday datetime, 45 address varchar(50), 46 telephone varchar(20), 47 hiredate datetime, 48 department varchar(30), 49 headship varchar(10), 50 salary numeric(8,2) 51 ) 52 --------------------------- 53 create table customer 54 ( 55 customerno varchar(9) primary key, 56 customername varchar(40), 57 telephone varchar(20), 58 address varchar(40), 59 zip varchar(6) 60 ) 61 --------------------------- 62 create table product 63 ( 64 productno varchar(9) primary key, 65 productname varchar(40), 66 productclass varchar(20), 67 productprice numeric(7,2), 68 ) 69 --------------------------- 70 create table ordermaster 71 ( 72 orderno varchar(12) primary key, 73 customerno varchar(9), 74 salerno varchar(8), 75 orderdate datetime, 76 ordersum numeric(9,2), 77 invoiceno char(10), 78 foreign key (customerno) references customer(customerno) 79 ) 80 ----------------------------- 81 create table orderdetail 82 ( 83 orderno varchar(12), 84 productno varchar(9), 85 quantity int, 86 price numeric(7,2), 87 primary key(orderno,productno), 88 foreign key (orderno) references ordermaster(orderno), 89 foreign key (productno) references product(productno) 90 ) 91 -------------------------------------------------------- 92 93 bulk insert employee from 'F:\数据库\orderdb数据库创建\employee.txt' 94 with 95 ( 96 fieldterminator = ',', 97 rowterminator='\n' 98 ) 99 100 bulk insert customer from 'F:\数据库\orderdb数据库创建\customer.txt' 101 with 102 ( 103 fieldterminator = ',', 104 rowterminator='\n' 105 ) 106 107 bulk insert product from 'F:\数据库\orderdb数据库创建\product.txt' 108 with 109 ( 110 fieldterminator = ',', 111 rowterminator='\n' 112 ) 113 114 bulk insert ordermaster from 'F:\数据库\orderdb数据库创建\ordermaster.txt' 115 with 116 ( 117 fieldterminator = ',', 118 rowterminator='\n' 119 ) 120 121 bulk insert orderdetail from 'F:\数据库\orderdb数据库创建\orderdetail.txt' 122 with 123 ( 124 fieldterminator = ',', 125 rowterminator='\n' 126 ) 127 128 129 130 131 132 133 134 135 136 137 138 select *from employee 139 select * from ordermaster 140 select * from orderdetail 141 142 143 144 create view employee_ordermaster 145 as 146 select salerno ,employeename,ordermaster.orderno,orderdetail.productno,price 147 from employee left outer join ordermaster 148 on (employee.employeeno=ordermaster.salerno) 149 ,orderdetail 150 where ordermaster.orderno=orderdetail.orderno 151 152 select *from employee_ordermaster 153 154 update employee_ordermaster 155 set price=600 156 where orderno='200801090001' and productno='p2005001' 157 158 insert into 159 employee_ordermaster 160 values('e2000','林东豪','asdasdasd','asdsadas',234234) 161 162 drop view employee_ordermaster 163 --第四章 简单查询 164 --(1)查询所有业务部门的员工姓名,职称,薪水 165 select department,employeename,headship,salary 166 from employee 167 order by department,headship 168 --(2)查询名字中含有“有限”的客户姓名和所在地 169 select customername,address 170 from customer 171 where customername like '%有限%' 172 173 --(3)查询姓“张”并且姓名的最后一个字为“娟”的员工 174 select employeename 175 from employee 176 where employeename like '张%娟' 177 178 --(4)查询住址中含有上海或南昌的女员工,并显示其姓名, 179 -- 所属部门,职称,住址,其中性别用“男”和“女”显示。 180 select employeename,(case sex when 'F' then '女' when 'M' then '男'end) sex,department,headship,address 181 from employee 182 where address='上海市' or address='南昌市' and sex='M' 183 order by address 184 185 --(5)查询订单金额高于8000的所有客户编号 186 update ordermaster 187 set ordersum=(select sum(quantity* price ) 188 from orderdetail 189 where ordermaster.orderno=orderdetail.orderno) 190 select * from ordermaster 191 192 select customerno,sum(ordersum) sumorder 193 from orderdetail,ordermaster 194 group by customerno 195 having sum(ordersum)>8000 196 197 --(6)选取编号界于C2005001~C2005003的客户编号,客户名称,客户地址 198 select *from customer 199 select customerno,customername,address 200 from customer 201 where customerno between 'c2005001' and 'c2005003' 202 203 204 --(7)找出同一天进入公司服务的员工 205 select distinct a.employeename,a.hiredate 206 from employee a,employee b 207 where a.hiredate=b.hiredate and a.employeename!=b.employeename 208 order by a.hiredate 209 210 211 212 update orderdetail 213 set price=100 214 where orderno='200801090001' 215 select * from orderdetail 216 select * from ordermaster 217 select *from product 218 219 update orderdetail 220 set productno='p2007002' 221 where orderno='200801090001' and quantity=2 222 223 --(8)在订单主表中查询订单金额大于“E2005002”业务员在2008-1-9这天所接的任一张订单的金额”的所有订单信息。 224 225 select * 226 from ordermaster om,orderdetail od 227 where om.orderno=od.orderno and om.orderno in 228 (select orderno 229 from orderdetail 230 where price >all 231 (select price 232 from orderdetail ,ordermaster 233 where orderdetail.orderno=ordermaster.orderno 234 and salerno='E2005002' 235 and orderdate='2008-01-09' 236 ) 237 ) 238 239 240 241 --(9)查询既订购了“52倍速光驱”商品,又订购了“17寸显示器”商品的客户编号、订单编号和订单金额。 242 243 select distinct customerno,ol.orderno,ol.price 244 from orderdetail ol ,ordermaster ot 245 where ol.orderno=ot.orderno and 246 ol.orderno in 247 (select orderno 248 from orderdetail od,product pt 249 where od.productno=pt.productno and pt.productname='52倍速光驱' 250 251 intersect 252 253 select orderno 254 from orderdetail od,product pt 255 where od.productno=pt.productno and pt.productname='17寸显示器') 256 257 258 --(10)查找与“陈诗杰”在同一个单位工作的员工姓名、性别、部门和职务。 259 select employeename,sex,department,headship 260 from employee 261 where department= 262 (select department 263 from employee 264 where employeename='陈诗杰' 265 )and employeename!='陈诗杰' 266 267 select e1.employeename,e1.sex,e1.department,e1.headship 268 from employee e1,employee e2 269 where e1.department=e2.department and e2.employeename='陈诗杰' 270 271 --(11)查询单价高于400元的商品编号、商品名称、订货数量和订货单价。 272 select pt.productno,pt.productname,sum(od.quantity) quantity,pt.productprice 273 from orderdetail od,product pt 274 where od.productno=pt.productno and pt.productprice>400 275 group by pt.productno,productname,productprice 276 277 278 --(12)分别使用左外连接、右外连接、完整外部连接查询单价高于400元的商品编号、商品名称、订货数量和订货单价,并分析比较检索的结果。 279 280 select pt.productno,pt.productname,od.quantity ,pt.productprice 281 from orderdetail od left outer join product pt on ( od.productno=pt.productno ) 282 where pt.productprice>400 283 284 select pt.productno,pt.productname,od.quantity,pt.productprice 285 from orderdetail od right outer join product pt on ( od.productno=pt.productno ) 286 where pt.productprice>400 287 288 select pt.productno,pt.productname,od.quantity ,pt.productprice 289 from orderdetail od full outer join product pt on ( od.productno=pt.productno ) 290 where pt.productprice>400 291 292 293 ---(13)查找每个员工的销售记录,要求显示销售员的编号、姓名、性别、商品名称、数量、单价、金额和销售日期, 294 --其中性别使用“男”和“女”表示,日期使用yyyy-mm-dd格式显示。 295 296 update ordermaster 297 set ordersum=temp.total 298 from ordermaster om,(select orderno,SUM(quantity*price) total from orderdetail group by orderno) temp 299 where om.orderno=temp.orderno 300 301 select om.orderno,om.orderno,om.salerno,em.employeename,(case sex when 'F' then '男' when 'M' then '女' end)'性别',pt.productno,od.quantity,pt.productprice,od.price,om.ordersum,CONVERT(varchar(100),om.orderdate,23)'orderdate' 302 from employee em,ordermaster om, orderdetail od,product pt 303 where em.employeeno=om.salerno and om.orderno=od.orderno and od.productno=pt.productno 304 select*from employee 305 select* from orderdetail 306 select* from customer 307 select* from ordermaster 308 select* from product 309 310 insert into customer 311 values('c2005004','207工商协会','022-324234','福州市','21233') 312 313 --(14)查找在2008年3月中有销售记录的客户编号、名称和订单总额。 314 select temp.customerno, customer.customername,temp.ordersum 315 from 316 (select customerno,sum(ordersum ) ordersum 317 from ordermaster 318 where orderdate between '2008-03-01' and '2008-03-31' 319 group by customerno) temp, customer 320 where temp.customerno=customer.customerno 321 --(15)使用左外连接查找每个客户的客户编号、名称、订单日期、订货金额, 322 --其中订货日期不要显示时间,日期格式为yyyy-mm-dd,按客户编号排序,同一客户再按订单金额降序排序输出。 323 324 select cu.customerno,cu.customername,convert(varchar(100),om.orderdate,23) orderdate,om.ordersum 325 from (select customerno,customername 326 from customer) cu 327 left outer join 328 (select customerno,ordersum,orderdate 329 from ordermaster 330 ) om 331 on(om.customerno=cu.customerno) 332 order by cu.customerno,om.ordersum desc 333 334 --(16)查找32M DRAM的销售情况,要求显示相应的销售员的姓名,性别,销售日期、销售数量和金额,其中性别用“男”,“女”表示。 335 select oe.employeename,oe.sex,oe.orderdate,op.quantity,op.price 336 from (select orderno,quantity,price 337 from orderdetail,product 338 where product.productno=orderdetail.productno and productname='32M DRAM') op, 339 340 (select orderno,employeename,(case sex when 'F' then '女' when 'M' then '男' end) sex, orderdate 341 from ordermaster,employee 342 where ordermaster.salerno=employee.employeeno 343 ) oe 344 where op.orderno=oe.orderno 345 346 --(17)查找公司男业务员所接且订单金额超过2000元的订单号及订单金额。 347 select em.employeename,sum(od.price) sumprice 348 from(select orderno,employeeno,employeename 349 from employee,ordermaster 350 where sex='M' and employeeno=salerno) em, 351 (select orderno,price 352 from orderdetail 353 ) od 354 where em.orderno=od.orderno 355 group by em.employeename 356 having sum(od.price)>2000 357 358 --(18)查找来自上海市的客户的姓名,电话,订单号及订单金额。 359 select customername,telephone,orderno,sum(md.price)sumprice 360 from (select customerno,customername,telephone 361 from customer 362 where address='上海市' 363 ) cu, 364 (select om.customerno,om.orderno, od.price 365 from ordermaster om,orderdetail od 366 where om.orderno=od.orderno 367 ) md 368 where cu.customerno=md.customerno 369 group by customername,telephone,orderno 370 order by customername 371 -------------------------------------------------------------------------------------------- 372 -------------------------------------------------------------------------------------------- 373 374 --第五章 实验 复杂查询 375 select *from ordermaster 376 update ordermaster 377 set ordersum=(select sum(quantity*price) 378 from orderdetail od 379 where ordermaster.orderno=od.orderno 380 ) 381 update ordermaster 382 set ordersum=temp.total 383 from ordermaster om, 384 (select sum(quantity*price)total,orderno 385 from orderdetail 386 group by orderno) temp 387 where om.orderno=temp.orderno 388 --(1)用子查询查询员工“张小娟”所做的订单信息。 389 --1)第一种 390 select '张小娟',om.orderno, om.orderdate,om.ordersum,om.customerno 391 from ordermaster om,employee em 392 where em.employeeno=om.salerno and em.employeename='张小娟' 393 394 --2)第二种 395 396 select '张小娟',om.orderno,om.orderdate,om.ordersum,om.customerno 397 from ordermaster om 398 where salerno=(select employeeno 399 from employee 400 where employeename='张小娟') 401 402 403 404 --(2)查询没有订购商品的且在北京地区的客户编号,客户名称和邮政编码,并按邮政编码降序排序。 405 select customerno,customername,zip 406 from customer cu 407 where address='北京市' and not exists (select * 408 from ordermaster om 409 where cu.customerno=om.customerno) 410 411 412 --(3)查询订购了“32M DRAM”商品的订单编号,订货数量和订货单价。 413 select orderno,quantity,price 414 from orderdetail 415 where orderno in(select orderno 416 from ordermaster 417 where productno=(select productno from product where productname='32M DRAM') 418 ) 419 420 --(4)查询与员工编号“E2008005”在同一个部门的员工编号,姓名,性别,所属部门。 421 select employeeno,employeename ,(case sex when 'F' then '男' when 'M' then '女' end) sex,department 422 from employee 423 where department=(select department from employee where employeeno='E2008005') 424 425 --(5)查询既订购了P2005001商品,又订购了P2007002商品的客户编号,订单编号和订单金额 426 select * from orderdetail 427 select * from ordermaster 428 update orderdetail 429 set productno='p2007002' 430 where orderno='200801090001' and productno='p2005003' 431 432 select om.customerno,o1.orderno,o1.price 433 from orderdetail as o1,ordermaster as om 434 where o1.productno='P2005001' 435 and o1.orderno in 436 (select orderno 437 from orderdetail o2 438 where o2.productno='p2007002') 439 and o1.orderno=om.orderno 440 441 442 --(6)查询没有订购“52倍速光驱”或“17寸显示器”的客户编号,客户名称。 443 444 select cu.customerno,cu.customername 445 from ordermaster om ,customer cu 446 where orderno in 447 (select orderno 448 from orderdetail 449 where productno not in 450 (select productno 451 from product 452 where productname='52倍速光驱' or productname='17寸显示器') 453 ) and om.customerno=cu.customerno 454 455 --(7)查询订单金额最高的订单编号,客户姓名,销售员名称和相应的订单金额。 456 select om.orderno,cu.customername,em.employeename,om.ordersum 457 from ( 458 select distinct orderno, ordersum,salerno ,customerno 459 from ordermaster 460 where ordersum =(select max(ordersum) from ordermaster) 461 ) om, 462 employee em,customer cu 463 where om.customerno=cu.customerno and om.salerno=em.employeeno 464 465 --(8)查询订购了“52倍速光驱”商品的订购数量,订购平均价和订购总金额。 466 467 select '52倍速光驱',sum(quantity) quantity, avg(price) , sum(price) 468 from orderdetail 469 where productno=(select productno from product where productname='52倍速光驱') 470 471 472 --(9)查询订购了“52倍速光驱”商品且订货数量界于2~4之间的订单编号,订货数量和订货金额。 473 select orderno,quantity,price 474 from orderdetail 475 where productno=(select productno from product where productname='52倍速光驱') 476 and quantity between 2 and 4 477 478 --(10)在订单主表中查询每个业务员的订单数量 479 select salerno,count(orderno) ordercount 480 from ordermaster 481 group by salerno 482 483 --(11)统计在业务科工作且在1973年或1967年出生的员工人数和平均工资。 484 select * from employee 485 select employeeno,salary 486 from employee 487 where department='业务科' and year(birthday)=1973 or year(birthday)=1967 488 489 --(12)在订单明细表中统计每种商品的销售数量和金额,并按销售金额的升序排序输出。 490 select * from orderdetail 491 select productname,sum(quantity) quantity , sum(price) price 492 from (select productname,productno 493 from product) pt,orderdetail 494 where orderdetail.productno=pt.productno 495 group by productname 496 order by price 497 498 --(13)统计客户号为“C2005001”的客户的订单数,订货总额和平均订货金额 499 select * from ordermaster 500 501 --第一种 由于orderno有主键约束,ordersum不会存在重复计算问题 502 select 'c2005001' ,count(orderno),sum(ordersum),avg(ordersum) 503 from ordermaster 504 where customerno='c2005001' 505 506 507 --第二种 如果ordeno没有主键约束,ordersum可能存在重复计算问题 508 509 select count(temp.orderno),sum(temp.ordersum) 510 from (select orderno,sum(ordersum) ordersum 511 from ordermaster 512 where customerno='c2005001' 513 group by orderno) temp 514 --(14)统计每个客户的订单数,订货总额和平均订货金额。 515 select customername,temp.countorder,temp.sos ordersum,temp.aos averageOrdersum 516 from (select customerno ,count(orderno) countorder,sum(ordersum) sos,avg(ordersum) aos 517 from ordermaster 518 group by customerno) temp,customer 519 where customer.customerno=temp.customerno 520 521 522 523 --(15)查询订单中至少包含3种(含3种)以上商品的订单编号及订购次数,且订购的商品数量在3件(含3件)以上。 524 select * from orderdetail 525 select *from ordermaster 526 527 select orderno,count(distinct orderdate) 528 from ordermaster 529 where orderno in(select orderno 530 from orderdetail 531 group by orderno 532 having count(productno)>=3 and sum(quantity)>=3 533 ) 534 group by orderno 535 536 537 538 539 540 --(16)查找订购了“32M DRAM”的商品的客户编号,客户名称,订货总数量和订货总金额。 541 542 select cu.customerno,cu.customername,sum(temp.quantity) sumquantity,sum(temp.price) sumprice 543 from customer cu,ordermaster , 544 (select orderno ,quantity,price 545 from orderdetail 546 where productno in 547 (select productno 548 from product 549 where productname='32M DRAM') 550 ) temp 551 where temp.orderno=ordermaster.orderno and ordermaster.customerno=cu.customerno 552 group by cu.customerno,customername 553 554 555 556 --(17)查询每个客户订购的商品编号,商品所属类别,商品数量及订货金额,结果显示客户名称,商品所属类别,商品数量及订货金额,并按客户编号升序和按订货金额的降序排序输出。 557 --第一种:表连接 558 select cu.customername ,pt.productname ,pt.productclass ,od.quantity,od.price 559 from customer cu,product pt,orderdetail od,ordermaster om 560 where cu.customerno=om.customerno 561 and om.orderno=od.orderno 562 and od.productno=pt.productno 563 564 --第一种同一公司订购的同一商品没有整合 565 select cu.customerno,cu.customername,pt.productname,pt.productclass,od.quantity,od.price 566 from (select productno,productname 567 from product) pt,orderdetail od, ordermaster om,customer cu 568 where pt.productno=od.productno and od.orderno=om.orderno and om.customerno=cu.customerno 569 order by cu.customerno ,od.price 570 --第二种同一公司订购的同一商品进行了整合 571 select cu.customerno,cu.customername,pt.productname,pt.productclass,sum(od.quantity)sumquantity ,sum(od.price) sumprice 572 from (select productno,productname,productclass 573 from product) pt,orderdetail od, ordermaster om,customer cu 574 where pt.productno=od.productno and od.orderno=om.orderno and om.customerno=cu.customerno 575 group by cu.customerno,cu.customername ,pt.productname,pt.productclass 576 order by cu.customerno ,sumprice 577 578 579 --(18)按商品类别查询每类商品的订货平均单价在280元(含280元)以上的订货总数量,订货平均单价和订货总金额。 580 select pt.productclass ,SUM(quantity) sumquantity,AVG(price) avgprice,sum(price) sumprice 581 from orderdetail od, product pt 582 where od.productno=pt.productno 583 group by pt.productclass 584 585 586 587 --(19)查找至少有2次销售的业务员名称和销售日期。 588 589 select em.employeename, om.orderdate 590 from ordermaster om, employee em 591 where em.employeeno in 592 (select salerno 593 from ordermaster 594 group by salerno 595 having COUNT(salerno)>=2)and om.salerno=em.employeeno 596 order by employeename 597 598 --(20)查询销售金额最大的客户名称和总货款额 599 update ordermaster 600 set ordersum=(select SUM(quantity*price) 601 from orderdetail 602 where ordermaster.orderno=orderdetail.orderno 603 604 select cu.customername,sumprice 605 from (select om.customerno,sum(om.ordersum) sumprice 606 from ordermaster om 607 group by customerno 608 )temp,customer cu 609 where sumprice>=all(select sum(om.ordersum) sumprice 610 from ordermaster om 611 group by customerno) 612 and cu.customerno=temp.customerno 613 614 --(21)查找销售总额小于5000元的销售员编号,姓名和销售额 615 select em.employeeno,em.employeename,om.sumorder 616 from (select salerno,sum(ordersum) sumorder 617 from ordermaster 618 group by salerno) om,employee em 619 where om.sumorder<5000 and om.salerno=em.employeeno 620 621 --(22)查找至少订购了3种商品的客户编号,客户名称,商品编号,商品名称,数量和金额。 622 623 624 select cu.customerno,cu.customername,pt.productno,pt.productname,od.quantity,od.price 625 from customer cu, ordermaster om,orderdetail od,product pt 626 where cu.customerno=om.customerno and om.orderno=od.orderno and od.productno=pt.productno 627 and cu.customerno in(select om.customerno 628 from ordermaster om,orderdetail od 629 where om.orderno=od.orderno 630 group by om.customerno 631 having count(distinct od.productno)>=3) 632 order by cu.customerno 633 634 635 --(23)查找同时订购了商品为“P2007002”和商品编号为“P2007001”的商品的客户编号,客户姓名, 636 --商品编号,商品名称和销售数量,按客户编号排序输出。 637 638 select cu.customerno,cu.customername,pt.productno,pt.productname, sum(od.quantity) quantity 639 from customer cu,ordermaster om,product pt, 640 (select orderno,productno,quantity 641 from orderdetail 642 where productno='p2007002' and orderno 643 in(select orderno 644 from orderdetail 645 where productno='p2007001' ) 646 ) od 647 where cu.customerno=om.customerno and om.orderno =od.orderno and od.productno=od.productno 648 group by cu.customerno,cu.customername,pt.productno,pt.productname 649 order by customerno 650 651 --(24)计算每一商品每月的销售金额总和,并将结果首先按销售月份然后按订货金额降序排序输出。 652 select pt.productname,dm.sumprice,dm.orderdate 653 from product pt, 654 (select productno,sum(price) sumprice,om.orderdate 655 from orderdetail od,ordermaster om 656 where od.orderno=od.orderno 657 group by productno,om.orderdate) dm 658 where pt.productno=dm.productno 659 order by dm.orderdate ,dm.sumprice desc 660 --(25)查询订购了“键盘”商品的客户姓名,订货数量和订货日期 661 select cu.customername,op.quantity,om.orderdate 662 from (select orderno,quantity 663 from orderdetail 664 where productno in 665 (select productno from product where productname='键盘')) op, 666 customer cu,ordermaster om 667 where cu.customerno=om.customerno and om.orderno=op.orderno 668 669 --(26)查询每月订购“键盘”商品的客户名称。 670 select month(om.orderdate) monthorder,cu.customername 671 from ordermaster om,customer cu, 672 (select od.orderno,od.productno 673 from orderdetail od, product pt 674 where od.productno=pt.productno and pt.productname='键盘') dp 675 where dp.orderno=om.orderno and cu.customerno=om.customerno 676 group by month(om.orderdate),cu.customername 677 order by monthorder 678 --(27)查询至少销售了5种商品的销售员编号,姓名,商品名称,数量及相应的单价,并按销售员编号排序输出。 679 select om.salerno,em.employeename,pt.productname,sum(od.quantity)quantity,pt.productprice 680 from employee em,product pt ,orderdetail od,ordermaster om 681 where em.employeeno=om.salerno and om.orderno=od.orderno and od.productno=pt.productno 682 and om.salerno in(select om.salerno 683 from ordermaster om,orderdetail od 684 where om.orderno=od.orderno 685 group by om.salerno 686 having count(distinct productno)>=5) 687 group by om.salerno,em.employeename,pt.productprice,pt.productname 688 order by salerno 689 --(28)查询没有订购商品的客户编号和客户名称。 690 select customerno ,customername 691 from customer 692 where customerno not in(select customerno from ordermaster) 693 --(29)查询至少包含了“世界技术开发公司”所订购的商品的客户编号,客户名称,商品编号,商品名称,数量和金额。 694 select cu1.customerno,cu1.customername,od1.productno,pt1.productname,od1.quantity,od1.price 695 from customer cu1,ordermaster om1,orderdetail od1,product pt1 696 where cu1.customerno=om1.customerno and om1.orderno=od1.orderno and od1.productno=pt1.productno 697 and not exists 698 (select * 699 from customer cu2,ordermaster om2,orderdetail od2 700 where cu2.customerno=om2.customerno and om2.orderno=od2.orderno and 701 cu2.customername='世界技术开发公司' 702 and not exists 703 ( select * 704 from ordermaster om3,orderdetail od3 705 where om3.orderno=od3.orderno 706 and od3.productno=od2.productno 707 and om3.customerno=cu1.customerno 708 ) 709 710 ) 711 order by cu1.customerno 712 ------------------------------------------------------------------------------------------------- 713 ------------------------------------------------------------------------------------------------- 714 715 --第六章 数据库的安全性 716 --(1)分别创建登陆账号和用户账号john,mary(注意服务器角色的设置) 717 sp_addlogin 'john','123','orderdb' 718 sp_addlogin 'mary','123','orderdb' 719 sp_adduser 'john' 720 sp_adduser 'mary' 721 --(2)将员工表的所有权限给全部用户 722 723 grant select,update,delete 724 on employee 725 to john,mary 726 --(3)创建角色r1,r2,将订单明细表所有列的select权限,price列的update权限给r1。 727 sp_addrole 'r1' 728 sp_addrole 'r2' 729 grant select,update(price) 730 on orderdetail 731 to r1,r2 732 --(4)收回全部用户对员工表的所有权限。 733 revoke select 734 on employee 735 from john,mary 736 --(5)将john,mary两个用户赋予r1角色。 737 sp_addrolemember 'r1','john' 738 --(6)收回john对订单明细表所有列的select权限。 739 revoke select 740 on orderdetail 741 from john 742 --(7)在当前数据库中删除角色r2。 743 sp_droprole 'r2' 744 ------------------------------------------------------------------------------- 745 ------------------------------------------------------------------------------- 746 --第七章 数据库的完整性 747 --(1)重建orderDB数据库中的表,分别为每张表建立主键,外键。 748 --(2)各表的用户定义的完整性如下: 749 create database oredrDB 750 --员工表:员工编号,姓名、性别、所属部门、职称、薪水设为not null; 751 --员工编号构成:年流水号,共8位,第一位为E,如E2008001,年份取雇佣日期的年份; 752 --性别:f表示女,m表示男。 753 --创建员工表 754 create table Employee 755 ( employeeNo char(8) primary key, 756 employeeName varchar(20), 757 constraint E_NO check(employeeNo like 'E[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 758 Sex varchar(10) check(sex='f' or sex='m'), 759 Department varchar(20), 760 Title varchar(10), 761 Salary numeric(10,2) not null , 762 Hiredate datetime, 763 constraint E_Hire_NO check(substring(employeeNo,2,4)=year(Hiredate)) 764 ) 765 --添加员工记录 766 insert 767 into employee(employeename,sex,department,Title,salary,hiredate) 768 select '王帅','m','销售部','主管',1200,getdate() union all 769 select '赵少帅','m','娱乐部','部长',200000,getdate() 770 --添加员工流水号触发器 771 create trigger T_E_employeeNo 772 on employee 773 instead of insert 774 as 775 declare @head varchar,@datebody varchar(10),@maxid varchar(10) 776 set @head='E' 777 set @datebody=year(getdate()) 778 select @maxid=right(max(employeeNo),3) from employee 779 if @maxid is null 780 set @maxid='000' 781 declare @temp int 782 set @temp=cast(@maxid as int) 783 select * into #temp from inserted 784 update #temp set @temp=@temp+1, 785 employeeno=@head+@datebody+right(('00'+cast(@temp as varchar)),3) 786 insert into employee select *from #temp 787 788 789 790 791 792 --商品表:商品编号、商品名称、商品类别、建立日期设为not null; 793 --商品编号构成:年流水号,共9位,第一位为P,如P20080001,年份取建立日期的年份 794 --创建商品表 795 create table Product 796 ( productNo char(9) primary key, 797 constraint P_No check(productNo like 'P[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 798 productName varchar(20), 799 productType varchar(20), 800 productDate date not null, 801 constraint P_Date_No check(substring(productNo,2,4)=year(productDate)) 802 ) 803 --添加商品记录 804 insert into product(productname,productdate,producttype) 805 select '内存',getdate(),'硬件' union all 806 select '显卡',getdate(),'硬件' 807 --添加商品流水号触发器 808 create trigger T_P_productNo 809 on product 810 instead of insert 811 as 812 declare @head varchar,@datebody varchar(10),@maxid varchar(10) 813 set @head='P' 814 set @datebody=year(getdate()) 815 select @maxid=right(max(productNo),4) from product 816 if @maxid is null 817 set @maxid='0000' 818 declare @temp int 819 set @temp=cast(@maxid as int) 820 select * into #temp from inserted 821 update #temp set @temp=@temp+1, 822 productno=@head+@datebody+right(('000'+cast(@temp as varchar)),4) 823 insert into product select *from #temp 824 825 --客户表:客户编号、电话属性为not null; 826 客户号构成:年流水号,共9位,第一位为C,如C20080001,年份取建立日期的年份 827 --创建客户表 828 create table Customer 829 ( 830 customerNo char(9) primary key, 831 constraint C_No check(customerNo like 'C[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 832 customerName varchar(20) , 833 Telephone varchar(20) not null, 834 Sex varchar(5) check(sex='f' or sex='m'), 835 constraint C_Date_No check(substring(customerNo,2,4)=year(getDate())) 836 ) 837 --添加客户记录 838 insert into customer(customername,telephone,sex) 839 select '上海工商','1778922990','f' union all 840 select '香港电子','1778923990','m' 841 --添加客户流水号触发器 842 create trigger T_C_customerNo 843 on customer 844 instead of insert 845 as 846 declare @head varchar,@datebody varchar(10),@maxid varchar(10) 847 set @head='C' 848 set @datebody=year(getdate()) 849 select @maxid=right(max(customerno),4) from customer 850 if @maxid is null 851 set @maxid='0000' 852 declare @temp int 853 set @temp=cast(@maxid as int) 854 select * into #temp from inserted 855 update #temp set @temp=@temp+1, 856 customerno=@head+@datebody+right(('000'+cast(@temp as varchar)),4) 857 insert into customer select *from #temp 858 --订单主表:订单编号的构成:年月日流水号,共12位,如200708090001; 859 订单编号、客户编号、员工编号、发票号码设为not null;业务员必须是员工; 860 订货日期和出货日期的默认值设为系统当前日期;订单金额默认值为0;发票号码建立unique约束。 861 --创建订单主表 862 create table orderMaster 863 ( orderNo char(12) primary key, 864 constraint OM_No check(orderNo like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 865 customerNo char(9) foreign key references Customer(customerNo), 866 salesmanNo char(8) foreign key references employee(employeeNo), 867 invoiceNo varchar(10) unique, 868 orderDate DateTime default(getDate()), 869 shipment datetime default(getDate()), 870 orderPrice numeric default(0) 871 ) 872 873 --添加记录到订单主表 874 insert into ordermaster(customerno,salesmanno,invoiceno,orderdate,shipment) 875 select 'C20180001','E2018001','1231230',getdate(),getdate() union all 876 select 'C20180002','E2018002','1231231',getdate(),getdate() 877 select *from ordermaster 878 879 --创建订单主表订单流水号触发器 880 881 create trigger T_OM_orderNo 882 on orderMaster 883 instead of insert 884 as 885 declare @datebody varchar(10),@maxid varchar(10), 886 @year char(4),@month char(2),@day char(2) 887 set @year=year(getdate()) set @month=datename(month,getdate()) set @day=datename(day,getdate()) 888 set @datebody=@year+@month+@day --replace(convert(char(10),getdate(),120),'-','') 889 select @maxid=right(max(orderno),4) from ordermaster 890 if @maxid is null 891 set @maxid='0000' 892 declare @temp int 893 set @temp=cast(@maxid as int) 894 select * into #temp from inserted 895 update #temp set @temp=@temp+1, 896 orderno=@datebody+right(('000'+cast(@temp as varchar)),4) 897 insert into ordermaster select *from #temp 898 899 --订单明细表:订单编号、商品编号、数量、单价设为not null。 900 --创建订单明细表 901 create table orderDetail 902 ( 903 orderNo char(12) foreign key references orderMaster(orderNo), 904 productNo char(9) foreign key references Product(ProductNo), 905 quantity numeric(10), 906 unitPrice numeric(10) not null, 907 primary key(orderNo,productNo) 908 ) 909 --第八章 游标、存储过程与触发器 910 --(1)利用游标查找所有女业务员的基本情况 911 declare find_female cursor static 912 for 913 select * 914 from employee 915 where sex='F' 916 917 open find_female 918 919 fetch next from find_female 920 while @@fetch_status=0 921 begin 922 fetch next from find_female 923 end 924 925 close find_female 926 927 deallocate find_female 928 929 930 931 --(2)创建一游标,逐行显示表customer的记录,要求按 932 --‘客户编号’+‘-------’+‘客户名称’+‘-------’+‘客户地址’+‘-------------------’+‘客户电话’+‘ 933 ----------’+‘客户邮编’+‘--------’格式输出, 934 --并且用while结构来测试游标的函数@@Fetch_Status的返回值。 935 936 937 declare dis_customer cursor static 938 for 939 select * 940 from customer 941 942 open dis_customer 943 944 declare @no varchar(9),@name varchar(40),@address varchar(40),@telephone varchar(20), 945 @zip varchar(6) 946 947 fetch first from dis_customer into @no,@name,@telephone,@address,@zip 948 print '客户编号:'+@no+'客户名称:'+@name+'客户地址:'+@address+'客户电话:'+@telephone+'客户邮编:'+@zip 949 while @@fetch_status=0 950 begin 951 fetch next from dis_customer into @no,@name,@telephone,@address,@zip 952 print '客户编号:'+@no+'客户名称:'+@name+'客户地址:'+@address+'客户电话:'+@telephone+'客户邮编:'+@zip 953 end 954 close dis_customer 955 deallocate dis_customer 956 957 958 959 --(3)利用游标修改orderMaster表中的Ordersum的值 960 declare up_om cursor scroll 961 for 962 select *from ordermaster 963 964 open up_om 965 fetch first from up_om 966 while @@fetch_status=0 967 begin 968 update ordermaster 969 set ordersum=0 970 where current of up_om 971 fetch next from up_om 972 end 973 974 close up_om 975 deallocate up_om 976 --(4)利用游标显示出orderMaster表中每一个订单所对应的明细数据信息。 977 declare dis_om cursor scroll 978 for 979 select orderno from ordermaster 980 open dis_om 981 982 declare @orderno varchar(12) 983 while 1=1 984 begin 985 fetch next from dis_om into @orderno 986 if @@fetch_status=0 987 begin 988 declare dis_od cursor scroll 989 for 990 select * from orderdetail 991 where orderno=@orderno 992 open dis_od 993 fetch first from dis_od 994 while @@fetch_status=0 995 begin 996 fetch next from dis_od 997 end 998 close dis_od 999 deallocate dis_od 1000 end 1001 else 1002 break 1003 end 1004 1005 close dis_om 1006 deallocate dis_om 1007 --(5)利用存储过程,给Employee表添加一条业务部门员工的信息。 1008 go 1009 create procedure pr_insertem 1010 @emno varchar(20), 1011 @emname varchar(20) 1012 as 1013 begin 1014 insert into employee(employeeno,employeename) values(@emno,@emname) 1015 end 1016 go 1017 execute pr_insertem 'E2018005','吴起' 1018 go 1019 drop proc pr_insertem 1020 --(6)利用存储过程输出所有客户姓名、客户订购金额及其相应业务员的姓名 1021 go 1022 create proc pr_outinfo 1023 as 1024 begin 1025 select cu.customername ,om.ordersum,em.employeename 1026 from customer cu,ordermaster om, employee em 1027 where cu.customerno=om.customerno and om.salerno=em.employeeno 1028 end 1029 execute pr_outinfo 1030 drop proc pr_outinfo 1031 --(7)利用存储过程查找某员工的员工编号、订单编号、销售金额。 1032 go 1033 create proc pr_selemployee 1034 as 1035 begin 1036 select em.employeeno,om.orderno,om.ordersum 1037 from employee em,ordermaster om 1038 where em.employeeno=om.salerno 1039 order by em.employeeno 1040 end 1041 go 1042 execute pr_selemployee 1043 go 1044 drop proc pr_selemployee 1045 --(8)利用存储过程查找姓“李”并且职称为“职员”的员工的员工编号、订单编号、销售金额 1046 go 1047 create proc pr_selemployee 1048 as 1049 begin 1050 select em.employeeno,om.orderno,om.ordersum 1051 from employee em,ordermaster om 1052 where em.employeeno=om.salerno and em.employeename like '李%' and em.headship='职员' 1053 order by em.employeeno 1054 end 1055 execute pr_selemployee 1056 drop proc pr_selemployee 1057 1058 --(9)请使用游标和循环语句编写一个存储过程proSearchCustomer, 1059 --根据客户编号,查询该客户的名称、地址以及所有与该客户有关的销售记录,销售记录按商品分组输出。 1060 create proc proSearchCustomer 1061 @cuname varchar(20) 1062 as 1063 begin 1064 declare customers cursor scroll 1065 for 1066 select cu.customername,cu.address,om.orderno,om.customerno,om.salerno,om.orderdate,om.ordersum,om.invoiceno 1067 from customer cu,ordermaster om 1068 where cu.customername=@cuname and cu.customerno=om.customerno 1069 open customers 1070 fetch next from customers 1071 while @@FETCH_STATUS=0 1072 begin 1073 fetch next from customers 1074 end 1075 close customers 1076 deallocate customers 1077 end 1078 execute proSearchCustomer '统一股份有限公司' 1079 1080 drop proc proSearchCustomer 1081 1082 --(10)设置一个触发器,该触发器仅允许dbo用户可以删除Employee表内数据,否则出错。 1083 create trigger deleteemployee 1084 on employee 1085 for delete 1086 as 1087 begin 1088 if user='dbo' 1089 begin 1090 commit 1091 print'删除成功' 1092 end 1093 else 1094 begin 1095 rollback 1096 print'无权限修改employeeb表' 1097 end 1098 end 1099 --(11)在OrderMaster表中创建触发器, 1100 --插入数据时要先检查Employee表中是否存在和Ordermaster表同样值的业务员编号,如果不存在则不允许插入。 1101 create trigger ins_om 1102 on ordermaster 1103 for insert 1104 as 1105 if exists( 1106 select salerno from inserted 1107 where salerno 1108 in (select employeeno from employee) 1109 ) 1110 begin 1111 commit 1112 print('employeeno存在!') 1113 end 1114 else 1115 begin 1116 rollback 1117 print('employeeno不存在!') 1118 end 1119 --(12)级联更新:当更新customer表中的customerNo列的值时, 1120 --同时更新OrderMaster表中的customerNo列的值,并且一次只能更新一行。 1121 1122 1123 1124 --??????????????????????????????????????????????????尚存问题 主外键约束阻碍触发器运行 1125 create trigger up_cusno 1126 on customer 1127 for update 1128 as 1129 if(update(customerno)) 1130 begin 1131 update ordermaster 1132 set customerno=(select ins.customerno from inserted ins) 1133 where customerno=(select del.customerno from deleted del) 1134 end 1135 1136 --(13)对product表写一个UPDATE触发器。 1137 1138 1139 --??????????????????????????????????????????????????尚存问题 主外键约束阻碍触发器运行 1140 create trigger up_pro 1141 on product 1142 for update 1143 as 1144 if(update(productno)) 1145 begin 1146 update orderdetail 1147 set productno=(select ins.productno from inserted ins) 1148 where productno=(select del.productno from deleted del) 1149 end 1150