SQL课后题答案整理
SQL经典习题及答案(新手必看)

Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;select a.S# from (select s#,score from SC where C#='001') a,(select s#,scorefrom SC where C#='002') bwhere a.score>b.score and a.s#=b.s#;2、查询平均成绩大于60分的同学的学号和平均成绩;select S#,avg(score)from scgroup by S# having avg(score) >60;3、查询所有同学的学号、姓名、选课数、总成绩;select Student.S#,Student.Sname,count(SC.C#),sum(score)from Student left Outer join SC on Student.S#=SC.S#group by Student.S#,Sname4、查询姓“李”的老师的个数;select count(distinct(Tname))from Teacherwhere Tname like '李%';5、查询没学过“叶平”老师课的同学的学号、姓名;select Student.S#,Student.Snamefrom Studentwhere S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;select S#,Snamefrom Studentwhere S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平'));8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;9、查询所有课程成绩小于60分的同学的学号、姓名;select S#,Snamefrom Studentwhere S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);10、查询没有学全所有课的同学的学号、姓名;select Student.S#,Student.Snamefrom Student,SCwhere Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;select distinct SC.S#,Snamefrom Student,SCwhere Student.S#=SC.S# and C# in (select C# from SC where S#='001');13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;update SC set score=(select avg(SC_2.score)from SC SC_2where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;select S# from SC where C# in (select C# from SC where S#='1002')group by S# having count(*)=(select count(*) from SC where S#='1002');15、删除学习“叶平”老师课的SC表记录;Delect SCfrom course ,Teacherwhere Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、号课的平均成绩;Insert SC select S#,'002',(Select avg(score)from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分SELECT S# as 学生ID,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩FROM SC AS tGROUP BY S#ORDER BY avg(t.score)18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分FROM SC L ,SC AS RWHERE L.C# = R.C# andL.score = (SELECT MAX(IL.score)FROM SC AS IL,Student AS IMWHERE L.C# = IL.C# and IM.S#=IL.S#GROUP BY IL.C#)ANDR.Score = (SELECT MIN(IR.score)FROM SC AS IRWHERE R.C# = IR.C#GROUP BY IR.C#);19、按各科平均成绩从低到高和及格率的百分数从高到低顺序SELECT t.C# AS 课程号,max(ame)AS 课程名,isnull(AVG(score),0) AS 平均成绩,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数FROM SC T,Coursewhere t.C#=course.C#GROUP BY t.C#ORDER BY 100* SUM(CASE WHEN isnull(score,0)>=60THEN 1ELSE 0END)/COUNT(*) DESC20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数FROM SC21、查询不同老师所教不同课程平均分从高到低显示SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(ame) AS 课程名称,AVG(Score) AS 平均成绩FROM SC AS T,Course AS C ,Teacher AS Zwhere T.C#=C.C# and C.T#=Z.T#GROUP BY C.C#ORDER BY AVG(Score) DESC22、查询如下课程成绩第3名到第6名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩SELECT DISTINCT top 3SC.S# As 学生学号,Student.Sname AS 学生姓名,T1.score AS 企业管理,T2.score AS 马克思,T3.score AS UML,T4.score AS 数据库,ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分FROM Student,SC LEFT JOIN SC AS T1ON SC.S# = T1.S# AND T1.C# = '001'LEFT JOIN SC AS T2ON SC.S# = T2.S# AND T2.C# = '002'LEFT JOIN SC AS T3ON SC.S# = T3.S# AND T3.C# = '003'LEFT JOIN SC AS T4ON SC.S# = T4.S# AND T4.C# = '004'WHERE student.S#=SC.S# andISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)NOT IN(SELECTDISTINCTTOP 15 WITH TIESISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) FROM scLEFT JOIN sc AS T1ON sc.S# = T1.S# AND T1.C# = 'k1'LEFT JOIN sc AS T2ON sc.S# = T2.S# AND T2.C# = 'k2'LEFT JOIN sc AS T3ON sc.S# = T3.S# AND T3.C# = 'k3'LEFT JOIN sc AS T4ON sc.S# = T4.S# AND T4.C# = 'k4'ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]SELECT SC.C# as 课程ID, Cname as 课程名称,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85],SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70],SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60],SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] FROM SC,Coursewhere SC.C#=Course.C#GROUP BY SC.C#,Cname;24、查询学生平均成绩及其名次SELECT 1+(SELECT COUNT( distinct 平均成绩)FROM (SELECT S#,AVG(score) AS 平均成绩FROM SCGROUP BY S#) AS T1WHERE 平均成绩> T2.平均成绩) as 名次,S# as 学生学号,平均成绩FROM (SELECT S#,AVG(score) 平均成绩FROM SCGROUP BY S#) AS T2ORDER BY 平均成绩desc;25、查询各科成绩前三名的记录:(不考虑成绩并列情况)SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数FROM SC t1WHERE score IN (SELECT TOP 3 scoreFROM SCWHERE t1.C#= C#ORDER BY score DESC)ORDER BY t1.C#;26、查询每门课程被选修的学生数select c#,count(S#) from sc group by C#;27、查询出只选修了一门课程的全部学生的学号和姓名select SC.S#,Student.Sname,count(C#) AS 选课数from SC ,Studentwhere SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; 28、查询男生、女生人数Select count(Ssex) as 男生人数from Student group by Ssex having Ssex='男';Select count(Ssex) as 女生人数from Student group by Ssex having Ssex='女';29、查询姓“张”的学生名单SELECT Sname FROM Student WHERE Sname like '张%';30、查询同名同性学生名单,并统计同名人数select Sname,count(*) from Student group by Sname having count(*)>1;;31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)select Sname, CONVERT(char (11),DATEPART(year,Sage)) as agefrom studentwhere CONVERT(char(11),DATEPART(year,Sage))='1981';32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩select Sname,SC.S# ,avg(score)from Student,SCwhere Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数Select Sname,isnull(score,0)from Student,SC,Coursewhere SC.S#=Student.S# and SC.C#=Course.C# and ame='数据库'and score <60;35、查询所有学生的选课情况;SELECT SC.S#,SC.C#,Sname,CnameFROM SC,Student,Coursewhere SC.S#=Student.S# and SC.C#=Course.C# ;36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;SELECT distinct student.S#,student.Sname,SC.C#,SC.scoreFROM student,ScWHERE SC.score>=70 AND SC.S#=student.S#;37、查询不及格的课程,并按课程号从大到小排列select c# from sc where scor e <60 order by C# ;38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80and C#='003';39、求选了课程的学生人数select count(*) from sc;40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩select Student.Sname,scorefrom Student,SC,Course C,Teacherwhere Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );41、查询各个课程及相应的选修人数select count(*) from sc group by C#;42、查询不同课程成绩相同的学生的学号、课程号、学生成绩select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;43、查询每门功成绩最好的前两名SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数FROM SC t1WHERE score IN (SELECT TOP 2 scoreFROM SCWHERE t1.C#= C#ORDER BY score DESC)ORDER BY t1.C#;44、统计每门课程的学生选修人数(超过10人的课程才统计)。
大三sql课后习题答案

