第一部分【数据库技能】

附上自己做的答案,提出不足之处

现在有一个SQL Server 2000版本的数据库,里面包含有三个表InfoInfoReplyUser,分别表示信息、信息评论和用户表,包含的字段分别如下:

Info

infoID

INT

信息ID(自增列)

infoTitle

NVARCHAR(100)

信息标题

infoContent

NVARCHAR(2000)

信息正文

infoPubDate

DATETIME

信息发布日期

infoPubUser

VARCHAR(30)

信息发布用户帐号

InfoReply

infoReplyID

INT

评论ID(自增列)

infoID

INT

信息ID

infoReplyContent

NVARCHAR(2000)

评论正文

infoReplyDate

DATETIME

评论日期

infoReplyUser

VARCHAR(30)

评论用户帐号

User

userNo

VARCHAR(30)

用户帐号

userName

NVARCHAR(30)

用户姓名

三个表的关系可以通过下列模型图来描述:

现有下列问题:

(1)   请说明在上述模型图中,PK和FK1、FK2的含义?

答:pk是主键 fk1、fk2分别是外面

表infoReply有俩个外键fk1,fk2

表info有一个外键pk1

(2)   现在有一个查询,需要返回一个最新发布的20条信息列表,要求包含:信息ID、信息标题、信息发布时间、信息发布人姓名、信息评论总数和最后评论时间,并且按最后评论时间排序,请给出该查询的SQL语句?

Select top 20 i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName,

count(ir.infoID)as ReplyCount   --信息评论总数总数

ir.infoReplyDate

from Info i

inner join User u on i.infoPubuser =u.userNo

inner join InfoReply ir on ir.infoID=i.inforID

group by i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName

order by ir.inforReplyUser desc

(3)   仍是第(2)中的查询要求,现在假设Info表和User表之间不存在任何外键约束,即infoPubUser表示的用户帐号可能在User表中已经被删除,这时如果要继续返回最新的20条信息列表,包含(2)中相同的列,该SQL语句应该怎么写?

Select top 20 i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName,

count(ir.infoID)as ReplyCount   --信息评论总数总数

ir.infoReplyDate

from Info i

left join User u on i.infoPubuser =u.userNo

left join InfoReply ir on ir.infoID=i.inforID

group by i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName

order by ir.inforReplyUser desc

(4)   假设Info表有一个字段infoReplyCount(信息评论总数),那我们需要怎么做才能让用户每增加一条评论,该字段自动+1,说出大概思路即刻,能写出SQL语句最好

在表Info创建一个触发器,原理:当评论表数据插入之后(after关键字)就会触发下面update语句

Create trigger tri_addReply

On InfoReply

After insert

As

Beigin

Declare @infoID int  --定义一个变量

Select @infoID=infoID from inserted –从插入表选出infoID

Update infoReply set infoReplyCount=infoReplyCount+1 where infoID=@infoID

end

(5)   写出返回每一条信息的评论总数的SQL语句

Select i.infoID,count(ir.infoID)

From Info inner join InfoReply ir on i.infoID=ir.infoID

Group by i.infoID, ir.infoID

(6)   假设发现Info表有多条记录丢失了,如何最大程度地找出有多少条记录丢失了,写出SQL语句。(不使用InfoReply表)

Select count(*) from Info --选出表中的总数

Select max(infoID) from Info   --选出表中最大infoID

之后将两个结果相减得到多少丢失记录

(7)   假设发现Info表只有1条记录丢失了,如何知道丢失的记录的ID,写出SQL语句(不使用InfoReply表)

首先做个小判断,这个丢失的一条记录不可能是最后一条记录

select rownum from

(select row_number()over (order by id desc) as rownum from Info)—采用sql的分页函数

as a

where rownum not in(select id from Info)

(8)   仍然是(6)的问题,可以使用InfoReply表,写出SQL语句。

Select count(infoID)from  --此语句统计多少条记录丢失

(Select infoID from InfoReply

where infoID not in

(select infoID from Info)) as a   --查找出多少条丢失记录放到a表中

(9)   假设Info表有一个字段infoReplyCount(信息评论总数),infoReplyCount>=20的为热门帖子,小于20的为非热门帖子,请根据Info表的内容输出以下2行数据,要求SQL语句最简。

Select infoReplyCount as 数量,

(

Case

When infoReplyCount>=20 then N‘热门’

Else N‘非热门’

End

) as 类别

From Info

类别

数量

热门

30

非热门

18

最新文章

  1. 添加自编译的apache为linux系统服务
  2. 实用redis前需了解的5大事项
  3. 萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
  4. NodeJs使用asyncAwait两法
  5. ios项目上传svn丢失*.a文件
  6. 【开发】Dialog 对话框
  7. ajax xmlhttprequest status
  8. 当MVC4无法跳转时
  9. 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择
  10. 3、Spring的AOP详解和案例
  11. 【java虚拟机系列】java虚拟机系列之JVM总述
  12. FOFA爬虫大法——API的简单利用
  13. Java框架spring 学习笔记(十二):aop实例操作
  14. Exception.ToString()使用及其他方法比较
  15. mysql in 排序 也可以按in里面的顺序来排序
  16. 下载 rpm 源码包并重新编译
  17. 如何下载腾讯视频的视频转为MP4常用格式视频
  18. Oracle 11g 物理Dataguard日常操作维护(二)
  19. CAShapeLayer 画直线
  20. MESS-配置

热门文章

  1. BDE 升级到FireDAC
  2. msxml3.dll 执行页内操作时的错误
  3. 用MyEclipse JPA创建项目
  4. 跟我学算法 - 读取excel文件(xlrd)
  5. 7.25 8figting!
  6. linux 使用systemctl 启动服务报错: Error: No space left on device
  7. S导入部门数据 更新父部门、责任人
  8. 2015年传智播客JavaEE 第168期就业班视频教程17-登录功能业务逻辑实现(代码)
  9. 11. Container With Most Water 装水最多的容器
  10. 使用Log4J监控系统日志邮件警报