当前位置:   article > 正文

SQL语句练习题_sql在线做题

sql在线做题

一、表结构

  1. ---------------------- 创建数据库 school 脚本 ---------------------------
  2. --drop database school
  3. create database school --创建数据库
  4. go
  5. /*CREATE DATABASE school
  6. ON
  7. ( NAME = school_dat,
  8. FILENAME = 'd:\school1.mdf',
  9. SIZE = 2,
  10. MAXSIZE = 4,
  11. FILEGROWTH = 1 )
  12. LOG ON
  13. ( NAME =school_log,
  14. FILENAME = 'd:\school1.ldf',
  15. SIZE = 2MB,
  16. MAXSIZE = 3MB,
  17. FILEGROWTH = 1MB ) */
  18. use school --进入 school 数据库
  19. go
  20. EXEC sp_addtype ud_sno,'char(6)'
  21. go
  22. --创建表
  23. create table Student (
  24. Sno ud_sno ,
  25. Sname char(10) not null unique ,
  26. Ssex char(2) check (ssex='男' or ssex='女') ,
  27. Sage smallint check(sage>16) ,
  28. Sdept char(10) not null default 'JSJ' ,
  29. primary key (sno)
  30. )
  31. create index ix_student_sname ON student(sname)
  32. create table course(
  33. Cno char(4) ,
  34. Cname char(16) ,
  35. Cpno char(4) ,
  36. Ccredit int check (Ccredit >=0 and Ccredit<=5),
  37. check( cno<>cpno) , --约束
  38. primary key (cno)
  39. )
  40. create index ix_course_cpno ON course(cpno)
  41. create table SC(
  42. Sno ud_sno ,
  43. Cno char(4) ,
  44. Grade int check(grade<=100) ,
  45. constraint pk_sc primary key (sno,cno),
  46. foreign key (sno) references student(sno) ,
  47. foreign key (cno) references course(cno) ,
  48. )
  49. create index ix_sc_cno ON sc(cno)
  50. --添加数据
  51. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0003','陈小明','男',20,'SX')
  52. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0004','杨秀红','女',21,'JSJ')
  53. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0001','周志林','男',20,'SX')
  54. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0009','钱明明','男',20,'SX')
  55. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0002','李文庆','男',23,'JSJ')
  56. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0081','刘亭','女', 22,'SX')
  57. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0091','贺秋雪','女',20,'SX')
  58. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0078','王振','男', 21,'JSJ')
  59. insert into Student (Sno,Sname,Ssex,Sage,Sdept) values ('0092','赵三','男', 22,'SX')
  60. insert into student (sno,sname,ssex,sage,sdept) values ('8001','张华','男',23,'SX')
  61. insert into student (sno,sname,ssex,sage,sdept) values ('8002','赵颖','女',21,'SX')
  62. insert into student (sno,sname,ssex,sage,sdept) values ('8003','钱凯','男',22,'JSJ')
  63. insert into student (sno,sname,ssex,sage,sdept) values ('8004','王华','男',21,'SX')
  64. insert into student (sno,sname,ssex,sage) values ('8005','张英','女',21)
  65. insert into student (sno,sname,ssex,sage) values ('8006','赵章','女',22)
  66. insert into student (sno,sname,ssex,sage) values ('8007','钱利','男',23)
  67. insert into student (sno,sname,ssex,sage) values ('8008','王铁','男',21)
  68. insert into student (sno,sname,ssex,sage) values ('8009','张明','男',22)
  69. insert into course(Cno,Cname,Cpno,Ccredit) values ('1001','高等数学','',5)
  70. insert into course(Cno,Cname,Cpno,Ccredit) values ('1002','离散数学','1001',3)
  71. insert into course(Cno,Cname,Cpno,Ccredit) values ('1003','程序设计','',5)
  72. insert into course(Cno,Cname,Cpno,Ccredit) values ('1004','数据结构','1003',4)
  73. insert into course(Cno,Cname,Cpno,Ccredit) values ('1005','数据库原理','1004',4)
  74. insert into course(Cno,Cname,Cpno,Ccredit) values ('1006','操作系统','1004',5)
  75. insert into SC(Sno,Cno,Grade) values ('0002','1002',90)
  76. insert into SC(Sno,Cno,Grade) values ('0002','1001',91)
  77. insert into SC(Sno,Cno,Grade) values ('0002','1003',67)
  78. insert into SC(Sno,Cno,Grade) values ('0002','1004',98)
  79. insert into SC(Sno,Cno,Grade) values ('0001','1002',92)
  80. insert into SC(Sno,Cno,Grade) values ('0001','1001',92)
  81. insert into SC(Sno,Cno,Grade) values ('0001','1003',76)
  82. insert into SC(Sno,Cno,Grade) values ('0003','1001',77)
  83. insert into SC(Sno,Cno,Grade) values ('0001','1004', 91)
  84. insert into SC(Sno,Cno,Grade) values ('0004','1001', 97)
  85. insert into SC(Sno,Cno,Grade) values ('0004','1002', 78)
  86. insert into SC(Sno,Cno,Grade) values ('0004','1003', 65)
  87. insert into SC(Sno,Cno,Grade) values ('0004','1004', 89)
  88. insert into SC(Sno,Cno,Grade) values ('0091','1001', 93)
  89. insert into SC(Sno,Cno,Grade) values ('0091','1002', 87)
  90. insert into SC(Sno,Cno,Grade) values ('0091','1003', 99)
  91. insert into SC(Sno,Cno,Grade) values ('0091','1004', 95)
  92. insert into SC(Sno,Cno,Grade) values ('0009','1001', 93)
  93. insert into SC(Sno,Cno,Grade) values ('0009','1002', 88)
  94. insert into SC(Sno,Cno,Grade) values ('0009','1003', 60)
  95. insert into SC(Sno,Cno,Grade) values ('0009','1004', 83)
  96. insert into SC(Sno,Cno,Grade) values ('0092','1001', 98)
  97. insert into SC(Sno,Cno,Grade) values ('0092','1002', 86)
  98. insert into SC(Sno,Cno) values ('0092','1003')
  99. insert into SC(Sno,Cno,Grade) values ('0081','1001', 90)
  100. insert into SC(Sno,Cno) values ('0081','1002')
  101. insert into SC(Sno,Cno) values ('0081','1003')
  102. insert into SC(Sno,Cno,Grade) values ('8001','1002',90)
  103. insert into SC(Sno,Cno,Grade) values ('8001','1001',91)
  104. insert into SC(Sno,Cno,Grade) values ('8001','1003',67)
  105. insert into SC(Sno,Cno,Grade) values ('8001','1005',98)
  106. insert into SC(Sno,Cno,Grade) values ('8002','1002',87)
  107. insert into SC(Sno,Cno,Grade) values ('8002','1001',96)
  108. insert into SC(Sno,Cno,Grade) values ('8002','1003',68)
  109. insert into SC(Sno,Cno,Grade) values ('8002','1005',92)
  110. insert into SC(Sno,Cno,Grade) values ('8003','1001',91)
  111. insert into SC(Sno,Cno,Grade) values ('8003','1003',92)
  112. insert into SC(Sno,Cno,Grade) values ('8003','1004',63)
  113. insert into SC(Sno,Cno,Grade) values ('8003','1005',94)
  114. insert into SC(Sno,Cno,Grade) values ('8004','1001',92)
  115. insert into SC(Sno,Cno,Grade) values ('8004','1003',93)
  116. insert into SC(Sno,Cno,Grade) values ('8004','1004',64)
  117. insert into SC(Sno,Cno) values ('8004','1005')
  118. insert into SC(Sno,Cno) values ('8006','1001')
  119. insert into SC(Sno,Cno,Grade) values ('8006','1002',92)
  120. insert into SC(Sno,Cno,Grade) values ('8006','1003',20)
  121. insert into SC(Sno,Cno) values ('8006','1004')
  122. insert into SC(Sno,Cno,Grade) values ('8007','1001',99)
  123. insert into SC(Sno,Cno,Grade) values ('8007','1003',92)
  124. insert into SC(Sno,Cno,Grade) values ('8007','1004',86)
  125. insert into SC(Sno,Cno,Grade) values ('8007','1005',98)
  126. insert into SC(Sno,Cno,Grade) values ('8007','1002',95)
  127. insert into SC(Sno,Cno,Grade) values ('8008','1001',91)
  128. insert into SC(Sno,Cno,Grade) values ('8008','1003',92)
  129. insert into SC(Sno,Cno,Grade) values ('8008','1004',83)
  130. insert into SC(Sno,Cno,Grade) values ('8008','1005',94)
  131. insert into SC(Sno,Cno,Grade) values ('8008','1002',99)
  132. insert into SC(Sno,Cno,Grade) values ('8009','1001',65)
  133. insert into SC(Sno,Cno,Grade) values ('8009','1002',71)
  134. insert into SC(Sno,Cno,Grade) values ('8009','1003',32)
  135. insert into SC(Sno,Cno,Grade) values ('8009','1004',25)

