附上自己做的答案,提出不足之處
創(chuàng)新互聯(lián)公司是專業(yè)的白銀網(wǎng)站建設(shè)公司,白銀接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行白銀網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
現(xiàn)在有一個(gè)SQL Server 2000版本的數(shù)據(jù)庫,里面包含有三個(gè)表Info、InfoReply、User,分別表示信息、信息評論和用戶表,包含的字段分別如下:
Info:
infoID | INT | 信息ID(自增列) |
infoTitle | NVARCHAR(100) | 信息標(biāo)題 |
infoContent | NVARCHAR(2000) | 信息正文 |
infoPubDate | DATETIME | 信息發(fā)布日期 |
infoPubUser | VARCHAR(30) | 信息發(fā)布用戶帳號 |
InfoReply:
infoReplyID | INT | 評論ID(自增列) |
infoID | INT | 信息ID |
infoReplyContent | NVARCHAR(2000) | 評論正文 |
infoReplyDate | DATETIME | 評論日期 |
infoReplyUser | VARCHAR(30) | 評論用戶帳號 |
User
userNo | VARCHAR(30) | 用戶帳號 |
userName | NVARCHAR(30) | 用戶姓名 |
三個(gè)表的關(guān)系可以通過下列模型圖來描述:
現(xiàn)有下列問題:
(1) 請說明在上述模型圖中,PK和FK1、FK2的含義?
答:pk是主鍵 fk1、fk2分別是外面
表infoReply有倆個(gè)外鍵fk1,fk2
表info有一個(gè)外鍵pk1
(2) 現(xiàn)在有一個(gè)查詢,需要返回一個(gè)最新發(fā)布的20條信息列表,要求包含:信息ID、信息標(biāo)題、信息發(fā)布時(shí)間、信息發(fā)布人姓名、信息評論總數(shù)和最后評論時(shí)間,并且按最后評論時(shí)間排序,請給出該查詢的SQL語句?
Select top 20 i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName,
count(ir.infoID)as ReplyCount --信息評論總數(shù)總數(shù)
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)中的查詢要求,現(xiàn)在假設(shè)Info表和User表之間不存在任何外鍵約束,即infoPubUser表示的用戶帳號可能在User表中已經(jīng)被刪除,這時(shí)如果要繼續(xù)返回最新的20條信息列表,包含(2)中相同的列,該SQL語句應(yīng)該怎么寫?
Select top 20 i.InfoID,i.InfoTItle,i.InfoPubDate,u.userName,
count(ir.infoID)as ReplyCount --信息評論總數(shù)總數(shù)
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) 假設(shè)Info表有一個(gè)字段infoReplyCount(信息評論總數(shù)),那我們需要怎么做才能讓用戶每增加一條評論,該字段自動(dòng)+1,說出大概思路即刻,能寫出SQL語句最好
在表Info創(chuàng)建一個(gè)觸發(fā)器,原理:當(dāng)評論表數(shù)據(jù)插入之后(after關(guān)鍵字)就會(huì)觸發(fā)下面update語句
Create trigger tri_addReply
On InfoReply
After insert
As
Beigin
Declare @infoID int --定義一個(gè)變量
Select @infoID=infoID from inserted –從插入表選出infoID
Update infoReply set infoReplyCount=infoReplyCount+1 where infoID=@infoID
end
(5) 寫出返回每一條信息的評論總數(shù)的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) 假設(shè)發(fā)現(xiàn)Info表有多條記錄丟失了,如何最大程度地找出有多少條記錄丟失了,寫出SQL語句。(不使用InfoReply表)
Select count(*) from Info --選出表中的總數(shù)
Select max(infoID) from Info --選出表中最大infoID
之后將兩個(gè)結(jié)果相減得到多少丟失記錄
(7) 假設(shè)發(fā)現(xiàn)Info表只有1條記錄丟失了,如何知道丟失的記錄的ID,寫出SQL語句(不使用InfoReply表)
首先做個(gè)小判斷,這個(gè)丟失的一條記錄不可能是最后一條記錄
select rownum from
(select row_number()over (order by id desc) as rownum from Info)—采用sql的分頁函數(shù)
as a
where rownum not in(select id from Info)
(8) 仍然是(6)的問題,可以使用InfoReply表,寫出SQL語句。
Select count(infoID)from --此語句統(tǒng)計(jì)多少條記錄丟失
(Select infoID from InfoReply
where infoID not in
(select infoID from Info)) as a --查找出多少條丟失記錄放到a表中
(9) 假設(shè)Info表有一個(gè)字段infoReplyCount(信息評論總數(shù)),infoReplyCount>=20的為熱門帖子,小于20的為非熱門帖子,請根據(jù)Info表的內(nèi)容輸出以下2行數(shù)據(jù),要求SQL語句最簡。
Select infoReplyCount as 數(shù)量,
(
Case
When infoReplyCount>=20 then N‘熱門’
Else N‘非熱門’
End
) as 類別
From Info
類別 | 數(shù)量 |
熱門 | 30 |
非熱門 | 18 |