《数据库原理与应用》课程实验报告 数据库的简单查询和连接查询

《数据库原理与应用》课程实验报告 数据库的简单查询和连接查询

一、实验目的

1.掌握简单查询、连接查询的语法格式,熟练掌握数据查询中的分组、排序,以及外连接、自连接等。
2.掌握SQL Server Management Studio的使用方法,并能够根据出错警示,熟练修正查询语句。

二、实验过程及分析

1.实验内容
1.简单查询操作。包括选择条件表达,简单表达式输出、别名应用、模糊查询、数据排序、数据分组等。
2.连接查询操作。包括等值连接、自然连接、求笛卡儿积、自连接、外连接。
2.实验过程
实验一:
建表插入数据
学生选课数据库中表结构如下:
学生(学号,姓名,年龄,性别,所在系);
课程(课程号,课程名,学分,先行课);
选课(学号,课程号,成绩);
在学生选课数据库中实现下面的数据查询操作。

    --创建学生表
create table student
(
  s_num  int PRIMARYKEY,
  s_name varchar(20)not null,
  s_age int check(s_age between 10 and 35),
  s_sex varchar(10) check(s_sex in('男', '女')),
  s_unit varchar(20)
)
drop table student 
select * from student
--插入数据
insert into student values (1815001,'张三',18,'男','数学系'),
                          (1815002,'李白',30,'女','计算机系'),
						  (1815003,'后裔',11,'男','计算机系'),
						  (1815004,'翠花',25,'女','数学系'),
						  (1815005,'狗蛋',21,'男','机械系');
						  
--创建课程表
create table course
(
c_num varchar(20) PRIMARYKEY,
c_name varchar(20) not null,
c_credit  int check(c_credit in (1,2,3,4,5,6)),
front varchar(20) 
)
--插入数据
drop table course
insert into  course values ('C1','C语言',2,' '),
							('C2','程序设计电路',2,'c1'),
							('C3','数字电路',3,'C1'),
							('C4','计算机组成',3,'C3'),
							('C5','计算机网络',4,'C4'),
							('C6','操作系统',3,'C5');

select * from course
--创建选课表
create table selectCourse
(
 s_num  int,
 c_num varchar(20),
 score numeric(3,1)   ,
 primary key (s_num,c_num),
 foreign key ( s_num) references student(s_num),
 foreign key (c_num) references course(c_num),
)
drop table selectCourse
--插入数据

insert into  selectCourse(s_num, c_num, score ) 
                           values(1815001,'C1',70),
                                 (1815001,'C2',80),
								 (1815001,'C3',88),
								 (1815001,'C4',78),
								 (1815001,'C5',88),
								 (1815001,'C6',98),
								 (1815005,'C3',88),
								 (1815002,'C1',80),
								 (1815003,'C1',88),
								 (1815004,'C1',98)
insert into  selectCourse(s_num, c_num ) 
                                 values(1815005,'C1')

数据查询
--1)求数学系学生的学号和姓名
select  s_num as '学号' ,s_name as '姓名' from  student where s_unit='数学系';

--2)求选修了课程的学生学号
select distinct s_num as '学生学号' from selectCourse where  c_num is not null

--3)求选修C1课程的学生学号和成绩,结果按成绩降序排列,如成绩同按学号升序排列
select s_num as '学号'  ,  score as '成绩' from  selectCourse where   c_num ='C1' and score  is not null order by  score

--4)求选修课程C1成绩在80~90之间的学生学号和成绩,并将成绩乘以0.8输出
select s_num as '学号', score*0.8  as '成绩' from  selectCourse  where   c_num ='C1' and ( score between 80 and 90) order by  score

--5)求数学或计算机系姓张的学生的信息
select * from  student where s_name like '张%' and 
                s_num in (select s_num from  student where  s_unit='计算机系' or s_unit ='数学系')

--6)查询每个学生的选课门数,并输出选修5门以上的学生学号。
select   s_num as '学号'    from  selectCourse   group by s_num  having  count(c_num)>5;

--7)求缺少了成绩的学生的学号和课程号
select   s_num as '学号' ,c_num as '课程号'  from  selectCourse where  score is null