大三sql课后习题答案第二章3.上机练习题02 程序代码如下:STUDENT1 DATABASE CREATE ON PRIMARY (NAME= STUDENT1_data, FILENAME='E:\DATA\', SIZE=3,MAXSIZE=unlimited, FILEGROWTH=15%)LOG ON(NAME= STUDENT1_log, FILENAME='E:\DATA\', SIZE=2,MAXSIZE=30, FILEGROWTH=2)03 程序代码如下:create database studentson primary(name=students1,filename='E:\DATA\',size=5,maxsize=75,filegrowth=10%),(name= students12,filename='E:\DATA\',size=10,maxsize=75,filegrowth=1)log on(name=studentslog1, filename='E:\DATA\',size=5,maxsize=30,filegrowth=1),(name=studentslog2, filename='E:\DATA\',,5=sizemaxsize=30,filegrowth=1)第三章:3 上机练习题01 程序代码如下:--创建表book的Transact-SQL语句:USE test01GOCREATE TABLE book(book_id nchar(6)NOT NULL,book_name nchar(30 )NULL,price numeric(10, 2)NULL,CONSTRAINT PK_book PRIMARY KEY CLUSTERED(book_id ASC))ON PRIMARY--创建表uthor的Transact-SQL语句:CREATE TABLE(anthor_name nchar(4)NOT NULL,book_id nchar(6)NOT NULL,address nchar(30)NOT NULL)ON [PRIMARY]--设置book中的book_id为主键,author表中的book_id为外键ALTER TABLE WITH CHECKADD CONSTRAINT FK_ book_author FOREIGN KEY(book_id) REFERENCES(book_id)02 程序代码如下:--利用Transact-SQL语句创建表booksales的代码。
数据库sql课后练习题及答案解析

先创建下面三个表:(book表)(borrow表)(reader表)1) 找出姓李的读者姓名(NAME)和所在单位(COMPANY)。
2) 列出图书库中所有藏书的书名(BOOK_NAME)及出版单位(OUTPUT)。
3) 查找“高等教育出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按单价降序排序。
4) 查找价格介于10元和20元之间的图书种类(SORT),结果按出版单位(OU TPUT)和单价(PRICE)升序排序。
5) 查找书名以”计算机”开头的所有图书和作者(WRITER)。
6) 检索同时借阅了总编号(BOOK_ID)为和两本书的借书证号(READER_ID)。
##7)* 查找所有借了书的读者的姓名(NAME)及所在单位(COMPANY)。
8)* 找出李某所借所有图书的书名及借书日期(BORROW_DATE)。
9)* 无重复地查询2006年10月以后借书的读者借书证号(READER_ID)、姓名和单位。
##10)* 找出借阅了<FoxPro大全>一书的借书证号。
11) 找出与”赵正义”在同一天借书的读者姓名、所在单位及借书日期。
12) 查询2006年7月以后没有借书的读者借书证号、姓名及单位。
#13) 求”科学出版社”图书的最高单价、最低单价、平均单价。
##14)* 求”信息系”当前借阅图书的读者人次数。
#15) 求出各个出版社图书的最高价格、最低价格和总册数。
#16) 分别找出各单位当前借阅图书的读者人数及所在单位。
17)* 找出当前至少借阅了2本图书(大于等于2本)的读者姓名及其所在单位。
18) 分别找出借书人次数多于1人次的单位及人次数。
19) 找出藏书中各个出版单位的名称、每个出版社的书籍的总册数(每种可能有多册)、书的价值总额。
20) 查询经济系是否还清所有图书。
如果已经还清,显示该系所有读者的姓名、所在单位和职称。
附录:建表语句创建图书管理库的图书、读者和借阅三个基本表的表结构:创建BOOK:(图书表)CREATE TABLE BOOK (BOOK_ID int,SORT VARCHAR(10),BOOK_NAME VARCHAR(50),WRITER VARCHAR(10),OUTPUT VARCHAR(50),PRICE int);创建READER:(读者表)CREATE TABLE READER (READER_ID int,COMPANY VARCHAR(10),NAME VARCHAR(10),SEX VARCHAR(2),GRADE VARCHAR(10),ADDR VARCHAR(50));创建BORROW:(借阅表)CREATE TABLE BORROW (READER_ID int,BOOK_ID int,BORROW_DATE datetime)插入数据:BOOK表:insert into BOOK values(,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into BOOK values(,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into BOOK values(,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into BOOK values(,'TP5/10','计算机基础','李伟','高等教育出版社',18.00);insert into BOOK values(,'TP3/12','FoxBASE','张三','电子工业出版社',23.60);insert into BOOK values(,'TS7/21','高等数学','刘明','高等教育出版社',20.00);insert into BOOK values(,'TR9/12','线性代数','孙业','北京大学出版社',20.80);insert into BOOK values(,'TR7/90','大学英语','胡玲','清华大学出版社',12.50);insert into BOOK values(,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50);insert into BOOK values(,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50);insert into BOOK values(,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50);insert into BOOK values(,'TP4/14','FoxPro大全','周虹','科学出版社',32.70);insert into BOOK values(,'TP4/14','FoxPro大全','周虹','科学出版社',32.70);insert into BOOK values(,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80);insert into BOOK values(,'TP4/15','计算机网络','黄力钧','高等教育出版社',2 1.80);READER表:insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316 ');insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224 ');insert into reader values(116,'信息系','李明','男','副教授','1号楼318 ');insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214 ');insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216 ');insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318 ');insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506');insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510 ');insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512 ');insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212 ');BORROW表:insert into borrow values(112,,'3-19-2006');insert into borrow values(125,,'2-12-2006');insert into borrow values(111,,'8-21-2006');insert into borrow values(112,,'3-14-2006');insert into borrow values(114,,'10-21-2006');insert into borrow values(120,,'11-2-2006');insert into borrow values(120,,'10-18-2006');insert into borrow values(119,,'11-12-2006');insert into borrow values(112,,'10-23-2006');insert into borrow values(115,,'8-21-2006');insert into borrow values(118,,'9-10-2006');现有关系数据库如下:数据库名:图书借阅管理系统读者表(读者编号 char(6),姓名,性别,年龄,单位,身份证号,职称)图书表(图书编号char(6),图书名称,出版社,作者)借阅表(读者编号,图书编号,借阅时间)用SQL语言实现下列功能的sql语句代码。
SQL课后答案(从光碟中复制)

