# 数据库实验三:数据库查询和数据操纵
# 实验目的
- 掌握各种查询的使用方法。
- 掌握数据操纵的使用方法。
# 实验内容
根据实验 2 中给出的学生作业管理数据库以及其中的学生表、课程表和学生作业表,进行以下操作。
- 使用查询语句完成以下任务(每一个查询都要给出 SQL 语句,并且列出查询结果)。
① 查询与 “张志国” 同一班级的学生信息(使用连接查询和子查询方式)。
② 查询比 “计算机应用基础” 学时多的课程信息(使用连接查询和子查询方式)。
③ 查询选修课程号为 K002 的学生的学号,姓名(使用连接查询,普通子查询,相关子查询)。
④ 查询没有同时选修 K001 和 M001 课程的学号,姓名,课程号和三次成绩。- 使用数据操纵完成以下任务(每一个任务都要给出 SQL 语句,并且列出查询结果)。
① 在学生表中添加一条学生记录,其中,学号为 0593,姓名为张乐,性别为男,专业班级为电子 05,出生日期为 1991-01-01。
② 将所有课程的学分数变为原来的两倍。
③ 删除张乐的信息。
# 实验二 SQL 代码
USE [SCE] | |
GO | |
/****** Object: Table [dbo].[学生作业表] Script Date: 11/28/2016 14:04:33 ******/ | |
SET ANSI_NULLS ON | |
GO | |
SET QUOTED_IDENTIFIER ON | |
GO | |
SET ANSI_PADDING ON | |
GO | |
CREATE TABLE [dbo].[学生作业表]( | |
[课程号] [char](10) NOT NULL, | |
[学号] [char](10) NOT NULL, | |
[作业1成绩] [int] NULL, | |
[作业2成绩] [int] NULL, | |
[作业3成绩] [int] NULL, | |
CONSTRAINT [SC_Prim] PRIMARY KEY CLUSTERED | |
( | |
[课程号] ASC, | |
[学号] ASC | |
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] | |
) ON [PRIMARY] | |
GO | |
SET ANSI_PADDING OFF | |
GO | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K001 ', N'0433 ', 60, 75, 75) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K001 ', N'0529 ', 70, 70, 60) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K001 ', N'0531 ', 70, 80, 80) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K001 ', N'0591 ', 80, 90, 90) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K002 ', N'0496 ', 80, 80, 90) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K002 ', N'0529 ', 70, 70, 85) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K002 ', N'0531 ', 80, 80, 80) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K002 ', N'0538 ', 65, 75, 85) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K002 ', N'0592 ', 75, 85, 85) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K006 ', N'0531 ', 80, 80, 90) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'K006 ', N'0591 ', 80, 80, 80) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'M001 ', N'0496 ', 70, 70, 80) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'M001 ', N'0591 ', 65, 75, 75) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'S001 ', N'0531 ', 80, 80, 80) | |
INSERT [dbo].[学生作业表] ([课程号], [学号], [作业1成绩], [作业2成绩], [作业3成绩]) VALUES (N'S001 ', N'0538 ', 60, NULL, 80) | |
/****** Object: Table [dbo].[学生表] Script Date: 11/28/2016 14:04:33 ******/ | |
SET ANSI_NULLS ON | |
GO | |
SET QUOTED_IDENTIFIER ON | |
GO | |
SET ANSI_PADDING ON | |
GO | |
CREATE TABLE [dbo].[学生表]( | |
[学号] [char](10) NOT NULL, | |
[姓名] [char](20) NOT NULL, | |
[性别] [char](2) NOT NULL, | |
[专业班级] [char](50) NOT NULL, | |
[出生日期] [date] NOT NULL, | |
[联系电话] [char](15) NULL, | |
PRIMARY KEY CLUSTERED | |
( | |
[学号] ASC | |
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] | |
) ON [PRIMARY] | |
GO | |
SET ANSI_PADDING OFF | |
GO | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0433 ', N'张艳 ', N'女', N'生物04 ', CAST(0x0D110B00 AS Date), N' ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0496 ', N'李越 ', N'男', N'电子04 ', CAST(0x680D0B00 AS Date), N'13812902331 ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0529 ', N'赵欣 ', N'男', N'会计05 ', CAST(0x4D0D0B00 AS Date), N'13502222908 ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0531 ', N'张志国 ', N'男', N'生物05 ', CAST(0x0A110B00 AS Date), N'13312567890 ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0538 ', N'于兰兰 ', N'女', N'生物05 ', CAST(0x650D0B00 AS Date), N'13312004030 ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0591 ', N'王丽丽 ', N'女', N'电子04 ', CAST(0x820D0B00 AS Date), N'13320809766 ') | |
INSERT [dbo].[学生表] ([学号], [姓名], [性别], [专业班级], [出生日期], [联系电话]) VALUES (N'0592 ', N'王海强 ', N'男', N'电子04 ', CAST(0x3E110B00 AS Date), N' ') | |
/****** Object: Table [dbo].[课程表] Script Date: 11/28/2016 14:04:33 ******/ | |
SET ANSI_NULLS ON | |
GO | |
SET QUOTED_IDENTIFIER ON | |
GO | |
SET ANSI_PADDING ON | |
GO | |
CREATE TABLE [dbo].[课程表]( | |
[课程号] [char](10) NOT NULL, | |
[课程名] [char](50) NOT NULL, | |
[学分数] [float] NOT NULL, | |
[学时数] [int] NOT NULL, | |
[任课老师] [char](20) NOT NULL, | |
PRIMARY KEY CLUSTERED | |
( | |
[课程号] ASC | |
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] | |
) ON [PRIMARY] | |
GO | |
SET ANSI_PADDING OFF | |
GO | |
INSERT [dbo].[课程表] ([课程号], [课程名], [学分数], [学时数], [任课老师]) VALUES (N'K001 ', N'计算机图形学 ', 2.5, 40, N'胡晶晶 ') | |
INSERT [dbo].[课程表] ([课程号], [课程名], [学分数], [学时数], [任课老师]) VALUES (N'K002 ', N'计算机应用基础 ', 3, 48, N'任泉 ') | |
INSERT [dbo].[课程表] ([课程号], [课程名], [学分数], [学时数], [任课老师]) VALUES (N'K006 ', N'数据结构 ', 4, 64, N'马跃先 ') | |
INSERT [dbo].[课程表] ([课程号], [课程名], [学分数], [学时数], [任课老师]) VALUES (N'M001 ', N'政治经济学 ', 4, 64, N'孔繁新 ') | |
INSERT [dbo].[课程表] ([课程号], [课程名], [学分数], [学时数], [任课老师]) VALUES (N'S001 ', N'高等数学 ', 3, 48, N'赵晓尘 ') | |
/****** Object: Default [DF__学生表__性别__0519C6AF] Script Date: 11/28/2016 14:04:33 ******/ | |
ALTER TABLE [dbo].[学生表] ADD DEFAULT ('男') FOR [性别] | |
GO | |
/****** Object: Check [Score_Chk1] Script Date: 11/28/2016 14:04:33 ******/ | |
ALTER TABLE [dbo].[学生作业表] WITH CHECK ADD CONSTRAINT [Score_Chk1] CHECK (([作业1成绩]>=(0) AND [作业1成绩]<=(100))) | |
GO | |
ALTER TABLE [dbo].[学生作业表] CHECK CONSTRAINT [Score_Chk1] | |
GO | |
/****** Object: Check [Score_Chk2] Script Date: 11/28/2016 14:04:33 ******/ | |
ALTER TABLE [dbo].[学生作业表] WITH CHECK ADD CONSTRAINT [Score_Chk2] CHECK (([作业2成绩]>=(0) AND [作业2成绩]<=(100))) | |
GO | |
ALTER TABLE [dbo].[学生作业表] CHECK CONSTRAINT [Score_Chk2] | |
GO | |
/****** Object: Check [Score_Chk3] Script Date: 11/28/2016 14:04:33 ******/ | |
ALTER TABLE [dbo].[学生作业表] WITH CHECK ADD CONSTRAINT [Score_Chk3] CHECK (([作业3成绩]>=(0) AND [作业3成绩]<=(100))) | |
GO | |
ALTER TABLE [dbo].[学生作业表] CHECK CONSTRAINT [Score_Chk3] | |
GO |
# 实验结果
# 1. 使用查询语句完成以下任务(每一个查询都要给出 SQL 语句,并且列出查询结果)。
# ① 查询与 “张志国” 同一班级的学生信息(使用连接查询和子查询方式)。
连接查询:
SELECT 学生表1.* | |
FROM 学生表 AS 学生表1,学生表 AS 学生表2 | |
WHERE 学生表2.姓名='张志国' AND 学生表1.专业班级=学生表2.专业班级; |

