SQL上机试题及步骤

来源:互联网 发布:tomcat设置临时域名 编辑:程序博客网 时间:2024/06/07 06:55

 

《数据库系统原理》   

  练习用SQL语言创建表

3-1 练习用SQL语言创建数据库及表并设置主键

选择【开始】|【程序】 |MicroSoft SQL Server|【企业管理器】,在【菜单】上,选择【工具】|【查询分析器】,,

在【查询分析器】窗口键入

                    create database 学生数据库

在菜单中,单击查询/执行,右击对象浏览器窗口,在弹出的菜单中,单击刷新,得到图3-1

其中,学生数据库的用户表为空。即,创建了一个空数据库。

3-1

以下,将在学生数据库内,创建三个表它们是,学生表,课程表和学生选课表组成:

 

SQL语言创建学生表并`设置主键。

l  在【SQL查询分析器】窗口,键入SQL语句,

l  在工具拦上,拉下列表框,选择【学生数据库】,点击工具拦上的【执行/查询】按钮,

l  然后在【对象浏览器】里,【刷新】学生数据库,请看图3-2

 

在工具栏内应该选择学生数据库,而不是master

 

3-2SQL语言创建学生表并设置主键

SQL语句保存在自己的文件夹中。

 

l  请按相同方法,练习创建课程表和学生选课表。

l  保存建表的SQL语句到我单位SQL文件夹中

从图3-2看出,用关键字primary key及要把某列当成主键的列名组合一起,来设置主键,即:把学生号设成主键,有:primary key(sno)。此外,在【对象浏览器】里,刷新学生数据库后,不但可以找到学生表的各个列,而且可以找到学生表的主键约束。

练习创建课程表时设置主键。请看图3-3

3-3

SQL语句保存在自己的文件夹中。

 

从图3-3看出,

l  若在创建表之前,有一条“use学生数据库“语句,那么可以不在乎工具拦上的列表框内是么的数据库。 

l  可以用constraint……prijary key两个关键字来设置主键,跟在constraint后面的是主键名pk_课程表,主键名是自己命名的.

l  在【对象浏览器】里,可以看到主键名”pk_课程表(主键约束)

 

练习在创建学生选课表时设置两个字段为主键。请看图3-4

3-4设置两个字段为主键

SQL语句保存在自己的文件夹中。

从图3-4看出,用关键字primary key及两个列名,来设置主键,即:若把学生号及课程号设成主键,则有:primary key(snocno)

 

以下是出的题目,根据这个题目,用以上的SQL语句创建表。

1.学生表

列名

数据类型

长度

允许空

说明

Sno

Char

4

学生号

Sn

Char

8

学生名

Sex

Char

2

性别

Age

int

 

年龄

Dept

Int

 

学生所在系

 

2.课程表

列名

数据类型

长度

允许空

说明

cno

Char

4

课程号

cn

Char

19

 

 

3.学生选课表

列名

数据类型

长度

允许空

说明

sno

Char

4

学生号

cno

Char

4

课程号

grade

int

 

分数

 

3 2 练习在数据表中用check关键字设置约束

练习在创建学生表时用check关键字设置三个约束,请看图3-5

把原来的学生表删除,再建立一个包含有约束的学生表

 

在工具栏内应该选择学生数据库,而不是master

 

3-5创建学生表时用check关键字设置三个约束

SQL语句保存在自己的文件夹中

以后在向表输入数据时,应该遵守这三个约束

l  check (age between 15 and 45 ),

表示学生年龄限定在15 45之间,老师的系统给的约束名可以在【对象浏览器】里找到,即:CK__学生表__AGE__4BAC3F29

l  check (sex ='' or sex = ''),

表示学生性别只可能是男或女两个字,老师的系统给的约束名为:

CK__学生表__SEX__4CA06362

l  check (dept >=1 and dept <=6) )

      表示学生所在的系只可能是1系至6系之间,老师的系统给的约束名为:

      CK__学生表__DEPT__4D94879B

 

你的系统给约束名是?

3-3 练习在数据表中设置外键约束以建立多张表之间的连系

观察学生表,课程表及学生选课表看到,

l  学生选课表里的学生必须是学生表中的学生,

l  学生选课表中学生所选的课程,必须是课程表里的课程,

l  因此,设置外键约束以建立多张表之间的连系.

 

练习: SQL 语句创建设置外键约束的学生选课表。请看图3-6

 

把原来的学生选课表删除,再建立一个包含有外键约束的学生选课表

 

3-6

SQL语句保存在自己的文件夹中

 

从图3-6看到,

l  对学生表的外键约束,就是foreign key(SNO) references学生表(SNO)语句

l  对学生表的外键约束名是:FK__学生选课表__SNO__5441852A

l  只有删除了对学生表的外键约束,才能删除学生表。

l  对课程表的外键约束,就是foreign key(CNO) references课程表(CNO)语句

l  对课程表的外键约束名是:FK__学生选课表__CNO__5535A963

l  只有删除了对课程表的外键约束,才能删除课程表。

 

  练习用SQL语言向表添加数据和修改数据

4-1  练习用insert into……..values(….).语句向表添加一行数据,

l  在学生表中有八行数据,如表6所示

6学生表

 

Sno

Sn

Sex

Age

Dept

1

S1

徐琳

17

2

2

S2

李国华

18

6

3

S3

徐萍

20

1

4

S4

林新明

23

6

5

S5

张家杰

19

6

6

S6

张婷

21

3

7

S7

赵大地

18

6

8

S8

赵树林

19

3

  

练习用SQL语句在学生表中插入表6所示八行数据..从图4-1看出,每一条insert into,,.values(..)语句,只能在表中插入一行数据,即:

 

insert into 学生表 values( 'S1','徐琳', '', 17,2)

insert into 学生表 values( 'S2','李国华','', 18,6)

insert into 学生表 values( 'S3','徐萍', '', 20, 1)

insert into 学生表 values( 'S4','林新明', '', 23, 6)

insert into 学生表 values( 'S5','张家杰', '', 19, 6)

insert into 学生表 values( 'S6','张婷', '', 21, 3)

insert into 学生表 values( 'S7','赵大地', '', 18, 6)

insert into 学生表 values( 'S8','赵树林', '', 19, 3)

 

在【SQL查询分析器】的工具拦上,拉下列表框,选择【学生数据库】,点击工具拦上的【查询/执行】按钮,

 

4-1

 

在【对象浏览器】里,右击【dbo.学生表】,在快捷菜单中,点击【打开】,弹出图4-2所示学生表数据

4-2

 

l  在课程表中有七行数据,如表7所示

7课程表

 

Cno

Cn

1

C1

数学

2

C2

英语

3

C3

C语言

4

C4

  数据库原理

5

C5

政治

6

C6

物理

7

C7

心理学

 

insert into 课程表 values( 'C1','数学')

insert into 课程表 values( 'C2','英语')

insert into 课程表 values( 'C3','C语言')

insert into 课程表 values( 'C4','数据库原理')

insert into 课程表 values( 'C5','政治')

insert into 课程表 values( 'C6','物理')

insert into 课程表 values( 'C7','心理学')

 

l  在学生选课表中有二十二行数据,如表8所示

8学生选课表

 

Sno

Cno

Grade

1

S1

C1

80

2

S1

C2

85

3

S1

C4

56

4

S1

C5

90

5

S1

C6

75

6

S2

C1

47

7

S2

C3

80

8

S2

C4

75

9

S2

C5

70

10

S3

C1

76

11

S3

C2

70

12

S3

C3

85

13

S3

C4

86

14

S3

C5

90

15

S3

C6

99

16

S4

C1

83

17

S4

C2

85

18

S4

C3

83

19

S5

C2

99

20

S6

C1

96

21

S6

C2

80

22

S6

C3

87

:

insert into 学生选课表values( 'S1','C1',80);

insert into 学生选课表values( 'S1','C2',85);

insert into 学生选课表values( 'S1','C6',75);

insert into 学生选课表values( 'S1','C4',56);

insert into 学生选课表values( 'S1','C5',90);

insert into 学生选课表values( 'S2','C1',47);

insert into 学生选课表values( 'S2','C3',80);

insert into 学生选课表values( 'S2','C4',75);

insert into 学生选课表values( 'S2','C5',70);

insert into 学生选课表values( 'S6','C1',95);

insert into 学生选课表values( 'S6','C2',80);

insert into 学生选课表values( 'S6','C3',87);

insert into 学生选课表values( 'S3','C1',75);

insert into 学生选课表values( 'S3','C2',70);

insert into 学生选课表values( 'S3','C3',85);

insert into 学生选课表values( 'S3','C4',86);

insert into 学生选课表values( 'S3','C5',90);

insert into 学生选课表values( 'S3','C6',99);

insert into 学生选课表values( 'S4','C1',83);

insert into 学生选课表values( 'S4','C2',85);

insert into 学生选课表values( 'S4','C3',83);

insert into 学生选课表values( 'S5','C2',99);

 

4-2  练习向表添加一行中的部份数据

练习向学生表插入一行不包括有年龄列的数据..请看图4-3

在工具栏内应该选择学生数据库,而不是master

 

4-3向表添加部份数据的SQL语句

 

向表添加一行中的部份数据,只有当表中的列允许为空时才行。从图4-3左边的【对象浏览器】看到: AGE (int, Null)中的Null,,这表示,向表添加数据时允许Age列为空。刚刚插入学生表的数据如图4-4的第九行所示。

 

4-4向表添加部份数据

 

4-3  练习用alter table…add …语句向表增加一列数据

练习向学生表增加一个列名叫classnum(班号)的字段,见图4-5

4-5向表添加一个列

从图4-5看到:

l  图的中间部份是,向学生表增加一个列的SQL语句,其中,alter table….add..是关键字,classnum 是列名。跟在列名后面的是本列的数据类型:int

l  alter table…add column…语句向表增加的列,必定是允许空(null)值。

l  右边部份是学生表数据,其classnum 是新增加的那个列

l  其新增加的classnum列还没有数据。

 

练习向课程表增加一个列名叫teachername(老师名)的字段.,请看图4_6

在工具栏内应该选择学生数据库,而不是master

 

4_6向课程表增加一个teachername字段

4-4  练习用alter table…add check…语句增加一个约束

:练习限定学生的分数在0100之间,请看图4-7和图4-8

在工具栏内应该选择学生数据库,而不是master

 

4-7增加一个约束

在工具栏内应该选择学生数据库,而不是master

 

4-8增加一个约束并给定约束名

 

由【对象浏览器】看到:

l  4-7,用语句alter table…add check….增加的约束,由系统给定约束名

CK__学生选课表__GRADE__66487DDT

l  4-8,用语句alter table…add constraint check…增加的约束,由用户给定约束名,

约束名为【分数约束名】

4-5  练习用update…set….where….修改某一行中的某一列数据

练习把学号为S1的学生所在的系改成6系。请看图4-9

在工具栏内应该选择学生数据库,而不是master

 

4-9

 

4-9中,

l  右上部为修改之前的学生表数据,

l  右下部为执行update..set..where..语句之后的学生表数据,

l  其中,修改的某列数,由跟在关键字set后面的具有等号的SQL语句确定,

即:set dept = 6..而修改那行数据,则由具有等号的条件式确定,

即:where sno = ‘s1’.

4-6  练习修改某一列的多行数据

练习: 给分数低于60 分的学生加5分,请看图4-10

在工具栏内应该选择学生数据库,而不是master

 

4-10修改多行中的某一列数据

 

 

l  右下部为执行SQL语句之后的学生选课表数据,

l  右上部为执行之前

l  由于在条件式where. Grade < 60中,使用了不等式,所以,学生选课表中的第3行与第6行,共两行数据发生了变化, 

l  我们看到,用一条update….语句,只能修改一列数据。

 

  练习删除表、表的约束、字段及数据

5-1  练习用alter table …drop…语句删除表中的外键约束

练习删除学生选课表中的两个外键约束

在【查询分析器】中,展开【对象浏览器】,点击【学生选课表】,点击【约束,找到外键约束名,在查询窗口中,键入SQL语句,在工具栏中,点击【执行查询】,请看图5_1.

在工具栏内应该选择学生数据库,而不是master

 

5_1删除两个外键约束

 

l  在【对象浏览器】中,刷新学生选课表中【约束】,于是两个外键约束消失了。

l  应该注意的是,由于外键约束是表之间的约束,因此,只有删除了外键约束,才能删除相联的表。

5-2 练习用alter table …drop…语句删除表中的约束

练习删除学生表中的两个检查约束

在【查询分析器】中,展开【对象浏览器】,点击【学生表】|【约束,找到检查约束名sex_chkage_chk,在查询窗口中,键入SQL语句,在工具栏中,点击【执行查询】,请看图5-2

在工具栏内应该选择学生数据库,而不是master

5-2

 

在【对象浏览器】中,刷新学生表中【约束】,于是两个检查约束消失了。

5-3  练习用alter table .. drop column…..语句删除表中的字段

练习删除学生表中的字段classnum.

我们在【查询分析器】中,展开【对象浏览器】,点击【学生表】,点击【列】,找到字段【classnum,如图5_3左侧.,classnum字段,是由图4_5SQL语句产生。然后在【查询】窗口,键入SQL语句]如图5_3右侧,

在工具栏内应该选择学生数据库,而不是master

 

5_3删除学生表中的字段classnum

 

从图5_3的右上部的【查询】窗口看到:

l  删除字段,要用”drop column字段名”, column的中文意思是字段

l  字段名要在【对象浏览器】|【学生表】|【列中寻找.

我们看到:

l  在工具拦中,,点击【执行查询】, ,

l  然后,在【对象浏览器】中,右击【学生表】,在弹出的快捷菜单中,点击【刷新】,

l  同样,”alter table学生表drop column dept”语句,可删除dept字段.,

l  在【对象浏览器】中,字段classnum及字段dept两个都消失了.,如图5_4所示.

.

5_4点击【刷新】后

 

5-4 练习用delete from….where....语句从表中删除一行数据

练习从学生表中删除学生号为S1的那一行数据。

 

在工具栏内应该选择学生数据库,而不是master

 

5_5

 

从图5_5的右上部的【查询】窗口中的SQL语句看到:

l  “delete from 学生表表示要从学生表中删除数据

l  “where….”是一个条件式, 表示满足什么条件,表中的数据就可删除.,

l  “where sno = 'S1' “, 表示列名sno 等于S1的那行数据要删除

l  sno 字段是主键, 满足where sno = 'S1'条件,只可能有一行数据.

l  只删除一行数据

点击【执行查询】按钮后,从图5_5【查询】窗口下部的【消息】选项看到,,执行查询失败了,其原因是,

l  在学生选课表中有一个外键约束,其名为:

FK__学生选课表__SNO__2FCF1A8A

这个外键约束把学生表的主键SNO与学生选课表联系在一起.

l  为了删除学生表中的数据。首先要删除学生选课表中包含有S1的数据。

,在工具栏内应该选择学生数据库,而不是master

 

5_6删除学生选课表中包含有S1的数据

 

从图5_6看到:

l  图中左部的SQL语句,用来删除在snoS1条件下,学生选课表的数据。

l  图的右部为,在执行SQL语句之前的学生选课表的数据。表中,有5行,sno列的数据为S1.

l  图的中部为,执行SQL语句之后的学生选课表的数据,表中sno列中的S1数据被删除了。

 

再一次练习从学生表中删除学生号为S1的那一行数据。如图5_7

在工具栏内应该选择学生数据库,而不是master

 

5_7

从图5_7看到

l  如图5-7左部为再一次执行图5-5所示的SQL语句,我们获得了成功,。

l  5_7右部显示了,学生选课表的数据,表中没有S1.

l  5_7中上部显示了学生表原有数据,,表中有S1

l  5_7中下部为删除了snoS1后,学生表的数据。

l  比较这三张数据表看出,只有学生选课表中没有S1.学生表的学生号为S1的那一行数据才能被,删除。

 

5-5  练习用delete from….where....in,,....语句从表中删除多行数据

练习删除课程号为c1,c3,c6的课程。

在工具栏内应该选择学生数据库,而不是master

 

5_8

 

从图5_8的右上部的【查询】窗口中的SQL语句看到:

l  “delete from课程表表示要从课程表中删除数据

l  “where….”是一个条件式, 表示满足什么条件,表中的数据就可删除.,

l  “where cno in ('c1' , 'c3' , 'c6') “, 表示表中包含有列名cno等于c1或者等于c3或者等于c6的那些数据行要删除

点击【执行查询】按钮后,从图5_8【查询】窗口下部的【消息】选项看到,,执行查询失败了,其原因是,

l  在学生选课表中有一个外键约束,其名为:

 FK__学生选课表__CNO__7F60ED59

这个外键约束把课程表的主键CNO与学生选课表联系在一起.

l  为了删除课程表中的数据。首先要删除学生选课表中包含有C1,C3,C6的数据。如图5_9所示.

,在工具栏内应该选择学生数据库,而不是master

 

5-9删除学生选课表中包含有c1, c3, c6的数据

 

从图5_9看到:

l  图中右部的SQL语句,用来删除cnoc1,或者为c3,或者为c3时,学生选课表的数据。

l  在执行SQL语句之后。学生选课表中,有11行数据被删除

 

再一次练习删除课程号为c1,c3,c6的课程。如图5_10

在工具栏内应该选择学生数据库,而不是master

 

5_10

从图5_10看到

l  5-10的【查询】窗口为图5-8所示的SQL语句,在工具拦中,点击【执行查询】后,我们获得了成功,。

l  5_10右下部的【消息】选项,表示了,课程表中,有三行的数据被删除.

从图5-11的课程表与学生选课表两张表看出,包含有c1, c3, c6的数据行被删除

5_11课程表与学生选课表

5-6  练习用delete from….语句删除表中每一行数据

练习删除学生表的所有行数据。

在工具栏内应该选择学生数据库,而不是master

 

5_12

从图5_12的右上部的【查询】窗口中的SQL语句看到:

l  “delete from 学生表表示要从学生表中删除所有数据

点击工具拦的【执行查询】按钮后,从图5_12【查询】窗口下部的【消息】选项看到,,执行查询失败了,其原因是,

l  在学生选课表中有一个外键约束,其名为:

FK__学生选课表__SNO__2FCF1A8A

这个外键约束把学生表的主键SNO与学生选课表联系在一起.

l  为了删除学生表中的所有数据。首先要删除学生选课表中的所有数据。如图5_13

在工具栏内应该选择学生数据库,而不是master

 

5_13

从图5_13看到:

l  从【查询】窗口中的SQL语句看到:“delete from学生选课表表示要从学生选课表中删除所有数据,

l  点击工具拦的【执行查询】按钮后,从图5_13【查询】窗口下部的【消息】选项看到: (所影响行数为 22),,删除了22行数据

l  重新打开【学生选课表】,如图5-3中下部所示,学生选课表的所有数据消失了.

再一次练习删除学生表的所有行数据,如图5-14

在工具栏内应该选择学生数据库,而不是master

5_14

从图5_14看到

l  图右部为原学生表的所有8行数据

l  再一次执行与图5_12一样的SQL语句”delete from学生表,。

l  从【查询】窗口下部的【消息】选项看到: (所影响行数为 8),,我们获得了成功,

l  重新打开【学生表】,如图左下部所示,学生表的所有8行数据消失了.

5-7  drop table..…命令删除表

练习删除学生数据库的所有数据表

在工具栏内应该选择学生数据库,而不是master

5_15

从图5-15看到:

l  在学生选课表中有两个外键约束,其名为:

FK__学生选课表__SNO__2FCF1A8A

FK__学生选课表__SNO__2FCF1A8A

l  一个外键约束把学生表的主键SNO与学生选课表联系在一起.,另一个把课程表的主键CNO与学生选课表联系在一起.

l  为了删除表,首先要删除学生选课表,然后再删除另为两张表.

l  从【查询】窗口下部的【消息】选项看到: “命令已成功完成,,我们获得了成功,

l  在【对象浏览器】中,刷新学生数据库,结果在【对象浏览器】|【用户表】中,

    学生选课表,学生表,课程表消失了,如图5-16所示

在工具栏内应该选择学生数据库,而不是master

 

5-16  D:\我的SQL

删除学生数据库。drop database学生数据库

六练习用SQL语言实现数据查询--------第三次上机的内容

 6-1练习用select …from…语句从表中检索数据

在对数据库中的数据表进行查询之前,应该完成创建数据库,创建表及向表输入数据三个步骤。

要在D盘建立文件夹我的SQL

1.  创建学生数据库

Create Database 学生数据库

On

  (Name =学生数据库_数据文件,

       Filename = 'D:\我的SQL\学生数据库_数据文件.mdf' ,

         Size = 2,

         Maxsize = 5,

         FileGrowth = 1 )

Log On

(Name =学生数据库_日志文件,

          Filename = 'D:\我的SQL\学生数据库_日志文件.ldf',

          Size = 1MB,

          Maxsize = 2MB,

          FileGrowth = 1MB )

   Go

 

 

2.创建表

l  创建学生表的SQL语句

               create table学生表

( SNO char(4) ,

SN  char(8) not null,

SEX char(2) not null,

AGE int  not null,

DEPT int not null,

primary key(SNO),

check (AGE BETWEEN 15 AND 45 ),

check (SEX ='' or SEX = '')

)

l  创建课程表的SQL语句

create table 课程表

( CNO char(4);

CN  char(12) not null ;

  primary key(CNO)

)

l  创建学生选课表的SQL语句

        create table学生选课表

( SNO char(4),

 CNO char(4) not null,        

           GRADE int null,

primary key(SNO,CNO),

foreign key(SNO) references学生表(SNO),

foreign key(CNO) references课程表(CNO)

)

3.向表输入数据

l  向学生表表输入数据的SQL语句

insert into 学生表 values( 'S1','徐琳', '', 17,2)

insert into 学生表 values( 'S2','李国华','', 18,6)

insert into 学生表 values( 'S3','徐萍', '', 20, 1)

insert into 学生表 values( 'S4','林新明', '', 23, 6)

insert into 学生表 values( 'S5','张家杰', '', 19, 6)

insert into 学生表 values( 'S6','张婷', '', 21, 3)

insert into 学生表 values( 'S7','赵大地', '', 18, 6)

insert into 学生表 values( 'S8','赵树林', '', 19, 3)

l  向课程表表输入数据的SQL语句

insert into 课程表 values( 'C1','数学')

insert into 课程表 values( 'C2','英语')

insert into 课程表 values( 'C3','C语言')

insert into 课程表 values( 'C4','数据库原理')

insert into 课程表 values( 'C5','政治')

insert into 课程表 values( 'C6','物理')

insert into 课程表 values( 'C7','心理学')

l  向学生选课表表输入数据的SQL语句

insert into 学生选课表 values( 'S1','C1',80); insert into学生选课表 values( 'S1','C2',85);

insert into 学生选课表 values( 'S1','C6',75);insert into学生选课表 values( 'S1','C4',56);

insert into 学生选课表 values( 'S1','C5',90); insert into学生选课表 values( 'S2','C1',47);

insert into 学生选课表 values( 'S2','C3',80);insert into学生选课表 values( 'S2','C4',75);

insert into 学生选课表 values( 'S2','C5',70);insert into学生选课表 values( 'S6','C1',95);

insert into 学生选课表 values( 'S6','C2',80); insert into学生选课表 values( 'S6','C3',87);

insert into 学生选课表 values( 'S3','C1',75); insert into学生选课表 values( 'S3','C2',70);

insert into 学生选课表 values( 'S3','C3',85); insert into学生选课表 values( 'S3','C4',86);

insert into 学生选课表 values( 'S3','C5',90); insert into学生选课表 values( 'S3','C6',99);

insert into 学生选课表 values( 'S4','C1',83); insert into学生选课表 values( 'S4','C2',85);

insert into 学生选课表 values( 'S4','C3',83);insert into学生选课表 values( 'S5','C2',99);

 

在完成创建数据库,创建表及向表输入数据三个步骤之后,在查询分析器上应该找到这三张表,如图6-1所示.

6-1学生表,课程表及学生选课表的数据

 

练习:用“select * from课程表语句,从课程表中检索所有列的数据,语句中的“*”表示表中的所有列,请看图6-2 .,在工具栏内应该选择学生数据库,而不是master

在工具栏内应该选择学生数据库,而不是master

 

6-2最简单的数据查询语句

 

应该注意的是,如果表中的列有5000行或更多时,检索将耗费许多时间。

练习:从学生选课表中,检索出学生号,并在结果中,学生号不许重复。

在工具栏内应该选择学生数据库,而不是master

6-3用关键字distinct来消除重复的行

 

从图6-3 .看出,在列名的前面加上关键字distnct,,就可在结果中消除重复的行.,反之,请看图6-4.

在工具栏内应该选择学生数据库,而不是master

6-4从学生选课表中捡索学生号时出现重复的行

 

6-2 练习用where子句来限定查询条件

where 子句用来限定查询条件,可用条件表达式,也可以用关键字来,

l  条件表达式又有两种,它们是:

算术表达式: >, <, =, <>, >=, <=,  !>, !<, !=

逻辑表达式:NOT, AND, OR

l  关键字是:between,  in, not in

 

      练习:从学生中,检索出分数大于85,小于95之间的学生号及课程号,并用汉字显示其属性.,请看图6-5,在工具栏内应该选择学生数据库,而不是master

6-5 where子句中使用条件表达式

 

练习:从学生中,检索出学号分别为S2S4S6的学生姓名,年龄,并用汉字显示其属性.

请看图6-6,在工具栏内应该选择学生数据库,而不是master

\

6-6where子句中使用关键字in

 

6-3 练习多表查询

实际中,需要从多个数据表查询数据,为此先要实现多张表连结,然后,再对相连的表进行查询.

实现多个数据表相连,有两种方式,

l  一种是把多张表的名字写在from的后面,然后用where子句限定表之间的连接条件

l  另一种是用join on两个关键字, join用于连接两张表, on用于给出两张表相连条件.

 

练习:检索李国华同学所学课程的课程号,课程名和成绩,结果标题用中文

解决这个问题,一种方法是图6-7所示:。在工具栏内应该选择学生数据库,而不是master

6-7实现多个数据表相连

 

          另一种方法是图6-8所示:在工具栏内应该选择学生数据库,而不是master

6-8from…join… on….join…on…语句实现多个数据表相连

6-4 练习自表查询

练习检索所有比徐萍年龄大的学生姓名,年龄,性别以及徐萍的年龄,结果标题用中文。请看图6-9。在工具栏内应该选择学生数据库,而不是master

6-9自表查询

我们看到:自表查询的特点:

l  只可能在一张学生表中进行查询。

l  ”from学生表1 ,学生表2” 表示从两张学生表进行操作.

l  用条件式 ” where学生表2..SN = ‘徐萍’  ”限制学生表2为徐萍的资料

l  用条件式 ” where学生表1.age >学生表2.age”限制学生表1的资料为比徐萍年龄大的学生

l  ”select ……”语句,从这两张表检索数据.

 

6-5 练习用like子句实现摸糊查询

like子句,必需与指定的符号联合起来,以构成查询条件。例如:

l  %’ 表示第一个字母为刘,跟着刘后面的字母可以是任意的

l  ‘5%’ 表示第一个数字为5,跟着5后面的数字可以是任意的

式中, %表示任意多个任意字符,或任意多个任意数字

 

练习检索姓赵的学生所在的系以及所选的课程名,结果标题用中文。请看图6-10,在工具栏内应该选择学生数据库,而不是master

6-10like子句实现摸糊字符查询

 

练习检索学生成绩高于90分的学生名,所选的课程名以及成绩,结果标题用中文。请看图6-11,在工具栏内应该选择学生数据库,而不是master

6-11like子句实摸糊数字查询

****

  练习复杂数据查询--------第三次上机的内容

7-1练习用多条select…from.. where…语句实现嵌套查询

7-1-1 练习在一张表上的嵌套查询

练习:查出与张婷同一个系的学生名。结果标题用中文。请看图7-1,在工具栏内应该选择学生数据库,而不是master

7-1 在一张表上的嵌套查询

 

练习:查出和赵树林同年龄的学生名。其结果将不包括赵树林本人,结果标题用中文。

为了便于理解,把SQL语句分成三部分,

l  首先用子句找出赵树林的年龄是19

l  然后找出年龄为19的学生名,

l  最后用in关键字把以上两部分连系起来,查出和赵树林同年龄的学生,并用”<>”运算排除赵树林,

请看图7-2,在工具栏内应该选择学生数据库,而不是master

7-2  领会嵌套查询进行的次序

 

我们看到:

l  跟在符号”--“后面的字符是解释语句,解释语句对运行SQL查询不产生影响.

l  查询进行的次序是:

u  先执行小括号内的子查询,把这个子查询结果放入到主句中之后,再执行主句。即:先找出赵树林的年龄19

u  再找出年龄为19的学生名,并把赵树林的名字除去。

l  一张表上的嵌套查询只可能有一层嵌套. .

我们看到, 在查询分析器上, 可以有多条SQL语句.及多条查询结果.,

 

7-1-2 练习在多张表上的嵌套查询

在多张表上进行的嵌套查询,可以是一层,也可以是多层.

练习:找出同时选学课程号为C3 C5的学生号,学生名和性别,请看图7-3

在工具栏内应该选择学生数据库,而不是master

  7-3多张表上的嵌套查询

这里,

l  第一步是选学课程号为C5的学生号,

l  第二步是选学课程号为C3的学生号,学生名和年龄,

l  第三步是第一步与第二步的运算,是本题的结果。

 

练习:找出选学课程号为C3和课程名为政治的学生号和学生名,在工具栏内应该选择学生数据库,而不是master

7-4两层嵌套查询

请看图7-4

l  这里,嵌套有两层,

u  第一层是找出课程名为政治的课程号是C5

u  第二层是找出选学课程号C5的学生号是S1, S2 ,S3.

l  查询进行的次序是:

n  第一步是找出课程名为政治的课程号是C5

n  第二步找出,由第一步找出的课程号为C5的学生号是S1, S2 ,S3.,

n  第三步是找出选学课程号为C3的学生号和学生名,

n  第四步是第二步与第三步的运算,是本题的结果。

l  数据表越多可以嵌套的层次也越多。

 

7-1-3 练习使用not in关键字的嵌套查询

练习::找出没有选择课程号为C3的学生名。请看图7-5 , 在工具栏内应该选择学生数据库,而不是master

 

7-5使用not in关键字的嵌套查询

 

查询进行的次序是:

1.         第一步是在学生选课表中,找出课程号是C3的学生号,它们是:S2, S3, S4, S6,

2.         第二步是在学生表中。找出学生号不是S2, S3, S4, S6 的学生名,

3.         第三步是把第一步插入到第二步, 是本题的结果。

 

7-1-4 练习使用 exists,  not exists关键字的嵌套查询

1exists关键字,

 

.练习:查询选修了课程号为C4的学生号和学生名。分别用existsin两种关键字来查询.

第一.   exists 关键字,请看图7-6,在工具栏内应该选择学生数据库,而不是master

7-6  使用 exists关键字的嵌套查询

我们看到:

l  这里,不能把嵌套子句 (select * from学生选课表where CNO = 'C4')的结果代入到外围查询中,再执行外围查询。

l  而是,服务器执行每一行外围查询语句都要运行一次嵌套子句(select * ……),在运行嵌套子句(select * ……)时,如果匹配,就退出嵌套子句,再运行下一条外围查询。

  应该注意的是:

l  exists关键字的嵌套查询中,外围查询的数据表与嵌套子句中的数据表之间连接,是通过嵌套子句中,列出两张表连接条件。即:学生选课表.sno = 学生表.sno”

l  在嵌套子句(select * ……)中,跟在select关键字后面的是*号,而不是列名。

 

第二.   in关键字来实现,查询选修了课程号为C4的学生号和学生名,如图7-7,在工具栏内应该选择学生数据库,而不是master

7-7 比较in关键字与exists关键字的区别

 

2.        not exists关键字的嵌套查询,

SQL语句结构上,not existsexists关键字的嵌套查询相同。两者不同的是,使用

not exis关键字能方便地解决“没有。。。”, “不存在。。。,“所有。。。”一类查询难题。

 

练习::找出没有选择课程号为C3的学生名。请看图7-8,在工具栏内应该选择学生数据库,而不是master

  

7-8 使用 not exists关键字解决“没有。。。一类的查询难题

 

练习:捡索选学了所有课程的学生名和学生号。

这道题也可以这样说:捡索不存在没有选学的课程的学生名和学生号。请看图7-9

这道题分两步:在工具栏内应该选择学生数据库,而不是master

7-9 使用 not exists关键字解决“所有。。。”一类的查询难题

 

第一步:捡索课程表中的课程,这些课程在学生选课表中不存在

第二步:

l  如果第一步没有结果,表示不存在这样的学生,没有课程,他们没有选,即:存在选学了所有课程的学生。

l  如果第一步有结果,表示存在这样的学生,有课程,他们没有选,即:不存在选学了所有课程的学生。

本题结果是,没有选学了所有课程的学生。

 

7-2 练习使用统计函数的查询**

    在查询中,用统计函数来统计计算所有行的数据。

练习:检索学校中有多少个学生,多少个系,学生的平均年龄,学生最大年龄,学生最小年龄。结果标题用中文。请看图7-10。在工具栏内应该选择学生数据库,而不是master

7-10 使用统计函数的查询

 

7-3 练习使用group by子句实现分组查询

在查询中,用统计函数,来统计计算所有行的数据。.如果要对某些行的数据进行统计分析,例如,按性别计算学生的平均年龄,这时,只须使用group by子句,对表按“性别”列中的“男”行或“女”行进行分组,分组后再进行统计计算。

group by子句的两个特点是:

l  跟在关键字group by后面的列名,应该与跟在关键字select后面的列名相同。

l  跟在关键字group by后面的列可以是任意多

练习:按性别计算学生的平均年龄。请看图7-11:在工具栏内应该选择学生数据库,而不是master

7-11使用group by子句对某些行的数据进行统计分析

 

练习:按学生的学号,性别,年龄来计算学生的平均成绩。结果标题用中文。请看图7-12,在工具栏内应该选择学生数据库,而不是master

7-12跟在group by后面的列名可以是任意多而在select后面的列名可以有也可以无

 

7-4 练习使用having子句实现有条件的分组查询

having..子句有三个特点:

l  having..子句必须与group by…子句联合起来使用。

l  having..子句给出分组查询的条件

l  having..子句的分组查询条件必须是统计函数

 

练习:找出选修的课程至少四门的学生的姓名,性别,年龄,平均成绩,选课门数。结果标题用中文。看图7-13,在工具栏内应该选择学生数据库,而不是master

 

7-13 利用having..子句对分组查询进行选

 

  练习:找出选课在三门以上课程的学生的总成绩(不统计不及格的课程),并列出总成绩名次名单。结果标题用中文。请看图7-14。在工具栏内应该选择学生数据库,而不是master

7-14 利用order by 2 desc子句对结果进行降序排列

 

练习: 找出选学课程数量最多的学生。请看图7-15。在工具栏内应该选择学生数据库,而不是master

7-15利用having子句求最大值

 

练习: 学生选学的课程如果超过了四门课,则每门课加5,请更新数据库。请看图7-16

7-16where子句中使用group by…having..子句

 

比较执行update….语句之前与执行update….语句之后的学生选课表看出, grade列中的数据发生了变化.

 

上机练习题

 

课内

1.         SQL语句创建一个名字为“销售数据库”的数据库,库中有以下三张表

Article(商品号,商品名,单价,库存量)

Customer(顾客号,顾客名,性别,年龄)

Orderitem(顾客号,商品号,数量,购买价,日期)

 

Article(商品号 char(4),商品名char(16),单价 Numeric(8,2),库存量 int)     

Customer(顾客号char (4),顾客名 char (8),性别 char(2),年龄 int)

OrderItem(顾客号 char(4),商品号 char(4),数量 int,购买价 Numberic(8,2),日期 date)

2.         按一个顾客在不同的日子可以买同一商品来设立主键

3.         创建Orderitem表中的外键约束

4.         顾客年龄在10100之间,顾客姓别只可能是男或女

5.         商品的单价大于零,库存量大于10

6.         顾客购买商品的数量大于或等于一,购买的日期在2008-1-1之后。包括2008-1-1

7.         SQL语句,插入如下数据到表中

article(

S001,  计算机,  5000,  10;

S002,  打印机, 1000,  12;

S003,  洗衣机, 800,   10;

S004,  电冰箱, 1100,  20)

 

customer (

G001, 张三,男, 29;

G002, 李四,女, 25

G003,王五,女,31

G004,赵六,男,25

 

orderitem(

G001, S001, 2, 4000, 2008-1-25;

G001, S002, 1, 800,  2008-1-25;

G001, S003, 3, 800,  2008-1-25;

G001, S004, 1, 880,  2008-1-25;

G001, S001, 4, 6000, 2008-3-4;

G002, S001, 3, 4500, 2008-2-25;

G003, S001, 1, 5000, 2008-1-1;

G003, S002, 1, 1000, 2008-1-1)

 

8.         按一个顾客在不同的日子不可以买同一商品来设立主键时, Orderitem表的数据应做怎样的修改

9.         备份销售数据库, 创建备份数据库文件,xiaoshoushujuku.bak

10.    Customer插入一行不包括有年龄列的数据..

11.     Article表增加一个列名叫AticleClass(商品种类)的字段,

12.     Orderitem表增加一个列名叫Employeename(店员名)的字段.,

13.     :限定购买价在10010000之间,

14.     把顾客号为G001的顾客的年龄改成48

15.     给于2008-1-1购买商品的购买价减少100

16.     删除Orderitem表中的全部外键约束

17.     删除Article表中的两个约束

18.     删除Article表中的字段库存量

19.     Customer表中删除顾客号为G001的那一行数据。

20.     删除商品号为S002的商品。

21.     删除Article表的所有行数据。

22.     删除销售数据库的所有数据表之后,删除销售数据库

23.     利用备份数据库文件xiaoshoushujuku.bak,还原销售数据库

24.     Orderitem表中检索所有数据

25.     Orderitem表中,检索出商品号,并在结果中,商品号不许重复。

26.     检索出购买价大于500, 小于5000之间的商品号及雇员号,并用汉字显示其别名

27.     检索出雇员号分别为G002G004G006的雇员姓名,年龄,并用汉字显示其属性..

28.     检索张三所买商品的商品号,商品名和金额(金额=数量*单价),结果标题用中文

 

课外

 

1.         检索所有比李四年龄大的顾客姓名,年龄,性别以及李四的年龄,结果标题用中文。

2.         检索姓李的顾客的年龄以及所买的商品名,结果标题用中文。

3.         检索购买价高于600的顾客名,所买的商品名以及购买价,,结果标题用中文。

4.         查出与赵六同年龄的顾客名。其结果将不包括赵六本人,结果标题用中文。

5.         找出既购买商品号为S001 又购买 S002的顾客号,顾客名和性别。

6.         找出购买商品号为S001 和购买商品名为打印机的顾客号号和顾客名 

7.         找出没有购买商品号为S003的顾客号和顾客名。

8.         . 查询购买了商品号为S004的顾客号和顾客名。分别用existsin两种关键字来查询.

9.         找出没有购买商品号为S002的学生名

10.     捡索购买了所有商品的顾客名和顾客号。

11.     检索商店中有多少个商品,商品的平均购买价,商品的最高购买价,最小购买价。结果标题用中文。

12.     按性别计算顾客的平均年龄。

13.     按顾客的顾客号,性别,年龄来计算顾客购买的平均购买金额。结果标题用中文。

14.     找出购买商品至少两样的顾客的姓名,性别,年龄,平均购买价,购买商品的个数。结果标题用中文。

15.     找出购买商品在两样以上的购买总金额,并列出总金额名次名单。结果标题用中文

16.     找出购买商品数量最多的顾客。

17.    顾客购买的商品如果超过了两种,则每样商品的购买价减50,请更新数据库。

18.     检索定购商品号为‘S001’的顾客号和顾客名。                        

19.     检索定购商品号为‘S001’或‘S002’的顾客号

20.     检索男顾客的人数和平均年龄。

21.     检索订购了商品的人次数

22.    索年龄在3040岁的顾客所购买的商品名及商品单价

23.     检索购买的购买价都高于或等于1000元的顾客号和顾客名。

24.     检索女顾客购买的商品号,商品名和数量合计。

25.     customer表添加一个名字为联系电话的新字段

26.     SQL语句,增加一个约束,这个约束就是,购买商品时间限定在200811日至200851日之间

27.     customer表中删除名字为联系电话的那个字段

28.     把商品名计算机改成电脑,把顾客张三的年龄改成19, 把顾客号为G002的顾客名字改成李双双

29.     删除顾客号为G001的顾客购买的全部商品。

30.     删除顾客王五买的全部商品。

31.     SQL语句创建一个名字为“赛马数据库”的数据库,

 库中有以下四张表:会员,赛马,获胜记录,投注记录,其对应的英文名字为:Members,Horses,RRecord ,CRecord..,

表中的字段如以下所示

Members(会员编号,会员姓名,会员地址,会费)

Horses(赛马编号,赛马颜色,赛马产地)

RRecord (场次,赛马编号)

CRecord (场次,会员编号,赛马编号)

 

每张表有如下约束

l  设置每个表的主键及外键

l  会员姓名,会员地址,赛马颜色,赛马产地不能为空

l  会费不能小于零

 

赛马数据库的数据如下

Members

(M001, 张三,北京,10 M002,李四,上海,20 M003,王五,沈阳,30)

Horses

H001,红,新疆;H002,白,内蒙古;H003,黄,山西)

RRecord

1, H0032, H0023, H0014 . H001 5 H001

CRecord

( 1, M001 H0031,  M002  ,  H0032, M001 H003 2, M003 , H003

3, M001 H0014, M002 H002)

 

选作: 在销售数据库             

1.         检索至少定购商品号为‘S001’和‘S002’的顾客号。(用交的方法)                     

2.         检索至少定购商品号为‘S001’和‘S002’和‘S003’的顾客号。(用自表连接方法)                     

3.         检索没定购商品的顾客号和顾客名。                                         

4.         检索一次定购商品号‘S001’商品数量最多的顾客号和顾客名,结果标题为中文。                                     

5.         检索至少订购了一种商品的顾客数。                                       

6.        检索顾客张三订购商品的总数量及每次购买最多数量和最少数量之差。 

7.         检索至少订购了3单商品的顾客号和顾客名及他们定购的商品次数和商品总数量,并按商品总数量降序排序。 

8.         检索购买的商品的购买价至少有一次高于或等于1000元的顾客号和顾客名。 

9.         检索所有的顾客号和顾客名以及它们所购买的商品号。

10.     检索这样的顾客号,顾客名,他们定购了所有的商品       

11.     检索这样的顾客号,他们至少订购了顾客号为“G003”所订购的所有商品

12.     Article表插入一条纪录。删除无人购买的商品。(检验一下刚插入的记录是否已被删除)

13.     降低已售出的数量总合超过10000件的商品单价为原价的95%