第一章1.数据库技术的发展经历了人工管理、文件系统、数据库系统3个阶段。
2.数据模型通常是由数据结构、数据操作和完整性约束3部分组成3.(1)Access (2)SQL Server (3)Oracle第二章1.SQL Server 2008的版本有:SQL Server 2008分为SQL Server 2008企业版、标准版、工作组版、Web版、开发者版、Express版、Compact 3.5版。
SQL Server 2008的主要特点为:可信任、高效、智能。
在安装SQL Server 2008时,可以选择:Windows身份验证模式、混合模式(SQL Server身份验证和Windows身份验证)第三章1.启动SQL Server 2008服务的两种方式分别是:后台启动SQL Server 2008服务和通过SQL Server配置管理器启动SQL Server2011。
后台启动SQL Server 2008服务步骤:选择“开始”/“控制面板”/“控制面板”/“系统和安全”/“管理工具”/“服务”命令,打开“服务”窗口。
在“服务”窗口中找到需要启动的SQL Server 2008服务,单击鼠标右键在弹出的快捷菜单中选择“启动”命令,等待Windows启动SQL Server 2008的服务。
通过SQL Server配置管理器启动SQL Server2011的步骤:首先打开“SQL Server Configuration Manager”管理工具。
在“SQL Server Configuration Manager”管理工具中左边树型结构下选择“SQL Server服务”,在“SQL Server Configuration Manager”管理工具右边列出的SQL Server服务中选择需要启动的服务,单击鼠标右键,在弹出的快捷菜单中选择“启动”命令,启动所选中的服务。
2.步骤:(1)打开“SQL Server Management Studio”工具。
SQL课后作业10题参考答案