--8)查询各个系的学生人数
select  s_unit as '系'  ,count(s_unit) as '人数 ' from student group by s_unit

--9)求学生的学号、姓名、选修的课程名及成绩
select  student.s_num as '学号'  ,student.s_name  as '姓名' ,
        selectCourse.c_num as '课程名',selectCourse.score as '成绩' 
		from  student join  selectCourse  on student.s_num=  selectCourse.s_num 
                                        
--10)求选修课程C1成绩在80~90之间的学生学号、姓名及成绩
select  student.s_num as '学号'  ,student.s_name  as '姓名' ,
        selectCourse.score as 'C1成绩' 
		from  student join  selectCourse  on student.s_num=  selectCourse.s_num 
		where (selectCourse.score between 80 and 90)
                                        
--11)求选修了学分是3的课程的学生学号。
select  student.s_num as '学号' 
      from  selectCourse 
	  join  student   on student.s_num=  selectCourse.s_num
	  join  course on course.c_num=selectCourse.c_num
	  where  course.c_credit=3

--12)查询每一门课的间接先行课(即先行课的先行课)
SELECT  k1.c_num as '课程号',k1.c_name as '课程名',k2.front  '间接先行课'
FROM  Course as k1 ,
 Course as k2
where k1.front= k2.c_num
SELECT  k2.front
FROM   Course k2

提高实验:
建表插入数据
(1)建立职工部门数据库,数据库涉及有职工表、部门表,并向表中输入数据。
职工表
职工号 姓名 性别 年龄 所在部门
1010 李勇 男 20 11
1011 刘晨 女 19 12
1012 王敏 女 22 12
1014 张立 男 21 13

部门表
部门号 部门名称 电话
11 生产科 566
12 计划科 578
13 一车间 467
14 科研所

      --创建职工部门
create table employee
(
  职工号 int PRIMARYKEY,
  姓名 varchar(20)not null,
  性别 varchar(10) check(性别 in('男', '女')),
  年龄 int check(年龄 between 10 and 35), 
  所在部门 varchar(20)
)
select * from employee
--插入相关数据
insert into  employee values(1010,'李勇','男',20,11),
                             (1011,'刘晨','女',19,12),
							 (1012,'王敏','女',22,12),
							 (1014,'张立','男',21,13)

--创建部门表
create table department
(
  部门号 varchar(20),
  部门名称 varchar(20)not null,
  电话 varchar(11) 
)
--插入相关数据
insert  into  department   values(11,'生产科',566)
insert  into  department   values(12,'计划科',578)
insert  into  department   values(13,'一车间',467)
insert  into  department (部门号,部门名称)  values(14,'科研所')
数据查询
--1)查询每个职工的信息,及所对应的部门电话。
select 职工号,姓名,性别,年龄,所在部门,电话 from  employee K1 join  department as k2 on  k1.所在部门=k2.部门号

--2)查询每个部门的名称、电话,及部门职工的姓名、年龄。
select 所在部门,电话,姓名,年龄 from  employee join  department  on  employee.所在部门=department.部门号

--3)针对职工表查询每个部门的职工人数。
select 所在部门 , count(所在部门) as  职工人数  from employee  group by 所在部门
 
--4)查询年龄小于20的职工号、所在部门
select 职工号,所在部门  from  employee where  年龄<20

--5)查询年龄小于20的职工号、所在部门名称
select 职工号,部门名称 from  employee join  department  on  employee.所在部门=department.部门号 where  年龄<20

3.实验结果

实验一:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提高实验:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.实验分析

①分析实验结果;
通过sql语句得到了的结果
②说明实验过程中遇到的问题及怎么解决。
查询每一门课的间接先行课(即先行课的先行课)。我不能顺利的进行查询
解决
这个操作属于表与自身进行连接,那么zd我们需要将课程表取两个别名去区分它们。

```sql
SELECT  k1.c_num as '课程号',k1.c_name as '课程名',k2.front  '间接先行课'
FROM  Course as k1 ,
 Course as k2
where k1.front= k2.c_num
SELECT  k2.front
FROM   Course k2




发布了10 篇原创文章 · 获赞 12 · 访问量 1853

猜你喜欢

转载自blog.csdn.net/qq_44236958/article/details/105606300