zoukankan      html  css  js  c++  java
  • .Net开发工程师笔试试题

    第一部分【数据库技能】

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

    现在有一个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

  • 相关阅读:
    SAP ABAP Netweaver服务器的标准登录方式讲解
    php导出百万数据到csv
    消息中间件Kafaka
    kafka安装
    Linux系统下安装jdk及环境配置(两种方法)
    PHP导出3w条数据成表格
    excel 导出导入
    利用Redis锁解决高并发问题
    BeyondCompare4破解方法
    Linux(Ubuntu)通过nfs挂载远程硬盘
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/4250137.html
Copyright © 2011-2022 走看看