子查询:
SELECT * | |
FROM 学生表 | |
WHERE 专业班级 = | |
( | |
SELECT 专业班级 | |
FROM 学生表 | |
WHERE 姓名 = '张志国' | |
); |

# ② 查询比 “计算机应用基础” 学时多的课程信息(使用连接查询和子查询方式)。
连接查询:
SELECT 课程表1.* | |
FROM 课程表 AS 课程表1,课程表 AS 课程表2 | |
WHERE 课程表2.课程名 = '计算机应用基础' AND 课程表1.学时数>课程表2.学时数; |

子查询:
SELECT * | |
FROM 课程表 | |
WHERE 学时数 > | |
( | |
SELECT 学时数 | |
FROM 课程表 | |
WHERE 课程名 = '计算机应用基础' | |
); |

# ③ 查询选修课程号为 K002 的学生的学号,姓名(使用连接查询,普通子查询,相关子查询)。
连接查询:
SELECT 学生表.学号,学生表.姓名 | |
FROM 学生作业表,学生表 | |
WHERE 学生作业表.课程号='K002'AND 学生作业表.学号 = 学生表.学号; |

普通子查询:
SELECT DISTINCT 学生表.学号,学生表.姓名 | |
FROM 学生作业表,学生表 | |
WHERE 学生表.学号 IN | |
( | |
SELECT 学生表.学号 | |
FROM 学生作业表 | |
WHERE 学生作业表.课程号 = 'K002' AND 学生作业表.学号 = 学生表.学号 | |
) |