假设每个职工可以在多个公司工作,检索每个职工的兼职公司数目和工资总数,显示E#,MUM,SUM_SALARY分别表示工号、公司数目和工资总数。
分析:涉及到表为works表;按照职工来统计公司的数目和工资总额select E#,count(c#) NUM,sum(salary) SUM_SALARY from works group by E#检索”联华公司”中低于本公司平均公司的职工工号和姓名.(10题2小题)(1)查找联华公司职工的平均工资。
方法一:连接查询实现select avg(salary) from works,comp where works.c#=comp.c# and cname='联华公司'方法二:嵌套查询实现Select avg(salary) from works Where c#=(select c# from comp Where cname='联华公司')------------------------------------5799.5(2)查找联华公司工资低于(1)的职工工号和姓名。
方法一:连接查询实现外层查询select emp.e#,enamefrom emp,works,compwhere emp.e#=works.e#and works.c#=comp.c#and cname='联华公司'and salary<(Select avg(salary) from worksWhere c#=(select c# from compWhere cname='联华公司'))方法二:嵌套查询实现外层查询(自己思考)3、检索工资高于其所在公司职工平均工资的所有职工的工号和姓名。
(1)先查找各公司的平均工资select c#,avg(salary) avg_salfrom worksgroup by c#(2) 检索所有职工的工号、姓名、公司,工资select emp.e#,ename,works.c#,salary,from emp,workswhere emp.e#=works.e#(3) 检索所有职工的工号、姓名、公司,工资,所在公司和平均工资select emp.e#,ename,works.c#,salary,a.c#,a.avg_salfrom emp,works,(select c#,avg(salary) avg_salfrom works group by c#) awhere emp.e#=works.e#and works.c#=a.c#and salary>avg_sal4、检索职工人数最多的公司的编号和名称(10题的4小题).(1)按照公司来统计公司的人数(涉及到works)select c#,count(e#) from worksgroup by c#(2) 从(1)的结果中查找人数最多的公司的人数select max(cont) from (select c#,count(e#) cont from worksgroup by c#) a(3) 根据(2)查询的结果,从(1)的结果中查找人数最多的公司的编号.select c# from (select c#,count(e#) cont from works group by c#) awhere cont=(select max(cont) from (select c#,count(e#) contfrom worksgroup by c#) a)(4)已知公司编号,在COMP表中查找公司编号和名称select c#,cname from compwhere c# in(select c# from (select c#,count(e#) cont from works group by c#) a where cont=(select max(cont) from (select c#,count(e#) contfrom worksgroup by c#) a))5、检索工资总额最小的公司的编号和名称。
SQL习题参考答案

