资源描述:
《数据库上机实验_3_实验报告_答案doc.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、数据库上机实验答案3学号:姓名:日期:20年月日实验目的:练习连接查询,练习视图。综合练习SQL查询语句。实验内容:基于提供的社交网络数据,包括:社交网络用户users表,社交网络好友关系friends表,完成如下查询,并回答问题。要求:(1)输出查询结果;(2)输出查询语句。各表的字段解释如下:Users用户列表(id用户IDgender用户性别homeprovince家乡所在省份nFriends好友数nPosts发表的日志数nAlbums相册数nVisits空间访问人数)Friends好友关系表(i
2、d用户IDfriendID好友ID)1二度好友研究所谓二度好友,指的是好友的好友。如果B是A的好友,而C是B的好友,那么称C为A的二度好友。(1)查询二度好友表(ID,FriendID,FFID)selecta.*,b.friendIDasffIDfromfriendsasainnerjoinfriendsasbona.friendID=b.id(2)统计用户在社交网络中的好友数、二度好友数(ID,nF,nFF)注意:社交网络中的好友数与users表中的好友数可能不同。withtb_nfas(selec
3、tID,count(*)asnffromfriendsgroupbyID),tb_nffas(selecta.ID,count(*)asnfffromfriendsasainnerjoinfriendsasbona.friendID=b.IDanda.ID<>b.friendIDand(b.friendIDnotin(selectfriendIDfromfriendswhereID=a.ID))groupbya.id)selecttb_nf.ID,nf,nfffromtb_nfinnerjointb_n
4、ffontb_nf.ID=tb_nff.ID注:这里用了两个with语句来预定义两个子查询tb_nftb_nff,分别计算nF,nFF的值。在计算nFF的值的时候,考虑到自己不能是自己的二度好友(a.ID<>b.friendID),以及自己的一度好友不能是自己的二度好友(b.friendIDnotin(selectfriendIDfromfriendswhereID=a.ID))。此外,注意到nF与users表中的nFriends是不同的,nFriends指的是在整个社交网络上的好友数,而nF是在我们选
5、取的局部网络中的好友数。这个查询的结果有63条记录,而users表有64条记录。原因是其中一个user在此局部网络中没有好友,因此没有在friends表中出现。(3)根据users表,创建一个完全相同的新表users_update,暂时不插入数据。createtableusers_update(idint,gendervarchar(2),homeprovincevarchar(50),nFriendsint,nPostsint,nAlbumsint,nVisitsint)(4)在users_updat
6、e后面新增两列nF,nFF。altertableusers_updateaddnFint,nFFint(5)在users_update中插入数据。要求全部列都填写完毕。可选方案:可以先插入users数据,再updatenF与nFF;或者直接插入全部数据。可选方案1:可以先插入users数据,再updatenF与nFF;插入users数据(64条):insertintousers_updateselect*,null,nullfromusers;updatenF(63条):withtb_nfas(sele
7、ctID,count(*)asnffromfriendsgroupbyID)updateusers_updatesetnF=tb_nf.nffromtb_nfwhereusers_update.ID=tb_nf.ID;updatenFF(63条):withtb_nffas(selecta.ID,count(*)asnfffromfriendsasainnerjoinfriendsasbona.friendID=b.IDanda.ID<>b.friendIDand(b.friendIDnotin(sele
8、ctfriendIDfromfriendswhereID=a.ID))groupbya.id)updateusers_updatesetnFF=tb_nff.nfffromtb_nffwhereusers_update.ID=tb_nff.ID;可选方案2:直接插入全部数据withtb_nfas(selectID,count(*)asnffromfriendsgroupbyID),tb_nffas(selecta.ID,count(*)as