二、单表查询

  1. --一 单表
  2. --1查询年龄在19至21岁之间的女生的学号,姓名,年龄,按年龄从大到小排列。
  3. Select Sno ,Sname ,Sage
  4. From Student
  5. Where ssex='女' and Sage between 19 and 21
  6. Order by Sage DesC
  7. --2查询姓名中第2个字为“明”字的学生学号、性别。
  8. select Sno ,sname,ssex
  9. from Student
  10. where Sname like '%明%'
  11. --3查询 1001课程没有成绩的学生学号、课程号
  12. select sno, cno
  13. from sc
  14. where grade is null and cno='1001'
  15. --4查询JSJ 、SX、WL 系的年龄大于25岁的学生学号,姓名,结果按系及学号排列 X
  16. select Sno,Sname from student
  17. where (Sdept='JSJ' OR Sdept='SX' OR Sdept='WL')and Sage>25
  18. --5按10分制查询学生的sno,cno,10分制成绩
  19. select sno,cno,grade*0.1 as A
  20. from SC
  21. -- (1-10分 为1 ,11-20分为2 ,30-39分为3,。。。90-100为10)
  22. --6查询 student 表中的学生共分布在那几个系中。(distinct)
  23. select distinct Sdept from student
  24. --7查询0001号学生1001,1002课程的成绩。
  25. SELECT grade
  26. from sc
  27. where Sno='0001' and Cno in('1001','1002')

三、统计

  1. ---二 统计
  2. --1查询姓名中有“明”字的学生人数。
  3. SELECT count(*)
  4. from student
  5. where Sname like '%明%'
  6. --2计算‘JSJ’系的平均年龄及最大年龄。
  7. SELECT avg(Sage) AS A,max(Sage) AS B
  8. from student
  9. where sdept='JSJ'
  10. --3查询学生中姓名为张明、赵英的人数 ⭐X
  11. SELECT count(*)
  12. from student
  13. where Sname in('张明','赵英' )
  14. --4计算每一门课的总分、平均分,最高分、最低分,按平均分由高到低排列
  15. SELECT Cno, SUM(grade) as 'sum',avg(grade)as 'avg',max(grade)as 'max',min(grade)as 'min'
  16. from sc
  17. GROUP BY Cno ORDER BY avg(grade) DESC
  18. --5 计算 1001,1002 课程的平均分。 X
  19. SELECT cno,avg(grade)
  20. from sc
  21. where Cno in ('1001','1002') ORDER BY Cno
  22. --6 查询平均分大于80分的学生学号及平均分
  23. select Sno , avg(grade)
  24. from sc GROUP BY Sno HAVING avg(grade) >'80'
  25. --7 统计选修课程超过 2 门的学生学号
  26. SELECT Sno
  27. from sc GROUP BY Sno HAVING count(*) >'2'
  28. --8 统计有10位成绩大于85分以上的课程号。
  29. SELECT Cno
  30. FROM sc
  31. WHERE grade>'85' GROUP BY Cno HAVING count(*)='10'
  32. --9 统计平均分不及格的学生学号
  33. SELECT Sno
  34. from sc GROUP BY Sno HAVING avg(grade) <'60'
  35. --10 统计有大于两门课不及格的学生学号 X
  36. SELECT Sno
  37. from sc
  38. WHERE grade<'60' GROUP BY Sno HAVING count(*)>'2'