8. 数据库设计过程包括几个主要阶段?这里只概要列出数据库设计过程的六个阶段:( l )需求分析;( 2 )概念结构设计;( 3 )逻辑结构设计;( 4 )数据库物理设计;( 5 )数据库实施;( 6 )数据库运行和维护。
这是一个完整的实际数据库及其应用系统的设计过程。
不仅包括设计数据库本身,还包括数据库的实施、运行和维护。
设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。
二、选择题1. 在下面所列出的条目中,哪些是数据库管理系统的基本功能__ ABC ____。
A. 数据库定义B. 数据库的建立和维护C. 数据库存取D. 数据库和网络中其他软件系统的通信2. 在数据库的三级模式结构中,内模式有___ A ___。
A. 1个B. 2个C. 3个D. 任意多个3. 下面列出的条目中,哪些是数据库技术的主要特点___ ABC ___。
A. 数据的结构化B. 数据的冗余度小C. 较高的数据独立性D. 程序的标准化4. __ B ___是按照一定的数据模型组织的,长期储存在计算机内,可为多个用户共享的数据的聚集。
A. 数据库系统B. 数据库C. 关系数据库 . 数据库管理系统5. 数据库(DB)、数据库系统(DBS)、数据库管理系统(DBMS)三者之间的关系,正确的表述是__ B ____。
A. DB和DBS都是DBMS的一部分B. DBMS和DB都是DBS的一部分C. DB是DBMS的一部分D. DBMS包括数据库系统和DB6. 用于对数据库中数据的物理结构描述的是___C_____。
A. 逻辑模式B. 用户模式C. 存储模式D. 概念模式7. 用于对数据库中全体数据的逻辑结构和特征描述的是___A_____。
A. 公共数据视图B. 外部数据视图C. 内模式D. 存储模式8. 用于对数据库中数据库用户能够看得见和使用的局部数据的逻辑结构和特征描述的是____B____。
A. 逻辑模式B. 外模式C. 内模式D. 概念模式9. 数据库三级模式体系结构的划分,有利于保持数据库的___A_____。
SQL语言习题参考答案

