实验5sql语句练习图书馆数据库答案.docx

上传人:b****6 文档编号:4176880 上传时间:2022-11-28 格式:DOCX 页数:21 大小:66.09KB
下载 相关 举报
实验5sql语句练习图书馆数据库答案.docx_第1页
第1页 / 共21页
实验5sql语句练习图书馆数据库答案.docx_第2页
第2页 / 共21页
实验5sql语句练习图书馆数据库答案.docx_第3页
第3页 / 共21页
实验5sql语句练习图书馆数据库答案.docx_第4页
第4页 / 共21页
实验5sql语句练习图书馆数据库答案.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

实验5sql语句练习图书馆数据库答案.docx

《实验5sql语句练习图书馆数据库答案.docx》由会员分享,可在线阅读,更多相关《实验5sql语句练习图书馆数据库答案.docx(21页珍藏版)》请在冰豆网上搜索。

实验5sql语句练习图书馆数据库答案.docx

实验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;i

if(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;i

scanf("%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;m

for(n=0;n

scanf("%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;i

ch1[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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1