相关子查询:
SELECT DISTINCT 学生表.学号,学生表.姓名 | |
FROM 学生表,学生作业表 | |
WHERE 学生表.学号 IN | |
( | |
SELECT 学生作业表.学号 | |
FROM 学生作业表 | |
WHERE 学生作业表.课程号='K002' | |
) |

# ④ 查询没有同时选修 K001 和 M001 课程的学号,姓名,课程号和三次成绩。
SELECT DISTINCT 学号,课程号,作业1成绩,作业2成绩,作业3成绩 | |
FROM 学生作业表 | |
WHERE 学号 NOT IN | |
( | |
SELECT 学号 | |
FROM 学生作业表 | |
WHERE 课程号='K001' OR 课程号='M001' | |
) |

# 2. 使用数据操纵完成以下任务(每一个任务都要给出 SQL 语句,并且列出查询结果)。
# ① 在学生表中添加一条学生记录,其中,学号为 0593,姓名为张乐,性别为男,专业班级为电子 05,出生日期为 1991-01-01。
insert into 学生表(学号,姓名,性别,专业班级,出生日期) values (0593,'张乐','男','电子05','1991-01-01'); |

# ② 将所有课程的学分数变为原来的两倍。
update 课程表 SET 学分数=学分数*2; |
# ③ 删除张乐的信息。
delete from 学生表 where 姓名='张乐'; |