四、其他更新

  1. 查询年龄最低的学生姓名
  2. select sname
  3. from student
  4. where sage <=all(select sage
  5. from student
  6. )
  7. select sname from student where sage=(
  8. select min(sage ) from student
  9. )
  10. 查询平均分最高的学生学号
  11. select sno from sc group by sno having
  12. avg(grade)>=all(select avg(select avg(grade) from sc
  13. group by sno)
  14. 查询每个系小于自己系的平均年龄的学生姓名
  15. select sname from student X where sage<
  16. (
  17. select avg(sage)
  18. from student Y where Y.sno=X.sno
  19. )
  20. 查询所有未修1001号课程的学生姓名
  21. select sname from student
  22. where not exists
  23. (
  24. select *from SC
  25. where Cno='1001'and SC,Sno=student.Sno
  26. )
  27. 查询选修了全部课程的学生学号
  28. 改为:不存在一门课程这个学生没有选修
  29. select sno from student where NOT EXTSTS(
  30. select * from where not exists(
  31. select *from sc where cno=course.cno and sno=student.sno
  32. )
  33. )
  34. 查询选修了同时1号和2号课程的学生姓名
  35. select sname from student
  36. where not exists (
  37. select *from course where
  38. cno in ('1','2') and not exists
  39. (select*from sc
  40. where sno= student.sno and
  41. cno =course.cno
  42. )
  43. )
  44. 1查询1001课程前3名的学生学号及成绩
  45. select top 3 sno,grade from sc
  46. where cno='1001' order by grade DESC
  47. 2查询平均分最后一名的学生学号
  48. select top 1 sno, avg(grade) from sc
  49. group by sno
  50. order by avg(grade)
  51. select sno from sc group by sno
  52. having avg(grade)=
  53. (select top 1 avg(grade) from sc)
  54. group by sno order by avg(grade))
  55. 查询JSJ系的学生或者年龄不大于19岁的学生
  56. select *from student where sdept='JSJ'
  57. UNION
  58. select *from student where Sage<=19
  59. 查询JSJ系的学生及年龄不大于19岁的学生
  60. select *from student where sdept='JSJ'
  61. interSect
  62. select *from student where sage<=19
  63. 查询JSJ系的学生及年龄不大于19岁的学生的差集
  64. select *from student where sdept='JSJ'
  65. except
  66. select *from student where sage <=19
  67. 查询全部学生都及格的课程号4种方法
  68. 1select cno from sc group by cno having min(grade)>=60
  69. 2select cno from course where cno not in
  70. (select cno from sc where grade <60)
  71. 3select cno from course where not exists
  72. (select *from sc where sc.cno=course.cno and grade<60
  73. )
  74. 4select cno from course
  75. except
  76. select cno from sc where grade<60
  77. 查询有280分以上成绩的学生学号(from的子查询)
  78. select sno from
  79. (select sno,COUNT(*) as cnt from sc where Grade>80 group by sno) as temp
  80. where cnt>2
  81. select sno cno grade
  82. case when grade>=90 then '优'
  83. case when grade>=80 then '良'
  84. case when grade>=70 then '中'
  85. case when grade>=60 then '及格'
  86. else'不及格'end
  87. from sc
  88. with 子句
  89. with Fail AS
  90. (SELECT sno,cno,from sc where Score<60)
  91. select s.sno,max(Sname)
  92. From S join Fail ON S.sno=Fail.sno
  93. group by S.Sno
  94. HAving count(*)>2
  95. 生成临时表的方法
  96. select sno,cno into #tmp1 --没有#号是永久表
  97. from SC where Score <60
  98. 查询平均分第一名的学生学号
  99. select sno,avg(grade) as avg1 into #tmpAvg from sc
  100. group by sno
  101. select sno from #tmpAvg where avg1=(
  102. select max(avg1) from #tmpAvg)
  103. 插入子查询
  104. 将每一个系的学生平均年龄存入DEPTAGE表
  105. insert into DeptAge (sdept,avgAge)
  106. select Sdept, avg(Sage)From student
  107. Group by Sdept
  108. 0001号学生的1002课程的成绩增加5
  109. update Sc set grade =grade+5
  110. where Sno='0001'And Cno='1002'
  111. 将李文庆的1001课的成绩减去10
  112. update SC set grade=grade-10
  113. where Cno='1001'And
  114. Sno=(select Sno from student Where Sname='李文庆')
  115. 0001号学生的1002课程记录删除
  116. DELETE From Sc where Sno='0001' and cno='1002'
  117. delete from sc
  118. where cno='1001' and sno=(select sno from student where sname='李文庆')
  119. 把编译原理课程的成绩都减去1分。
  120. update SC set grade=grade-1
  121. where cno in
  122. (select cno from course where cname='编译原理')
  123. 3.9-2 SQL语言(单表) 设某电子商务公司的数据库中四张基本表的结构如下(表中各属性的含义及各表的主码见第2章练习题四):
  124. Customers(Cno, Cname, Csex, Cage, Caddress, Mphone, Email),
  125. Goods(Gno, Gname, Gtype, Price, Manufac),
  126. Sells(Sno, Sdate, Saddress, Cno, IsPay), Detail(Sno, Gno, Quantity)
  127. 其中各表中各属性的含义如下,且假定在客户付款前IsPay取值为'N',付款后IsPay取值为'Y'。 客户表中的各属性分别为:客户编号,客户姓名,客户性别,客户年龄,客户地址,手机号,电子邮箱;商品表中的各属性分别为:商品编号,商品名称,商品类别,价格,生产商;销售单表中的各属性分别为:销售单号,销售日期,送货地址,客户编号,是否已付款;销售明细表中的各属性分别为:销售单号,商品编号,数量。
  128. 请用T-SQL语言实现下列要求:
  129. 4 找出“海尔”公司生产的所有商品的名称和价格,并按价格降序排列。
  130. 5. 找出“华为”公司生产的商品名称中有“手机”两字的所有商品的名称和价格。
  131. 6. 找出在售商品的品种总数。
  132. 7. 找出各大类商品中各种商品的品种数和平均价格。
  133. 8. 找出各大类商品中各种商品的平均价格大于1000元的商品类别。
  134. 正确答案:
  135. 4SELECT Gname, Price FROM Goods WHERE Manufac='海尔' ORDER BY Price DESC
  136. 5SELECT Gname, Price FROM Goods WHERE Manufac='华为' AND Gname LIKE '%手机%'
  137. 6SELECT COUNT(*) FROM Goods
  138. 7SELECT Gtype, COUNT(*), AVG(Price) FROM Goods GROUP BY Gtype
  139. 8SELECT Gtype FROM Goods GROUP BY Gtype HAVING AVG(Price)>1000
  140. 查询每门课都及格的课程号
  141. 标准答案:select cno from sc group by sno having min(grade)>60
  142. 我的答案:
  143. select DISTINCT cno
  144. from sc
  145. except
  146. select DISTINCT cno
  147. from SC
  148. where grade<60
  149. 3.18设有关系R(A, B)和S(B, C),则下列SQL查询语句中必定含有语法错误的是( )。
  150. A、SELECT A,B FROM R GROUP BY A --group 后面没有B,所以select不能有B
  151. B、SELECT A,B FROM R,S WHERE R.A=S.C -- select 后面应是S.B或R.B
  152. C、I SELECT COUNT(B) FROM R
  153. D、SELECT A FROM R WHERE B>=MAX(B) --where 语句里不能有MAX
  154. 19使用带有IN谓词的子查询时,子查询的SELECT子句中最多可以指定( )个列。
  155. A、1
  156. B、2
  157. C、3
  158. D、任意多
  159. 选A
  160. 3.20使用嵌套查询时,当子查询的SELECT子句中出现多个列时,可以使用( )运算符。
  161. A、=
  162. B、>=
  163. C、EXISTS
  164. D、IN
  165. 选C A\B\D均为一列
  166. 3.9-3 SQL语言(连接)设某电子商务公司的数据库中四张基本表的结构如下(表中各属性的含义及各表的主码见第2章练习题四):
  167. Customers(Cno, Cname, Csex, Cage, Caddress, Mphone, Email),
  168. Goods(Gno, Gname, Gtype, Price, Manufac),
  169. Sells(Sno, Sdate, Saddress, Cno, IsPay), Detail(Sno, Gno, Quantity)
  170. 其中各表中各属性的含义如下,且假定在客户付款前IsPay取值为'N',付款后IsPay取值为'Y'
  171. 客户表中的各属性分别为:客户编号,客户姓名,客户性别,客户年龄,客户地址,手机号,电子邮箱;商品表中的各属性分别为:商品编号,商品名称,商品类别,价格,生产商;销售单表中的各属性分别为:销售单号,销售日期,送货地址,客户编号,是否已付款;销售明细表中的各属性分别为:销售单号,商品编号,数量。
  172. 请用T-SQL语言实现下列要求:
  173. 9 找出20155月份的所有未付款的销售单的编号、客户编号、客户姓名和手机号。
  174. select Sno,S,Cno Cname,Mphone
  175. from sells S join cusotmers c on s.cno=c.cno
  176. where Ispay='N'and sdate between'2015-05-01' and '2015-05-31'
  177. 10.找出每一个客户的编号、姓名、手机号以及他每次购物的日期和是否已付款信息,即使该客户没有购买过商品,也要输出他的编号、姓名和手机号。
  178. select C.cno,cname,Mphone,Sdate,IsPay from Customers C left join sells S on C.cno=S.cno
  179. 11.找出每一张销售单的销售单号、销售日期、客户姓名和销售单总金额。
  180. select S.sno,max(sdate),max(cname),sum(quanity*price)
  181. from sells S,cusotmers C,Detail D,Goods G
  182. where s.cno=c.cno and s.sno=d.sno and d.gno=g.gno
  183. group by s.sno
  184. 12.找出“TP-LINK”公司生产的商品名为“WR700N无线路由器”的销售总数量。
  185. select sum(quantity) from detail D join Goods G on d.Gno=G.Gno
  186. where Manfac='TP-LINk'and Gname='WR700N无线路由器'
  187. 另一种做法:
  188. select sum(quanity) from detail where Gno In(select Gno from goods where manufac='TP-LINK'and Gname='WR700N无线路由器')
  189. 12找出“TP-LINK”公司生产的各种商品的销售总数量。
  190. select detail.gno,sum(quantity)
  191. from detail join goods on detail.gno=goods.gno
  192. where Manufac='TP-LINK'
  193. group by detail.gno
  194. 12找出每一个公司的各种商品的销售总数量。
  195. select manufac,detail.gno,sum(quantity)
  196. from detail join goods on detail.gno=goods.gno
  197. group manufac,detail.gno
  198. .9-4 SQL语言(嵌套、并交差) 设某电子商务公司的数据库中四张基本表的结构如下(表中各属性的含义及各表的主码见第2章练习题四):
  199. Customers(Cno, Cname, Csex, Cage, Caddress, Mphone, Email),
  200. Goods(Gno, Gname, Gtype, Price, Manufac),
  201. Sells(Sno, Sdate, Saddress, Cno, IsPay), Detail(Sno, Gno, Quantity)
  202. 其中各表中各属性的含义如下,且假定在客户付款前IsPay取值为'N',付款后IsPay取值为'Y'
  203. 客户表中的各属性分别为:客户编号,客户姓名,客户性别,客户年龄,客户地址,手机号,电子邮箱;商品表中的各属性分别为:商品编号,商品名称,商品类别,价格,生产商;销售单表中的各属性分别为:销售单号,销售日期,送货地址,客户编号,是否已付款;销售明细表中的各属性分别为:销售单号,商品编号,数量。
  204. 请用T-SQL语言实现下列要求:
  205. 13.找出仅仅注册但至今还没有购买过商品的客户编号。
  206. select cno from customers where cno=not in (select cno from sells)
  207. select cno from customers
  208. except select cno from sells
  209. 14.找出201511日以后没有购买过商品的客户编号、客户姓名和手机号。
  210. select cno,cname,mphone from cusotmers
  211. where cno not in (select cno from sells where sdate>'2015-01-01')
  212. 15.找出同类商品中价格最低的商品编号、商品名称和生产商。
  213. select gno ,gname,manufac from goods A where price=(
  214. select min(price)from goods B where B.Gtype=A.Gtype)
  215. 16.找出销售数量最多的商品的名称、价格和生产商。
  216. select gname ,price,manufac,from goods where gno in (
  217. select gno from detail group by gno having sum(quantity)>=all(
  218. select sum(quanity)from detail group by gno)
  219. )
  220. 或用top语句
  221. select gno from detail group by having sum(quantity)=(
  222. select TOP 1 sum(quantity) from detail group by gno order by sum(quantity)desc)
  223. 17.找出同一张销售单中既有140010123号商品又有150020234号商品的所有销售单号。
  224. select sno from detail where gno='140010123'
  225. interSect
  226. select sno from detail where gno='150020234'
  227. select sno from detail d where gno='140010123' and exists(
  228. select *from detail where sno=d.sno and gno='150020234'
  229. )
  230. select sno from detail where gno='140010123' and sno in (
  231. select sno from detail where gno ='150020234')
  232. select sno from sells where not exists(
  233. select *from goods where gno in ('140010123','150020234') and not exists(
  234. select* from detail where detail.gno =goods.gno and detail.sno=sells.sno)
  235. )
  236. 18.找出购买过“奶粉”类商品中所有品种奶粉的客户编号。
  237. select sno from sells where not exists(
  238. select *from goods where gtype='奶粉'and not exists(
  239. select* from detail where detail.gno =goods.gno and detail.sno=sells.sno)
  240. )
  241. 19.FROM子句中使用子查询,重做第15题中的查询要求。
  242. 3.9-5 SQL语言(insert,update) 设某电子商务公司的数据库中四张基本表的结构如下(表中各属性的含义及各表的主码见第2章练习题四):
  243. Customers(Cno, Cname, Csex, Cage, Caddress, Mphone, Email),
  244. Goods(Gno, Gname, Gtype, Price, Manufac),
  245. Sells(Sno, Sdate, Saddress, Cno, IsPay), Detail(Sno, Gno, Quantity)
  246. 其中各表中各属性的含义如下,且假定在客户付款前IsPay取值为'N',付款后IsPay取值为'Y'
  247. 客户表中的各属性分别为:客户编号,客户姓名,客户性别,客户年龄,客户地址,手机号,电子邮箱;商品表中的各属性分别为:商品编号,商品名称,商品类别,价格,生产商;销售单表中的各属性分别为:销售单号,销售日期,送货地址,客户编号,是否已付款;销售明细表中的各属性分别为:销售单号,商品编号,数量。
  248. 请用T-SQL语言实现下列要求:
  249. 20.将商品表中“手机”类商品中所有品种手机的价格降价5%
  250. UPDATE Goods SET Price=0.95*Price WHERE Gtype='手机'
  251. 21.删除商品表中商品编号为110050111的商品。
  252. DELETE FROM Goods WHERE Gno='110050111'
  253. 22.在商品表中添加一种新商品('150050111', 'P8手机', '手机', 2499, '华为')。
  254. insert into goods (Gno,Gname,Gtype,Price,Manufac)
  255. values('150050111', 'P8手机', '手机', 2499, '华为')
  256. 7.5.1 上机实验题:第二部分 实验七:数据查询 临时表,case。表为student,sc,course 表。
  257. 1、查询学生的学号、课程号、成绩等地,成绩等地按如下规定: 95以上 A+, 90-95 A,
  258. 85-89 B+, 80-84 B, 75-79 C+, 70-74 C,65-69 D+,60-64 D,60分以下 F。
  259. select sno,cno,grade,
  260. case when grade>=95 then 'A+'
  261. when grade>=90 then 'A'
  262. when grade>=85 then 'B+'
  263. when grade>=80 then 'B'
  264. when grade>=75 then 'C+'
  265. when grade>=70 then 'C'
  266. when grade>=65 then 'D+'
  267. when grade>=60 then 'D'
  268. else '不及格' end
  269. from sc
  270. 2、查询每个系科男女生的比率(如男20人,女 40,则是20/40=0.5使用临时表)。
  271. select sdept count(*) as cnt1 into #tmp1 from student where ssex='男' group by sdept
  272. select sdept count(*) as cnt2 into #tmp2 from student where ssex='女' group by sdept
  273. select #temp1.sdept,1.0*cnt1/cnt2 from #tmp1 join #tmp2 on #tmp1.sdept=#tmp2.sdept
  274. 或者:
  275. select sdept sum(case when Ssex='男' then 1 else 0 end)*1.0/sum (case when Ssex='女' then 1 else 0 end )
  276. from student
  277. group by sdept
  278. 6.1 上机实验题:第二部分 实验六: 数据更新 insert。表为student,sc,course 表。
  279. insert
  280. 1 写出把下述学生的信息添加到student表中的命令。
  281. 学号 姓名 性别 年龄 系科
  282. 4001 赵茵 男 20 SX
  283. 4002 杨华 女 21
  284. 我的答案:
  285. insert into student (Sno,Sname,Ssex,Sage,Sdept)
  286. values('4001', '赵茵', '男', 20, 'SX', null)
  287. values('4002', '杨华', '女', 21, null,null)
  288. 6.2 上机实验题:第二部分 实验六: 数据更新 insert。表为student,sc,course 表。
  289. insert
  290. 2 批量插入数据
  291. 1) 建立一个新表 sc_name ,有属性 sno , sname , ssex , cno , grade ,数据类型参照student,sc 表。
  292. 2) 把 SX 系学生的sno,sname,ssex, cno , grade 插入到新表 sc_name 中。
  293. 3) 察看 sc_name 表的数据
  294. 我的答案:
  295. 1) 建立一个新表 sc_name ,有属性 sno , sname , ssex , cno , grade ,数据类型参照student,sc 表。
  296. create table sc_name (
  297. Sno ud_sno ,
  298. Sname char(10) not null unique ,
  299. Ssex char(2) check (ssex='男' or ssex='女') ,
  300. Cno char(4) ,
  301. Grade int check(grade<=100) ,
  302. primary key (sno)
  303. )
  304. 2) 把 SX 系学生的sno,sname,ssex, cno , grade 插入到新表 sc_name 中。
  305. insert into sc_name
  306. select sno,sname,ssex from student
  307. insert into sc_name
  308. select cno from course
  309. insert into sc_name
  310. select grade from sc
  311. 3) 察看 sc_name 表的数据
  312. select *
  313. from sc_name
  314. 6.3 上机实验题:第二部分 实验六: 数据更新 update。 表为student,sc,course 表。
  315. Update
  316. 1 修改 0001 学生的系科为: JSJ
  317. 2 把陈小明的年龄加1岁,性别改为女。
  318. 2 修改李文庆的1001课程的成绩为 93
  319. 3 把“数据库原理”课的成绩减去1
  320. 我的答案:
  321. 1 修改 0001 学生的系科为: JSJ
  322. update student set Sdept='JSJ'
  323. where Sno='0001'
  324. 2 把陈小明的年龄加1岁,性别改为女。
  325. update student set sage=sage+1
  326. where Sname='陈小明'
  327. update student set Ssex='女'
  328. where Sname='陈小明'
  329. 2 修改李文庆的1001课程的成绩为 93
  330. update sc set grade='93'
  331. where Sno=(select sno from student where sname='李文庆')
  332. 3 把“数据库原理”课的成绩减去1
  333. update sc set grade=grade-1
  334. where Cno in (select cno from course where cname='数据库原理')
  335. 6.4 上机实验题:第二部分 实验六: 数据更新 delete。 表为student,sc,course 表。
  336. Delete
  337. 1 删除所有 JSJ 系的男生
  338. 2 删除“数据库原理”的课的选课纪录
  339. 我的答案:
  340. 1 删除所有 JSJ 系的男生
  341. delete from Student
  342. where sdept='JSJ' and ssex='男'
  343. 2 删除“数据库原理”的课的选课纪录
  344. delete from SC
  345. where Cno='数据库原理'
  346. 上机实验题:第二部分 实验一、实验二、实验三。做完实验,把所有命令写到脚本文件保存,文件名自定。
  347. 3.12-2 上机实验题:第二部分 实验七: 一、单表,把所有命令写到脚本文件保存,文件名自定。 表为student,sc,course 表。
  348. 1查询年龄在1921岁之间的女生的学号,姓名,年龄,按年龄从大到小排列。
  349. 2查询姓名中第2个字为“明”字的学生学号、性别。
  350. 3查询 1001课程没有成绩的学生学号、课程号
  351. 4查询JSJ 、SX、WL 系的年龄大于25岁的学生学号,姓名,结果按系及学号排列
  352. 510分制查询学生的sno,cno,10分制成绩
  353. (1-10分 为1 ,11-20分为2 ,30-39分为3,。。。90-10010)
  354. 6查询 student 表中的学生共分布在那几个系中。(distinct)
  355. 7查询0001号学生1001,1002课程的成绩。
  356. 3.12-3 上机实验题:第二部分 实验七:二、统计,把所有命令写到脚本文件保存,文件名自定。 表为student,sc,course 表。
  357. 1查询姓名中有“明”字的学生人数。
  358. 2计算‘JSJ’系的平均年龄及最大年龄。
  359. 3查询学生中姓名为张明、赵英的人数
  360. select sname,count(*) from student
  361. where sname in('张明','赵英') group by sname
  362. 4计算每一门课的总分、平均分,最高分、最低分,按平均分由高到低排列
  363. 5 计算 1001,1002 课程的平均分。
  364. 6 查询平均分大于80分的学生学号及平均分
  365. 7 统计选修课程超过 2 门的学生学号
  366. 8 统计有10位成绩大于85分以上的课程号。
  367. 9 统计平均分不及格的学生学号
  368. select sc.sno from student join sc on student.sno=sc.sno
  369. group by sc.sno having avg(grade)<60
  370. 10 统计有大于两门课不及格的学生学号
  371. 3.12-4 上机实验题:第二部分 实验七:三、连接,把所有命令写到脚本文件保存,文件名自定。 表为student,sc,course 表。
  372. 1查询 JSJ 系的学生选修的课程号
  373. 2查询选修1002 课程的学生的学生姓名 (不用嵌套及嵌套2种方法)
  374. 3查询数据库原理不及格的学生学号及成绩
  375. 4查询选修“数据库原理”课且成绩 80 以上的学生姓名(不用嵌套及嵌套2种方法)
  376. 5查询平均分不及格的学生的学号,姓名,平均分。
  377. select sc.sno,min(sname),avg(grade) from student join sc on student.sno=sc.sno
  378. group by sc.sno having avg(grade)<60
  379. 6查询女学生平均分高于75分的学生姓名。
  380. 7查询男学生学号、姓名、课程号、成绩。(一门课程也没有选修的男学生也要列出,不能遗漏)
  381. 3.12-5 上机实验题:第二部分 实验七:四、嵌套、相关及其他,把所有命令写到脚本文件保存,文件名自定。 表为student,sc,course 表。
  382. 1 查询平均分不及格的学生人数
  383. select count(*) from student where sno in (
  384. select sno from sc group by sno having avg(grade)<60
  385. )
  386. 2 查询没有选修1002 课程的学生的学生姓名
  387. 3 查询平均分最高的学生学号及平均分 (2种方法 TOP , any , all)
  388. 4查询同时选修了1001,1002课程的学生姓名。
  389. *5 查询没有选修1001,1002课程的学生姓名。
  390. 6 查询大于1001课程平均分的学生学号
  391. 7 查询1002课程第一名的学生学号(2种方法)
  392. 8 查询平均分前三名的学生学号
  393. 9 查询 JSJ 系的学生与年龄不大于19岁的学生的差集
  394. 10 查询1001号课程大于90分的学生学号、姓名及平均分大于85分的学生学号、姓名
  395. 11 查询每门课程成绩都高于该门课程平均分的学生学号
  396. 所有学号 (查询有低于课程平均分的学生学号)
  397. select sno from student
  398. except
  399. select sno from sc A where grade<(
  400. select avg(grade) from sc B where B.cno=A.cno)
  401. select sno from student where sno not in (
  402. select sno from sc A where grade<(
  403. select avg(grade) from sc B where B.cno=A.cno)
  404. )
  405. 12 查询大于本系科平均年龄的学生姓名
  406. 13 查询1001课程第三名的学生学号
  407. 前三名-前两名
  408. select top 3 sno from sc where cno='1001' order by grade desc
  409. except
  410. select top 2 sno from sc where cno='1001' order by grade desc
  411. *14 查询每个学生的学号、姓名、系科,系科用中文显示。JSJ 显示 计算机,SX 显示 数学,WL 显示 物理, 否则显示 其他
  412. 建立JSJ系的学生的视图
  413. create view student_jsj AS
  414. select Sno,Sname,Sage From student
  415. where Sdept ='JSJ'
  416. 建立一个反映学生出生年份的视图
  417. create view student_birth AS
  418. select Sno,Sname,2000-Sage as birth FROM
  419. 建立学生各系科平均年龄的视图
  420. create view V_1 (Sdept,average) AS
  421. select Sdept,AVG(sage) from student
  422. group by sdept
  423. update student_jsj Set Sage=21
  424. where Sname ='李文庆'
  425. 若李文庆不是计算机学生
  426. create View student_jsj AS
  427. select Sno,Sname,Sage,From student
  428. where Sdept='JSJ'
  429. with check option
  430. (with check option)拥有这句 若李文庆不是计算机学生不能更改
  431. 查询每门课的及格率@
  432. create view v1(cno,cntAll)as
  433. select cno,count(*)from sc
  434. group by cno
  435. create view v2(cno,cnt60)as
  436. select cno,count(*)from sc
  437. where grade >=60
  438. group by cno
  439. select v1.cno,1.0*cnt60/cntAll
  440. from v1 join v2 on v1.cno=v2.cno
  441. 临时表方法
  442. Cast 方法
  443. 例一:把查询student的权限授予用户U1
  444. grant select
  445. on (table) student TO U1
  446. 例二:把对student、course表的selectupdateinsert权限授予用户U2,U3
  447. Grant select,insert,update
  448. on (table) student,course TO U2,U3
  449. 例三:把查询student表和修改学生学号的权限授予用户U4
  450. grant select ,update(Sno)
  451. on (table) student TO U4
  452. 4.8 SQL语言,下列各题中所涉及到的基本表的结构见第3章练习题四。
  453. Customers(Cno, Cname, Csex, Cage, Caddress, Mphone, Email),
  454. Goods(Gno, Gname, Gtype, Price, Manufac),
  455. Sells(Sno, Sdate, Saddress, Cno, IsPay), Detail(Sno, Gno, Quantity)
  456. 1. 对Customers表的客户名按升序创建一个非聚集索引。
  457. create INDEX index_Customers_Cname ON Customers(Cname)
  458. 2. 对Goods表按商品类别升序和价格升序创建一个复合非聚集索引。
  459. CREATE INDEX index Goods GtypePrice ON Goods(Gtype,Price)
  460. 3. 对Sells表按客户编号升序和销售日期降序创建一个复合非聚集索引。
  461. CREATE INDEX index_Sells_CnoSdate ON Sells (Cno,Sdate,DESC)
  462. 4. 定义一个名为GoodsPhone的视图,该视图只包含“手机”大类商品的商品信息。
  463. CREATE VIEW GoodsPhone
  464. AS SELECT * From Goods Where Gtype='手机'
  465. 5. 在视图GoodsPhone的基础上定义一个名为GoodsPhoneHuaWei的视图,该视图只包含“华为”公司生产的手机类商品的商品信息。
  466. Create view goods where
  467. 6. 定义一个名为SellsQuantity的视图,该视图有4列,分别是商品的名称、价格、生产商和该商品的销售总数量(销售总数量用Squantity表示)。
  468. create view SellsQuantity (Gname,Price,Manufac,Squantity) AS
  469. Select Gname,min(Price),min(Manufac),sum(quantity)
  470. From Goods,detail,where Goods,Gno=Detail.Gno
  471. Group by gname,price,manufac
  472. 7. 利用第6题中定义的视图,找出销售数量最多的商品的名称、价格和生产商。
  473. select Gname ,Price,Manufac from sellsQuantity
  474. where Squantity>=all(select Squantity FROM sellsQuantity)
  475. select Gname,Price,Manufac from sellsQuantity
  476. where Squantity =(select max(squantity) from sellsQuantity)
  477. select gname ,price,manufac from sellsQuantity
  478. where squantity=(select top 1 squantity )from sellsQuantity order by squantity desc
  479. 8. 定义一个名为SellsMoney的视图,该视图有6列,分别是销售单号、销售日期、客户姓名、客户性别、客户年龄和该销售单总金额(销售单总金额用Smoney表示)。
  480. create view sellsMoney(sno,sdate,cname,csex,cage,sMoney)
  481. select sells.sno,sdate,cname,csex,cage,sum(quantity*price )
  482. from sells,detail,goods,customers
  483. where sells.sno=detail.sno and customers.cno=sells.cno and goods.gno=detail.gno
  484. group by sells.sno,sdate,cname,csex,cage
  485. 9. 利用第8题中定义的视图,找出2014年全年的购买总金额超过10000元的客户的姓名、性别和年龄。
  486. select cname,min(csex),min (cage)
  487. from sellsMoney where sdate between '2014-1-1'and'2014-12-31'
  488. group by cname having sum(sMoney)>10000
  489. 10.在视图GoodsPhone中添加一种新商品('150050111', 'P8手机', '手机', 2499, '华为')。
  490. insert into goodsphone(Gno,Gname,Gtype,price,Manufac)
  491. values('150050111','P8手机','手机''2499','华为')
  492. 一.简答题(共3题,100.0分)
  493. 1
  494. 13.1 在School 数据库上完成实验,理解 rollback
  495. 1输入下列语句并执行 ,记录该学生的年龄。
  496. Select * from student where sno=0001
  497. 答:
  498. 2 执行下列语句序列A:
  499. BEGIN TRANsaction
  500. Update student set sage=sage+1 where sno=0001
  501. Select * from student where sno=0002
  502. 此事务结束了吗?
  503. 答:
  504. 3 执行:
  505. Select * from student where sno=0001
  506. 记录该学生的年龄。
  507. 思考:student 中的0001的年龄确实被更改了吗? 为什么?
  508. 答:
  509. 4 执行下列语句。
  510. ROLLBACK TRANsaction
  511. 然后再执行:
  512. Select * from student where sno=0001
  513. , 观察0001的年龄, 解释发生这种现象的原因。
  514. 答:
  515. 正确答案:
  516. 一、1 答:21 (每个人可能不同)
  517. 2 答:事务没有执行 commitrollback ,所以没有结束。
  518. 3 答:22 ,0001的年龄增加了1岁。
  519. 4 答:21 ,回滚后,数据恢复。
  520. 213.2 在School 数据库上完成实验,理解 commit
  521. 1在查询分析器输入下列语句并执行 ,记录该学生的年龄。
  522. Select * from student where sno=0001
  523. 答:
  524. 2 执行下列 语句序列A:
  525. BEGIN TRANsaction
  526. Update student set sage=sage+1 where sno=0001
  527. Select * from student where sno=0002
  528. 3执行:
  529. commit transaction
  530. Select * from student where sno=0001
  531. 记录结果, 此时更改后的数据被永久保存了吗?
  532. 答:
  533. 正确答案:
  534. 1 答:21
  535. 3 答:22
  536. 314.1 在School 数据库上完成实验,理解锁的概念及锁的作用
  537. 一 利用帮助系统了解Sql-server 的下列语句的含义
  538. 1 设置锁的隔离级别
  539. SET TRANSACTION ISOLATION LEVEL Serializable
  540. 执行这个语句的效果?
  541. 答:
  542. 二 观察封锁
  543. 1 执行语句序列A
  544. BEGIN TRANsaction
  545. Update student set sage=sage+1 where sno=0001
  546. Select * from student where sno=0002
  547. 2 在SSMS中打开第二个连接(连接 school)[文件-连接], 输入下列语句:
  548. 1) select * from student where sno=0002
  549. 记录执行结果,说明原因。
  550. 答:
  551. 2select * from student where sno=0001
  552. 记录执行结果,说明原因。(如上一步没有停止,则强行终止)
  553. 答:
  554. 执行 select * from student with(nolock) where sno=0001
  555. 记录执行结果,说明原因。(如上一步没有停止,则强行终止)
  556. 答:
  557. 3) update student set sname=’aaa’ where sno=0002
  558. 记录执行结果,说明原因。(如上一步没有停止,则强行终止)
  559. 答:
  560. 4) 强行终止上一步的命令,然后执行语句:
  561. DBCC opentran
  562. 记录结果 ,思考:如何知道此事务是那一台计算机发出的?
  563. 答:
  564. 5)执行:
  565. select * from student where sno=0001
  566. 记录执行结果,说明原因
  567. 答:
  568. 然后回到第一个连接中,执行语句:
  569. commit Tran
  570. 观察并记录第二个连接窗口中的现象,说明原因
  571. 答:
  572. 正确答案:
  573. 0001加了X锁,0002 加了S锁。
  574. 一、1 本语句,封锁协议达到三级封锁协议,并且解决幻影读。
  575. /2
  576. 1) 答:能查到0002 学生信息,S锁上可以加S锁。
  577. 2)答:等待解锁,无法查询到数据。因为X锁上不能加 s 锁。
  578. 可以执行,能查到数据。
  579. 3) 答:无法完成更新操作,因为 S锁上不能加X锁。
  580. 4) 答:发现有一个事务活动得。
  581. 5)答: 等待中 0001解锁,无法完成查询
  582. 答:马上看到0001 的信息。
  583. 2.1 按步骤执行:
  584. 一 完全备份的建立与恢复
  585. 1建立完全备份
  586. USE school
  587. GO
  588. BACKUP DATABASE school TO DISK='E:\SQL Server Management Studio\schooldata.bak'
  589. 查看备份是否生成?
  590. 2查看备份文件中的信息
  591. RESTORE HEADERONLY FROM DISK='E:\SQL Server Management Studio\schooldata.bak'
  592. 看到了什么?
  593. 3恢复完全备份
  594. 1) 先删除数据库 School
  595. USE Master
  596. GO
  597. DROP DATABASE school
  598. 2) 然后恢复.
  599. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schooldata.bak'
  600. 3): 查看 school 的student 中的数据
  601. 二 建立差异备份
  602. 1 建立备份
  603. 1) 制作数据文件备份 schoolDiff.bak
  604. 2) 把学号 7001, 姓名:王海,性别:男,年龄为23 的学生加入student
  605. 3) 制作school 的差异备份 ,存入schoolDiff.bak
  606. BACKUP DATABASE school TO DISK='schoolDiff.bak' WITH DIFFERENTIAL
  607. 4) 把学号 7002, 姓名:赵燕,性别:女,年龄为22 的学生加入student
  608. 5) 制作school 的差异备份 ,存入schoolDiff.bak
  609. BACKUP DATABASE school TO DISK='schoolDiff.bak' WITH DIFFERENTIAL
  610. 2查看备份文件 schoolDiff.bak 中的信息
  611. 3 删除 school 数据库
  612. 4 恢复数据库 school 到第2步状态
  613. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schoolDiff.bak'WITH file=1 NORECOVERY
  614. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schoolDiff.bak'WITH file=2
  615. Select * from student
  616. 观察student 数据
  617. 5 恢复数据库 school 到最新状态
  618. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schoolDiff.bak'WITH file=1 NORECOVERY
  619. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schoolDiff.bak'WITH file=3
  620. Select * from student
  621. 观察student 数据,新增的两人是否存在。
  622. 答:
  623. 思考: 如果仅执行下述恢复语句,能查看 student 的数据吗?
  624. RESTORE DATABASE school from DISK='E:\SQL Server Management Studio\schoolDiff.bak'WITH file=1 NORECOVERY
  625. Select * from student
  626. 不能 norecovery 还需要恢复差异备份或日志备份,数据库还需要恢复数据
  627. recovery 表示恢复到正常状态
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/422145
推荐阅读
相关标签
  

闽ICP备14008679号