实验5sql语句练习图书馆数据库答案.docx
《实验5sql语句练习图书馆数据库答案.docx》由会员分享,可在线阅读,更多相关《实验5sql语句练习图书馆数据库答案.docx(21页珍藏版)》请在冰豆网上搜索。
![实验5sql语句练习图书馆数据库答案.docx](https://file1.bdocx.com/fileroot1/2022-11/28/71e42c2f-2939-4ec6-872a-a283ce297202/71e42c2f-2939-4ec6-872a-a283ce2972021.gif)
实验5sql语句练习图书馆数据库答案
实验5sql语句练习——图书馆数据库
实验5sql语句练习——图书馆数据库
实验目的
(1)了解SQLServer数据库的逻辑结构和物理结构;
(2)了解表的结构特点;
(3)了解SQLServer的基本数据类型;
(4)了解空值概念;
(5)学会在企业管理器中创建数据库和表;
(6)学会使用T-SQL语句创建数据库和表。
(7)学会使用T-SQL语句更新数据。
(7)学会使用T-SQL语句创建多种查询。
实验准备
首先要明确,能够创建数据库的用户必须是系统管理员,或是被授权使用CREATEDATABASE语句的用户。
其次创建数据库必须要确定数据库名、数据库大小(最初的大小、最大的大小、是否允许增长及增长方式)和存储数据库的文件。
然后,确定数据库包含哪些表,以及所包含的各表的结构,还要了解SQLServer的常用数据类型,以创建数据库的表。
此外还要了解两种常用的创建数据库、表的方法,即在企业管理器中创建和使用T-SQL的CREATEDATABASE语句。
实验内容
假设有5本书
设有一图书馆数据库,其中包括3个表,即图书表、读者表和借阅表。
三个表的结构如图:
图书表结构
列名
说明
数据类型
约束说明
书号
图书唯一的编号
定长字符串,长度为10
主键
书名
图书的名称
定长字符串,长度为50
空值
作者
图书的编著者名
定长字符串,长度为30
空值
出版社
图书的出版社
定长字符串,长度为30
空值
单价
出版社确定的图书的单价
浮点型,Float
空值
读者表结构
假设有10位读者
列名
说明
数据类型
约束说明
读者号
读者唯一的编号
定长字符串,长度为10
主键
姓名
读者姓名
定长字符串,长度为8
非空值
性别
读者性别
定长字符串,长度为2
非空值
办公电话
读者办公电话
定长字符串,长度为8
空值
部门
读者所在部门
定长字符串,长度为30
空值
借阅表结构
列名
说明
数据类型
约束说明
读者号
读者的唯一编号
定长字符串,长度为10
外码,引用读者表的主键
书号
图书的唯一编号
定长字符串,长度为20
外码,引用图书表的主键
借出日期
借出图书的日期
定长字符串,长度为8
非空值
归还日期
归还图书的日期
定长字符串,长度为8
空值
主键为:
(读者号,图书号)
(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打折价
frombook
7)显示所有借阅者的读者号,并去掉重复行
selectdistinctreaderId
from借阅表
8)查询所有单价在20—30元之间的图书信息
selectbookId,bookName,bookWriter,bookPublish,bookPrice,ISBN
frombook
wherebookPricebetween20and30
9)查询机械工业出版社、科学出版社、人民邮电出版社的图书信息
selectbookId,bookName,bookWriter,bookPublish,bookPrice,ISBN
frombook
wherebookPublishin('机械工业出版社','科学出版社','人民邮电出版社')
10)查询既不是机械工业出版社、人民邮电出版社、也不是科学出版社出版的图书信息
selectbookId,bookName,bookWriter,bookPublish,bookPrice,ISBN
frombook
wherebookPublishnotin('机械工业出版社','科学出版社','人民邮电出版社')
11)查询姓名的第二个字符是’建’,并且只有2个字的读者的读者号及姓名
selectreaderId,readerName
fromreader
wherereaderNamelike'_建'
12)查询姓名不是以‘王’、‘张’或‘李’开头的所有读者的读者号及姓名
【方式一】查询出来的结果有问题!
selectreaderId,readerName
fromreader
wherereaderNamenotin('王%','张%','李%')
【方式二】
selectreaderId,readerName
fromreader
wherereaderNamenotin
(
selectreaderName
fromreader
wherereaderNamelike'王%'orreaderNamelike'张%'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最低价
frombook
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
frombook
wherebookPrice<
(
selectavg(bookPrice)asaveragePrice
frombook
)
19)查询‘科学出版社’的图书单价比‘机械工业出版社’最高单价还高的图书书名及单价
selectbookId,bookName,bookPublish,bookPrice
frombook
wherebookPublishlike'科学出版社'andbookPrice>
(
selectmax(bookPrice)
frombook
wherebookPublish='机械工业出版社'
)
20)查询‘科学出版社’的图书中单价比‘机械工业出版社’最低单价高的图书书名及单价
selectbookId,bookName,bookPublish,bookPrice
frombook
wherebookPrice<
(
selectmax(bookPrice)
frombook
wherebookPublish='机械工业出版社'
)
andbookPublishlike'科学出版社'
21)创建机械工业出版社图书的视图
CREATEVIEW机械工业出版社View
AS
SELECTbookId,bookName,bookPrice
FROMbook
WHEREbookPublish='机械工业出版社'
22)创建一个借阅统计视图,名为CountView,包含读者的读者号和总借阅本数
CREATEVIEWCountView
AS
SELECTreaderIdas读者号,count(*)as总借阅本数
FROM借阅表
GROUPBYreaderId
23)创建一个借阅统计视图,名为CountView10,包含借阅总本数打于2的读者号和总借阅本数
CREATEVIEW借阅统计视图View
AS
SELECTreaderIdas读者号,count(*)as总借阅本数
FROM借阅表
GROUPBYreaderId
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"stdio.h"
voidmain()
{
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--)
printf("%c",b[i]);
printf("\n");
}
(3)#include"stdio.h"
voidmain()
{
inta[][3]={9,7,5,3,1,2,4,6,8};
inti,j,s1=0,s2=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(i==j)s1=s1+a[i][j];
if(i+j==2)s2=s2+a[i][j];
}
printf("s1=%ds2=%d",s1,s2);
}
(4)#include"stdio.h"
voidmain()
{
intr[5]={1,2,3,4,5};
inti,j,a[5][5];
for(i=0;i<=4;i++)
{for(j=i;j<=4;j++)
a[i][j]=r[j-i];
for(j=0;j
a[i][j]=r[i-j];
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%2d",a[i][j]);
printf("\n");
}
}
2.程序填空(根据题意在空白处填入适当的内容,使程序变得完整。
并上机进行调试验证)
(1)程序说明:
下列程序完成的是插入排序功能:
数组a中存放一个递增数列,输入一个整数x,将它插入到数组中,使之仍为一个有序数列。
#include"stdio.h"
#defineN10
voidmain()
{
inta[11]={1,10,20,30,40,50,60,70,80,90},x,i,p;
scanf("%d",&x);
for(i=0,p=N;iif(x{
p=i;
_break_;
}
for(i=N-1;i>=p;_i--__)
a[i+1]=a[i];
_a[p]=x___;
printf("%d",x);
for(i=0;i<=N;i++)
printf("%5d",a[i]);
printf("\n");
}
(2)程序说明:
下面程序完成的是折半查找。
A数组中存放的是n个由大到小已经排好序的数列,从这n个数中查找x的值是否存在。
其基本思想是:
在查找范围里,将x与处于中间位置上的数比较,如果相等,则查找成功,如果小于该元素,则在较小的一半元素里再进行折半查找;如果x大于该元素,则在较大的一半元素里再进行折半查找。
变量top,bottom,mid分别指向查找范围的顶部、底部和中间位置。
#include"stdio.h"
#definen10
main()
{
inta[n],find;
intx,i,top,bottom,mid;
printf("inputthesortednumbers:
\n");
for(i=0;iscanf("%d",__&a[i]___);
printf("inputthenumbertofind:
\n");
scanf("%d",&x);
find=0;top=0;bottom=n-1;
if(x<=a[0]&&top<=bottom)
while(!
find&&top<=bottom)
{
mid=mid=(bottom+top)/2;
if(x==a[mid])
{
find=1;
printf("x=%dposition=%d\n",x,mid);
}
elseif(x>a[mid])
bottom=mid-1;
else
top=mid+1;
}
if(find==0)printf("thenumber%disnotinthetable",x);
}
(3)程序说明:
下面程序分别输出方阵中主对角线、副对角线上元素的和suml和sum2(主对角线为从矩阵的左上角至右下角的连线,副对角线为从矩阵的右上角至左下角的连线).
#include"stdio.h"
#defineSIZE5
voidmain()
{
inta[SIZE][SIZE],m,n,sum1,sum2;
for(m=0;mfor(n=0;nscanf("%d",&a[m][n]);
sum1=sum2=__0__;
for(m=0;m{
sum1=sum1+a[m][m];
sum2=sum2+a[m][SIZE-1-m];
}
printf("sum1=%dsum2=%d\n",sum1,sum2);
}
(4)程序说明:
下面程序打印出如下所示的杨辉三角行(打印10行)。
1
11
121
1331
14641
15101051
…….
#include"stdio.h"
voidmain()
{
inti,j,a[10][10]={{1},{1,1}};
for(i=2;i<10;i++)
{
a[i][0]=1;_a[i][i]=1;
for(j=0;j
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
for(i=0;i<10;i++)
{
for(j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
3.程序设计(根据题意编写程序并上机进行调试)。
(1)编写程序完成如下功能:
输入10个数存入一维数组,然后再按逆序重新存放后输出。
#include
voidmain()
{
inta[10],i,temp;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
for(i=0;i<5;i++)
{
temp=a[i];
a[i]=a[9-i];
a[9-i]=temp;
}
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
}
(2)编写程序完成如下功能:
从键盘输入两个字符串ch2、ch1,然后将字符串ch2连接到字符串ch1的后面,并输出连接后的字符串。
#include
#include
voidmain()
{
charch1[20],ch2[10];
inti,j;
scanf("%s",ch1);
scanf("%s",ch2);
j=strlen(ch1);
for(i=0;ich1[j]=ch2[i];
ch1[j]='\0';
printf("%s\n",ch1);
}
(3)编写程序完成如下功能:
现有两个已按升序排好的数组,将它们合并为一个升序排序的数组(归并排序)。
算法:
两个数组合并时,可为每个数组各安排一个指针,从第一个元素开始依次比较两数组对应元素,小的取下来顺序放入新的数组,取下所指元素的指针后移,再比较,依此类推,直到其中一个数组的元素已全部放入新数组,再把另一数组余下的元素全部顺序放入新数组,归并完成。
编程并上机调试运行。
(1)用选择法对10个整数排序。
10个整数用scanf函数输入。
#include
voidmain()
{
inti,j,min,temp,a[11];
printf("enterdata:
\n");
for(i=1;i<=10;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("Theorginalnumbers:
\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]);
printf("\n");
for(i=1;i<=9;i++)
{
min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
printf("\nThesortednumbers:
\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]);
printf("\n");
}
(2)有15个数存放在一个数组中,输入一个数,要求用对半查找法找出该数是数组中第几个元素的值。
如果该数不在数组中,则输入“无此数”。
以15个数用赋初值的方法在程序中给出。
要找的数用scanf函数输入。
#include
voidmain()
{
inti,number,top,bott,mid,loca,a[15],flag=1,sign;
charc;
printf("enterdata:
\n");
scanf("%d",&a[0]);
i=1;
while(i<15)
{
scanf("%d",&a[i]);
if(a[i]>=a[i-1])
i++;
else
printf("enterthisdataagain:
\n");
}
printf("\n");
for(i=0;i<15;i++)
printf("%5d",a[i]);
printf("\n");
while(flag)
{
printf("inputnumbertolookfor:
");
scanf("%d",&number);
sign=0;
top=0;
bott=14;
if((numbera[14]))
loca=-1;
while((!
sign)&&(top<=bott))
{
mid=(bott+top)/2;
if(number==a[mid])
{
loca=mid;
printf("Hasfound%d,itspostionis%d\n",number