第3章 SQL语言习题参考答案1.试述SQL语言的特点。
(85页)答:综合统一、高度非过程化、面向集合的操作方式、以同一种语法结构提供两种使用方式、语言简捷,易学易用。
2.试述SQL的定义功能。
(87页)答:SQL的数据定义功能包括定义表、定义视图和定义索引3.用SQL语句建立第二章习题5中的四个表。
S(SNO,SNAME,STATUS,CITY);P(PNO,PNAME,COLOR,WEIGHT);J(JNO,JNAME,CITY);SPJ(SNO,PNO,JNO,QTY);供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成:CREATE TABLE S(Sno C(2) UNIQUE,Sname C(6) ,Status N(2),City C(4))零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成:CREATE TABLE P(Pno C(2) UNIQUE,Pname C(6),COLOR C(2),WEIGHT I(2))工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、所在城市(CITY)组成:CREATE TABLE J(Jno C(2) UNlQUE,JNAME C(8), CITY C(4)).供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成:CREATE TABLE SPJ(Sno C(2),Pno C(2),JNO C(2), QTY N(2))4.针对上题中建立的四个表试用SQL语言完成第二章习题5中的查询:(1)求供应工程J1零件的供应商号码SNO:SELECT DIST SNO FROM SPJ WHERE JNO='J1'(2)求供应工程J1零件P1的供应商号码SNO:SELECT DIST SNO FROM SPJ WHERE JNO='J1' AND PNO='P1' (3)求供应工程J1零件为红色的供应商号码SNO:SELECT SNO FROM SPJ,P WHERE JNO='J1' AND = AND COLOR='红'(4)求没有使用天津供应商生产的红色零件的工程号JNO: SELECT DIST JNO FROM SPJ WHERE JNO NOT IN (SELE JNO FROMSPJ,P,S WHERE ='天津' AND COLOR='红' AND = AND =。
SQL查询语句学习答案

第一部分SQL查询语句的学习没有安装SQL Server,只有Access,所以就在Access中操作,Access中的SQL语句与SQL Server中有一点不一样,但是不影响总体的学习,触类旁通,共勉。
所使用的数据库数据是Northwind.mdb单表查询--查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、客户ID和雇员ID等字段的值SQL语句:select 订单ID, 客户ID, 雇员ID, 订购日期from 订单where 订购日期between #1996-07-01# and #1996-07-15#截图:--查询“Northwind”示例数据库中供应商的ID、公司名称、地区、城市和电话字段的值。
条件是“地区等于华北”并且“联系人头衔等于销售代表”。
SQL语句:select 供应商ID, 公司名称, 地区, 城市, 电话from 供应商where 地区='华北' and 联系人职务='销售代表'截图:--查询“Northwind”示例数据库中供应商的ID、公司名称、地区、城市和电话字段的值。
其中的一些供应商位于华东或华南地区,另外一些供应商所在的城市是天津SQL语句:select 供应商ID, 公司名称, 地区, 城市, 电话from 供应商where 地区in ('华北','华南') or 城市='天津'截图:--查询“Northwind”示例数据库中位于“华东”或“华南”地区的供应商的ID、公司名称、地区、城市和电话字段的值SQL语句:select 供应商ID, 公司名称, 地区, 城市, 电话from 供应商where 地区='华东' or 地区='华南'截图:多表查询--查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、相应订单的客户公司名称、负责订单的雇员的姓氏和名字等字段的值,并将查询结果按雇员的“姓氏”和“名字”字段的升序排列,“姓氏”和“名字”值相同的记录按“订单ID”的降序排列SQL语句:select 订购日期, 订单ID, 公司名称, 姓氏, 名字from 订单, 雇员, 客户where 订购日期between #1996-07-01# and #1996-07-15#and 订单.客户ID = 客户.客户IDand 订单.雇员ID = 雇员.雇员IDorder by 姓氏, 名字ASC, 订单ID DESC截图:--查询“10248”和“10254”号订单的订单ID、运货商的公司名称、订单上所订购的产品的名称SQL语句:select 订单.订单ID, 公司名称, 产品名称from 订单, 运货商, 产品, 订单明细where 订单.订单ID in (10248,10254)and 订单.运货商= 运货商.运货商IDand 订单.订单ID = 订单明细.订单IDand 订单明细.产品ID = 产品.产品ID截图:--查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称、数量、单价和折扣SQL语句:select 订单.订单ID, 产品名称, 数量, 订单明细.单价, 折扣from 订单, 产品, 订单明细where 订单.订单ID in (10248, 10254)and 订单.订单ID = 订单明细.订单IDand 订单明细.产品ID = 产品.产品ID截图:--查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称及其销售金额SQL语句:select 订单.订单ID, 产品名称, 数量*订单明细.单价*(1-折扣) as 销售金额from 订单, 订单明细, 产品where 订单.订单ID in (10248, 10254)and 订单.订单ID = 订单明细.订单IDand 订单明细.产品ID = 产品.产品ID截图:综合查询--查询所有运货商的公司名称和电话SQL语句:select 公司名称, 电话from 运货商截图:--查询所有客户的公司名称、电话、传真、地址、联系人姓名和联系人头衔SQL语句:select 公司名称, 电话, 传真, 地址, 联系人姓名, 联系人职务from 客户截图:--查询单价介于10至30元的所有产品的产品ID、产品名称和库存量SQL语句:select 产品ID, 产品名称, 库存量from 产品where 单价between 10 and 30截图:--查询单价大于20元的所有产品的产品名称、单价以及供应商的公司名称、电话SQL语句:select 产品名称, 单价, 公司名称, 电话from 产品, 供应商where 单价>20and 产品.供应商ID = 供应商.供应商ID截图:--查询上海和北京的客户在1996年订购的所有订单的订单ID、所订购的产品名称和数量SQL语句:Select 订单.订单ID, 产品名称, 数量From 订单, 客户, 产品, 订单明细Where 城市in (‘上海’, ‘北京’)And 订单.客户ID = 客户.客户IDAnd 订单.订单ID = 订单明细.订单IDAnd 订单明细.产品ID = 产品.产品ID截图:--查询华北客户的每份订单的订单ID、产品名称和销售金额SQL语句:Select 订单.订单ID, 产品名称, 产品.单价*(1-折扣)*数量as 销售金额From 订单, 产品, 订单明细, 客户Where 地区= '华北'And 订单.客户ID = 客户.客户IDAnd 订单.订单ID = 订单明细.订单IDAnd 订单明细.产品ID = 产品.产品ID截图:--按运货商公司名称,统计1997年由各个运货商承运的订单的总数量SQL语句:Select 公司名称, count(订单ID) as 订单总数量From 订单, 运货商Where year(发货日期) = 1997And 订单.运货商= 运货商.运货商IDGroup by 公司名称截图:--统计1997年上半年的每份订单上所订购的产品的总数量SQL语句:Select 订单.订单ID, sum(数量) as 总数量From 订单, 订单明细Where 订购日期between #1997-01-01# and #1997-06-30# And 订单.订单ID = 订单明细.订单IDGroup by 订单.订单ID截图:--统计各类产品的平均价格SQL语句:Select 类别名称, sum(单价*库存量)/sum(库存量) as 平均价格From 类别, 产品Where 类别.类别ID = 产品.类别IDGroup by 类别名称截图:--统计各地区客户的总数量SQL语句:Select 地区, count(客户ID) as 总数量From 客户Group by 地区截图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章关系型数据库—基本概念和操作课后习题:========【注意:每一章后面的课后习题,是作业,也是期末考试主要的题源,期末试卷中约50分的试题就从这些题目中选取】1.各用一句话说明以下概念关系数据库,实例,属性,域,记录(元组),候选键,主键,外键1)一个关系数据库是由若干二维表和表之间的关联组成,这个库也叫一个“实例(instance)”。
2)表的第一行是“表头”,它并不是数据,而是说明每一列的数据应该“是什么”,以及取值范围和其它约束条件,“表头”的每个字段叫属性(attribute),属性的取值范围及其他约束条件叫域(field)。
属性是描述数据的数据,叫元数据。
3)每个表的各个属性不能重名,不同表的属性可以重名。
一个表也可以叫一个关系,表中的数据,有的是本表实体的数据,有的是与其它表的联系,比如“表8:选课表”,“课程号”和“学号”列是联系。
4)每张表从第二行往后是数据部分、每一行叫一条记录,或一个元组。
记录中的每一列可以叫一个字段。
6.每张表至少应该有一个,也可以有多个属性,可以唯一的确定一条记录,这种属性叫候选键(candidate key),比如,表5:“学生表”的“学号”肯定是候选键,而“姓名”如果加上不允许重复的约束条件,也是候选键,否则不是。
5)当一个表中有多个候选键,可以从中任选一个作为主键(prime key) ,当一个表只有一个候选键,它自然就是主键。
主键可以是数值,可以是字符串或其它类型,但无论如何主键的值不能为空,不同记录的主键值也不能重复。
6)外键(foreign key):在本表中是主键,而在其它表中可能不是主键,叫外键。
比如,“表8:选课表”的“课程号”和“学号”在该表中都不是主键,是可以重复的。
而在“表7:课程表”和“表5:学生表”中,却是各自的主键。
外键说明了一个表和另一个表的关联,是关系数据库中重要的键。
第二章关系型数据库—SQL语言本章习题(1)本章“8 小结”表中提到的重点关键词、谓词、句型、概念。
(2)本章所有例题(结合上机)阅读理解。
实验2:SQL语言(使用MS SQL Server)要求重复本章所有例题,并能加以适当变化,主要是谓词的变化。
分类基本句型和关键字其它重要关键字和谓词重要概念数据定义DDL CREATE DADABASE 数据库名;CREATE TABLE 表名(列名类型,…表级约束)NCHAR和CHAR的区别;数据库主文件,次文件,日志文件的概念及其扩展名数据操作DML INSERT INTO 表名(属性列表)VALUES(值列表); UPDATE表名SET 列名=表达式,WHERE行选择条件数据查询DQL SELECT *|列名,…FROM 表名|视图名,…WHERE 行选择条件;例31-33内连接查询句法;LIKE和 _, % ;SELECT 聚集函数名(形参) AS 别名FROM 表名 WHRER行选择条件;列的别名的用途;结果集;脏数据;外键的必要性视图CREATE VIEW视图名AS SELECT 语句; 视图;视图最重要的作用索引CREATE INDEX索引名ON 表名|视图名(列名,…); 索引,索引的优点和缺点第二章【附录】关系代数理论本章习题:1 用100字左右简述关系数据的三层模型2 本章“2.3 关系代数的原始运算”“选择”、“投影”、“笛卡尔积”、“并集”、“差集”和“重命名”。
请根据课件第二章的例题,猜测一下,这六个原始运算对应SQL语言的那个主句、子句或谓词。
3本章“2.4连接和类似连接的运算”给出了几个链接查询结果集的表格样例(比如部门表和雇员表的自然连接),写出相应的SQL语句。
1.外模式比如SQL的视图,用户完全可见向上映射概念模式:主要描述数据、类型、关系、约束、用户操作等。
比如SQL语句,用户部分可见向上映射内模式:描述数据库的物理存储用户看不到操作系统的文件系统,向上映射有些数据库有独立的文件系统2.“选择”:select “投影”:SELECT test FROM A“笛卡尔积”:SELECT选课表.*,学生表.*,课程表.*“并集”:WHERE ...OR...“差集”:WHERE...AND...“重命名”:EXEC sp_rename '表名.原列名', '新列名';3.自然连接 (⋈)自然连接是写为 (R⋈S) 的二元运算(相当于C语言的双目运算),这里的R和S是关系。
自然连接的结果是在R和S中公共属性名字上相等的所有元组的组合。
例如下面是表格“雇员”和“部门”和它们的自然连接:雇员Name EmpIdDeptNameHarry 3415 财务Sally 2241 销售George 3401 财务Harrie t 2202 销售部门DeptNameManager财务George销售Harriet生产Charles雇员⋈部门NameEmpIdDeptNameManagerHarry 3415 财务GeorgeSally 2241 销售HarrietGeorge 3401 财务GeorgeHarrit2202 销售HarrietSELECT 雇员.*,部门.* from 雇员,部门WHERE 雇员.DeptName =部门.DeptName;或是SELECT * from 雇员 NATURAL JOIN 部门;(SQL SERVER2005不能用)θ-连接(内连接)考虑分别列出车模和船模的价格的表“车”和“船”。
假设一个顾客要购买一个车模和一个船模,要求船模比车模便宜。
在关系上的θ-连接CarPrice≥BoatPrice生成所有可能选项的一个表,提供给顾客几种购买选择。
(请试写出下表的SQL语句)车CarMod el CarPri ceCarA 20'000 CarB 30'000 CarC 50'000船BoatModelBoatPriceBoat1 10'000Boat2 40'000Boat3 60'000车船CarModelCarPriceBoatModelBoatPriceCarA 20'000 Boat1 10'000CarB 30'000 Boat1 10'000CarC 50'000 Boat1 10'000CarC 50'000 Boat2 40'000SELECT * from 车,船车.CarPrice > 船.BoatPrice 除法 (÷)除法是写为R÷S的二元关系。
其结果是由只在R表的属性列中而不在S表中的属性列的构成,并且S中的元组的所有组合都存在于R中。
例如下面的“完成”(R)和“DB项目”(S)和它们的除法:完成Student TaskFred Database1 Fred Database2 Fred Compiler1 Eugene Database1 Eugene Compiler1 Sara Database1 Sara Database2DB项目TaskDatabase1Database2完成÷ DB项目StudentFredSaraselect 完成.Student from 完成,DB项目where 完成.Task=DB项目.Task第三章关系型数据库----设计理论及设计方法本章习题1 跟文科同学解释什么是关系型数据库,不能用数学术语,也不能举例说明。
解释不能超出100字。
2 跟文科同学,假定他知道什么是关系数据库,知道表、列、行、主键、外键等概念,解释什么是第一范式、第二范式、第三范式,不能用数学术语,也不能举例说明。
解释不能超出100字。
1.关系数据库的基本内容是若干张二维表格,以及表格之间的关联。
表及其关联关系。
便构成了一个关系型数据库的模型,将其输入到某种关系数据库系统中,便是个关系型数据库。
2.第一范式:表中所有列名(属性)的字段不可以再分。
第二范式:第二范式满足第一范式,表的非主键列依赖主键;非主键列之间不能相互依赖;一个表只说明一个事物。
第三范式:第三范式满足第二范式且数据库中可变的数据只在一处做修改更新而不波及其它第四章 T-SQL 程序控制语句本章习题1 概念和简答(每个问题的答案不得超出100字,课件全部章节的全部概念和简答题都做如此要求)1)什么是PL\SQL?什么是T-SQL?上网查查它们各自的英文全称。
2)对象的完全名字空间有什么用处?3)什么是对象的同义词?4)T-SQL用户自定义类型的特点?5)什么是局部变量?什么是全局变量?6)为什么要分页查询?7)为什么GOTO语句不推荐使用?2本章所有例题(结合上机)阅读理解。
1)SQL:Structured Query LanguagePL\SQL(Procedural Language/SQL)过程化SQL语言:Oracle数据库对SQL语句的扩展。
T-SQL (Transact-SQL)是:SQL 在Microsoft SQL Server 上的增强版2)用“..”隔开的对象完全名字空间,可以唯一确定一个对象的名字,不会出现不同的对象重名现象。
3)对象的简化引用时的另一个名字4)不仅允许自定义类型,而且允许将其加到数据库内置的完整性约束里。
5)局部变量是用户可自定义的变量,其作用范围仅在定义它的程序内有效。
局部变量名字前面必需要有@符号,局部变量要先声明后使用,T-SQL的全局变量是系统预定义好的,不允许用户自定义。
全局变量名字前面是@@。
用户可以在任何时间、用任何程序访问全局变量,直到数据库系统关闭。
6)“多批次,小批量”查询,每次只消耗很少的数据库和网络资源,比一次性返回大量结果集优越得多。
7)无条件跳转会产生难以阅读和维护的“面条代码”第五章并发和事务本章习题:=========1什么是并发程序?什么是异步并发程序?什么是同步并发程序?2当同步并发程序(1)同时写(2)同时读写(3)同时读共享数据时,那种情况有极小概率发生脏数据(脏读或脏写)?3什么是原子操作?对并发数据为什么要使用原子操作?4 什么是事务?5 事务的缺点是什么?6 GO命令有什么用?7 能够读懂本章的例题。
本章实验:=========无要求。
【本章所有的例题,仅仅为了便于同学们理解相关的概念。
期末考试时,不要求写本章例题相关的SQL程序题,只要求读懂例题。
】1.在同一个系统下“同时”运行的多个进(线)程,叫并发程序。
这些并发程序,有的是相互无关的,这种并发程序叫异步并发程序。
但是当并发程序之间有相互关联,比如多个进(线)程有共享数据的时候,这种并发程序叫同步并发程序。