实验5sql语句练习图书馆数据库答案Word文件下载.docx
《实验5sql语句练习图书馆数据库答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验5sql语句练习图书馆数据库答案Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
姓名
读者姓名
定长字符串,长度为8
非空值
性别
读者性别
定长字符串,长度为2
办公电话
读者办公电话
部门
读者所在部门
借阅表结构
读者的唯一编号
外码,引用读者表的主键
图书的唯一编号
定长字符串,长度为20
外码,引用图书表的主键
借出日期
借出图书的日期
归还日期
归还图书的日期
主键为:
(读者号,图书号)
(1)用Sql语句创建图书馆数据库
CreatedatabaseLab05
(2)用Sql语句创建上述3个表
createtablebook
(
bookIdchar(10)primarykey,
bookNamevarchar(50),
bookWritervarchar(30),
bookPublishvarchar(30),
bookPricefloat
)
createtablereader
readerIdchar(10)primarykey,
readerNamevarchar(8)notnull,
readerSexchar
(2)notnull,
readerOfficeTelchar(8),
readerDepartmentvarchar(30)
createtable借阅表
readerIdchar(10),
bookIdchar(10),
checkOutTimechar(8),
checkInTimechar(8),
primarykey(readerId,bookId),
foreignkey(readerId)referencesreader(readerId),
foreignkey(bookId)referencesbook(bookId),
(3)基于图书馆数据库的3个表,用sql语言完成一下操作:
1)为图书表增加一列“ISBN”,数据类型为CHAR(10)
altertablebookaddISBNchar(10)
2)为刚添加的ISBN列增加缺省值约束,约束名为ISBNDEF,缺省值为‘7111085949’
ALTERTABLEbookADDCONSTRAINTISBNDEFDEFAULT('
7111085949'
)FORISBN
3)删除图书表中ISBN列增加的缺省值约束
altertablebookdropISBNDEF
4)删除图书表中新增的ISBN列
ALTERTABLEbookDROPCOLUMNISBN
5)查询全体图书的图书号、书名、作者、出版社和单价
selectbookId,bookName,bookWriter,bookPublish,bookPrice
frombook
6)查询全体图书的信息,其中单价打8折,并设置该列的别名为‘打折价’
selectbookId,bookName,bookWriter,bookPublish,(bookPrice*0.8)as打折价
7)显示所有借阅者的读者号,并去掉重复行
selectdistinctreaderId
from借阅表
8)查询所有单价在20—30元之间的图书信息
selectbookId,bookName,bookWriter,bookPublish,bookPrice,ISBN
wherebookPricebetween20and30
9)查询机械工业出版社、科学出版社、人民邮电出版社的图书信息
wherebookPublishin('
机械工业出版社'
'
科学出版社'
'
人民邮电出版社'
10)查询既不是机械工业出版社、人民邮电出版社、也不是科学出版社出版的图书信息
wherebookPublishnotin('
11)查询姓名的第二个字符是’建’,并且只有2个字的读者的读者号及姓名
selectreaderId,readerName
fromreader
wherereaderNamelike'
_建'
12)查询姓名不是以‘王’、‘张’或‘李’开头的所有读者的读者号及姓名
【方式一】查询出来的结果有问题!
wherereaderNamenotin('
王%'
张%'
李%'
【方式二】
wherereaderNamenotin
selectreaderName
fromreader
wherereaderNamelike'
orreaderNamelike'
13)查询无归还日期的借阅信息
selectbook.bookId,book.bookName,reader.readerId,
reader.readerName,借阅表.checkOutTimeas借书时间,
借阅表.checkInTimeas还书时间
from借阅表,book,reader
and借阅表.checkInTimeisnull
14)查询机械工业出版社图书的平均价格、最高价、最低价
selectavg(bookPrice)as平均价格,max(bookPrice)as最高价,min(bookPrice)as最低价
wherebookPublish='
机械工业出版社图书'
15)查询读者的基本信息及借阅情况
fromreader,借阅表,book
and借阅表.readerId='
1000000007'
16)查询至少借阅过1本机械工业出版社出版的图书的读者的读者号、姓名、书名及借阅本数,并按借阅本书多少降序排列
selectr.Rno,Rname,count(borrow.Bno)借阅册数
fromborrow,b,r
groupbyr.rno,Rname
orderbycount(borrow.Bno)desc
17)查询与‘王小平’的办公电话相同的读者的姓名
/*使用“自连接方式”求解*/
fromreadera,readerb
/*
18)查询所有单价小于平均单价的图书的书号、书名及出版社
selectbookId,bookName,bookPublish,bookPrice
wherebookPrice<
(
selectavg(bookPrice)asaveragePrice
frombook
19)查询‘科学出版社’的图书单价比‘机械工业出版社’最高单价还高的图书书名及单价
wherebookPublishlike'
andbookPrice>
selectmax(bookPrice)
frombook
wherebookPublish='
20)查询‘科学出版社’的图书中单价比‘机械工业出版社’最低单价高的图书书名及单价
andbookPublishlike'
21)创建机械工业出版社图书的视图
CREATEVIEW机械工业出版社View
AS
SELECTbookId,bookName,bookPrice
FROMbook
WHEREbookPublish='
22)创建一个借阅统计视图,名为CountView,包含读者的读者号和总借阅本数
CREATEVIEWCountView
SELECTreaderIdas读者号,count(*)as总借阅本数
FROM借阅表
GROUPBYreaderId
23)创建一个借阅统计视图,名为CountView10,包含借阅总本数打于2的读者号和总借阅本数
CREATEVIEW借阅统计视图View
HAVINGCOUNT(*)>
2
实验5数组
班级:
学号:
姓名:
日期:
一、实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出方法;
(2)掌握字符数组和字符串函数的使用;
(3)掌握与数组有关的算法(特别是排序算法)。
二、实验内容
1.阅读下面程序,写出程序运行结果,并且上机进行验证。
(1)#include"
stdio.h"
voidmain()
{
inti,n[4]={0,0,0,0};
for(i=1;
i<
4;
i++)
if(i==3)break;
n[i]=n[i-1]+1;
}
printf("
n[i-1]=%dn[i]=%d\n"
n[i-1],n[i]);
(2)#include"
charch[]={'
0'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
inti=0,m=2,r,x=42;
charb[80];
while(x)
r=x%m;
x/=m;
b[i++]=ch[r];
for(--i;
i>
=0;
i--)
%c"
b[i]);
\n"
);
(3)#include"
inta[][3]={9,7,5,3,1,2,4,6,8};
inti,j,s1=0,s2=0;
for(i=0;
3;
for(j=0;
j<
j++)
if(i==j)s1=s1+a[i][j];
if(i+j==2)s2=s2+a[i][j];
s1=%ds2=%d"
s1,s2);
(4)#include"
intr[5]={1,2,3,4,5};
inti,j,a[5][5];
=4;
{for(j=i;
a[i][j]=r[j-i];
i;
a[i][j]=r[i-j];
5;
%2d"
a[i][j]);
2.程序填空(根据题意在空白处填入适当的内容,使程序变得完整。
并上机进行调试验证)
(1)程序说明:
下列程序完成的是插入排序功能:
数组a中存放一个递增数列,输入一个整数x,将它插入到数组中,使之仍为一个有序数列。
#include"
#defineN10
inta[11]={1,10,20,30,40,50,60,70,80,90},x,i,p;
scanf("
%d"
&
x);
for(i=0,p=N;
N;
if(x<
a[i])
p=i;
_break_;
for(i=N-1;
=p;
_i--__)
a[i+1]=a[i];
_a[p]=x___;
x);
=N;
%5d"
a[i]);
(2)程序说明:
下面程序完成的是折半查找。
A数组中存放的是n个由大到小已经排好序的数列,从这n个数中查找x的值是否存在。
其基本思想是:
在查找范围里,将x与处于中间位置上的数比较,如果相等,则查找成功,如果小于该元素,则在较小的一半元素里再进行折半查找;
如果x大于该元素,则在较大的一半元素里再进行折半查找。
变量top,bottom,mid分别指向查找范围的顶部、底部和中间位置。
#definen10
main()
inta[n],find;
intx,i,top,bottom,mid;
inputthesortednumbers:
n;
__&
a[i]___);
inputthenumbertofind:
find=0;
top=0;
bottom=n-1;
=a[0]&
&
top<
=bottom)
while(!
find&
mid=mid=(bottom+top)/2;
if(x==a[mid])
find=1;
x=%dposition=%d\n"
x,mid);
elseif(x>
a[mid])
bottom=mid-1;
else
top=mid+1;
if(find==0)printf("
thenumber%disnotinthetable"
(3)程序说明:
下面程序分别输出方阵中主对角线、副对角线上元素的和suml和sum2(主对角线为从矩阵的左上角至右下角的连线,副对角线为从矩阵的右上角至左下角的连线).
#include"
#defineSIZE5
inta[SIZE][SIZE],m,n,sum1,sum2;
for(m=0;
m<
SIZE;
m++)
for(n=0;
n<
n++)
a[m][n]);
sum1=sum2=__0__;
sum1=sum1+a[m][m];
sum2=sum2+a[m][SIZE-1-m];
sum1=%dsum2=%d\n"
sum1,sum2);
(4)程序说明:
下面程序打印出如下所示的杨辉三角行(打印10行)。
1
11
121
1331
14641
15101051
…….
inti,j,a[10][10]={{1},{1,1}};
for(i=2;
10;
a[i][0]=1;
_a[i][i]=1;
a[i][j]=a[i-1][j]+a[i-1][j-1];
=i;
%4d"
printf("
3.程序设计(根据题意编写程序并上机进行调试)。
(1)编写程序完成如下功能:
输入10个数存入一维数组,然后再按逆序重新存放后输出。
#include<
stdio.h>
inta[10],i,temp;
for(i=0;
scanf("
a[i]);
printf("
{
temp=a[i];
a[i]=a[9-i];
a[9-i]=temp;
}
(2)编写程序完成如下功能:
从键盘输入两个字符串ch2、ch1,然后将字符串ch2连接到字符串ch1的后面,并输出连接后的字符串。
string.h>
charch1[20],ch2[10];
inti,j;
scanf("
%s"
ch1);
ch2);
j=strlen(ch1);
strlen(ch2);
i++,j++)
ch1[j]=ch2[i];
ch1[j]='
\0'
;
%s\n"
(3)编写程序完成如下功能:
现有两个已按升序排好的数组,将它们合并为一个升序排序的数组(归并排序)。
算法:
两个数组合并时,可为每个数组各安排一个指针,从第一个元素开始依次比较两数组对应元素,小的取下来顺序放入新的数组,取下所指元素的指针后移,再比较,依此类推,直到其中一个数组的元素已全部放入新数组,再把另一数组余下的元素全部顺序放入新数组,归并完成。
编程并上机调试运行。
(1)用选择法对10个整数排序。
10个整数用scanf函数输入。
inti,j,min,temp,a[11];
enterdata:
for(i=1;
=10;
a[%d]="
i);
Theorginalnumbers:
=9;
min=i;
for(j=i+1;
if(a[min]>
a[j])min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
\nThesortednumbers:
(2)有15个数存放在一个数组中,输入一个数,要求用对半查找法找出该数是数组中第几个元素的值。
如果该数不在数组中,则输入“无此数”。
以15个数用赋初值的方法在程序中给出。
要找的数用scanf函数输入。
inti,number,top,bott,mid,loca,a[15],flag=1,sign;
charc;
a[0]);
i=1;
while(i<
15)
if(a[i]>
=a[i-1])
i++;
else
enterthisdataagain:
15;
while(flag)
inputnumbertolookfor:
"
number);
sign=0;
top=0;
bott=14;
if((number<
a[0])||(number>
a[14]))
loca=-1;
while((!
sign)&
(top<
=bott))
mid=(bott+top)/2;
if(number==a[mid])
loca=mid;
Hasfound%d,itspostionis%d\n"
number